1

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 全般の最適化に関する以前の経験を持つ人が、いくつかの提案を提供してくれることを願っています。

ありがとう!

4

3 に答える 3

0

遅いですがprintf、シリアルはさらに遅いです(はるかに)。デフォルトでは、Contiki は MSP430 F1xx チップにブロッキング シリアルを使用します ( 1を参照)。UART0_CONF_TX_WITH_INTERRUPT (に追加)-DUART0_CONF_TX_WITH_INTERRUPTを設定CFLAGSすることで、ノンブロッキング バッファ付きシリアル (デフォルトで 128 バイト) に切り替えることができます。

于 2014-06-13T12:39:58.790 に答える
0

C ライブラリprintfは、MSP430 16 ビット マイクロコントローラ用に設計されていません。代わりに、コンソールへの印刷の問題に対する汎用ソリューションを意図していました。

より効率的なソリューションが必要な場合は、UART を書き出す独自のカスタム印刷メソッドを実装する必要があります。

自由に利用できるいくつかのソリューションを次に示します。

  1. http://43oh.com/2011/10/tiny-printf-for-the-space-constrained-msp430/

  2. https://gist.github.com/nicholasjconn/2896369 ( http://www.msp430launchpad.com/2012/06/using-printf.html )

于 2014-06-13T15:26:00.160 に答える