Sky mote (MSP430 F1611 + CC2420) を使用して、100Hz のサンプリング周波数で I2C センサーからデータを読み取り、そのデータをシリアル ポート (USB) に書き込もうとしています。いくつかのテストを試したところ、合計出力データのサンプリング周波数が 78Hz であることがわかりました。rtimer を使用してサンプリング コードと印刷コードのプロファイリングを行ったところ、印刷機能によってプロセス全体が遅くなることがわかりました。プロファイリング出力の一部を次に示します。
start 50628
15490,f074,20,3b8c,ffab,49,ffcf,fb70
end 51189
start 51293
15491,f0a8,fff4,3ba4,ffc6,24,ffd8,fb90
end 51880
start 51984
15492,f094,20,3b30,ffa7,5b,fff3,fb70
end 52544
start 52647
15493,f118,bc,3ce0,ffab,70,fffc,fb90
end 53207
start 53311
15494,f030,1b0,3b44,ffa9,1f7,1f,fb80
end 53871
rtimer には、1 秒間に 4098*8 ティックがあります。ここでは、印刷に約 560 ティック (17ms) かかることがはっきりとわかります。サンプリング周波数が 100Hz の場合、印刷関数は 10ms (327 ティック) 以内に完了する必要があります。
私が使用している組み込みシステムは Contiki OS で、ボー レートは 115200 (最大ボー レート) です。センサー サンプルには、112 バイトの signed int が含まれています。
これが私のコードです:
mpu_data_union samples;
int m=mpu_sample_all(&samples);
printf("start %u\n",RTIMER_NOW());
printf("%lu,%x,%x,%x,%x,%x,%x,%x\n",
counterxx,samples.data.accel_x,samples.data.accel_y,
samples.data.accel_z,samples.data.gyro_x,
samples.data.gyro_y,samples.data.gyro_z,
samples.data.temperature);
printf("end %u\n",RTIMER_NOW());
printf や UART 全般の最適化に関する以前の経験を持つ人が、いくつかの提案を提供してくれることを願っています。
ありがとう!