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 一秒钟有 4098*8 个滴答声。在这里我们可以清楚地看到打印大约需要 560 个滴答声(17 毫秒)。如果采样频率为 100Hz,则打印功能应在 10ms(327 个滴答声)内完成。

我使用的嵌入式系统是Contiki OS,波特率为115200(最大波特率)。传感器样本包含 112 字节的有符号整数。

这是我的代码:

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

1

我有一个类似的问题,printf 函数对于我正在使用的 MSP 变体来说太大了,所以我不得不编写自己的 printf 函数版本,因为我不需要与格式字符串相关的所有包袱转换器。我写了一组小函数,以所需的格式输出一个值,并将字符输出直接发送到 usart。

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);

变成

Send_Long_Decimal( counterxx ) ; 
Send_Hex( samples.data.accel_x ) ; 
Send_Hex( samples.data.accel_y ) ;
Send_Hex( samples.data.accel_z ) ;
Send_Hex( samples.data.gyro_x)  ;
Send_Hex( samples.data.gyro_y ) ;
Send_Hex( samples.data.gyro_z ) ;
Send_Hex( samples.data.temperature ) ;
Send_Newline() ;

Morty的回答建议使用非阻塞、中断驱动的串行端口实现。这是值得鼓励的,这样串行传输所花费的时间不会超出您的可用处理时间。

查看日志中发送的数据,第一条记录的长度似乎约为 64 个字符。以 115kbaud 发送 100 个这些将需要 0.5 秒多一点。然后您必须从 I2C 接口读取数据并在剩余的不到 0.5 秒内执行一些数据处理/存储。

于 2014-06-13T12:06:39.913 回答
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 回答