我正在尝试在嵌入式ARM设备上使用gettimeofday,但似乎我无法使用它:
gnychis@ubuntu:~/Documents/coexisyst/econotag_firmware$ make
Building for board: redbee-econotag
CC obj_redbee-econotag/econotag_coexisyst_firmware.o
LINK (romvars) econotag_coexisyst_firmware_redbee-econotag.elf
/home/gnychis/Documents/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none- eabi/4.3.2/../../../../arm-none-eabi/lib/libc.a(lib_a-gettimeofdayr.o): In function `_gettimeofday_r':
gettimeofdayr.c:(.text+0x1c): undefined reference to `_gettimeofday'
/home/gnychis/Documents/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-eabi/4.3.2/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x18): undefined reference to `_sbrk'
collect2: ld returned 1 exit status
make[1]: *** [econotag_coexisyst_firmware_redbee-econotag.elf] Error 1
make: *** [mc1322x-default] Error 2
我假设我不能使用gettimeofday()?有没有人能说出经过的时间? (例如,100毫秒)
答案 0 :(得分:3)
您需要做的是创建自己的_gettimeofday()函数以使其正确链接。假设您有一个可以自由运行的系统计时器,此函数可以使用适当的代码来为您的处理器腾出时间。
#include <sys/time.h>
int _gettimeofday( struct timeval *tv, void *tzvp )
{
uint64_t t = __your_system_time_function_here__(); // get uptime in nanoseconds
tv->tv_sec = t / 1000000000; // convert to seconds
tv->tv_usec = ( t % 1000000000 ) / 1000; // get remaining microseconds
return 0; // return non-zero for error
} // end _gettimeofday()
答案 1 :(得分:2)
我通常做的是让一个定时器以1khz运行,所以它会每毫秒产生一个中断,在中断处理程序中我将一个全局变量加1,比如说ms_ticks
然后执行类似的操作:< / p>
volatile unsigned int ms_ticks = 0;
void timer_isr() { //every ms
ms_ticks++;
}
void delay(int ms) {
ms += ms_ticks;
while (ms > ms_ticks)
;
}
也可以将其用作时间戳,所以假设我想每隔500毫秒做一些事情:
last_action = ms_ticks;
while (1) { //app super loop
if (ms_ticks - last_action >= 500) {
last_action = ms_ticks;
//action code here
}
//rest of the code
}
另一种选择,因为ARM是32位且你的计时器可能是32位,而不是产生1khz中断,你可以让它自由运行,只需将计数器用作你的ms_ticks
。
答案 2 :(得分:2)
使用芯片中的一个定时器...
答案 3 :(得分:0)
您可以使用此问题的接受答案中显示的效果计时器......
How to measure program execution time in ARM Cortex-A8 processor?
答案 4 :(得分:0)
看起来您正在使用基于飞思卡尔MC13224v的Econotag。
MACA_CLK寄存器提供了非常好的时基(假设无线电正在运行)。您还可以将RTC与CRM-&gt; RTC_COUNT一起使用。 RTC可能会或可能不会很好,具体取决于您是否有外部32kHz晶振(econotag不是)。
e.g。与MACA_CLK:
uint32_t t;
t = *MACA_CLK;
while (*MACA_CLK - t > SOMETIME);
另请参阅libmc1322x中的计时器示例:
http://git.devl.org/?p=malvira/libmc1322x.git;a=blob;f=tests/tmr.c
替代方法是在Contiki中使用etimers或rtimers(它对Econotag有很好的支持)。 (见http://www.sics.se/contiki/wiki/index.php/Timers)
答案 5 :(得分:-1)
我之前在我的一个应用程序中完成了这个。只需使用:
while(1)
{
...
}