C 无法链接到嵌入式系统上的gettimeofday,运行时间建议?

C 无法链接到嵌入式系统上的gettimeofday,运行时间建议?,c,embedded,arm,gettimeofday,C,Embedded,Arm,Gettimeofday,我试图在嵌入式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-econo

我试图在嵌入式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()?有没有人对能够说出经过的时间有什么建议?(例如,100ms)

我通常做的是让计时器以1khz的频率运行,因此它将每毫秒生成一个中断,在中断处理程序中,我将全局变量增加一个,比如说
ms_ticks
,然后执行如下操作:

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
}

另一种选择是,由于ARMs是32位的,而您的计时器可能是32位的,因此您不需要生成1khz中断,而是让它自由运行,只需使用计数器作为您的
ms_滴答声

我以前在我的一个应用程序中已经这样做过。只需使用:

while(1)
{
...
}

使用芯片中的一个定时器…

看起来您使用的是基于飞思卡尔MC13224v的Ecootag

MACA_CLK寄存器提供了非常好的时基(假设收音机正在运行)。您还可以将RTC与CRM->RTC\u计数一起使用。RTC可能很好,也可能不是很好,这取决于您是否有外部32kHz晶体(Ecootag没有)

e、 g.与马卡钟:

uint32_t t;

t = *MACA_CLK;

while (*MACA_CLK - t > SOMETIME);
另请参见libmc1322x中的计时器示例:


替代方法是在Contiki中使用etimers或rtimers(它对Ecootag有很好的支持)。(请参阅)

您需要做的是创建自己的_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()
#包括
int _gettimeofday(结构timeval*tv,void*tzvp)
{
uint64\u t=\uuu您的系统\u时间\u函数\uu此处\uuuu()//以纳秒为单位获取正常运行时间
电视->电视秒=t/100000000;//转换为秒
tv->tv_usec=(t%100000000)/1000;//获取剩余微秒
返回0;//对于错误,返回非零
}//结束_gettimeofday()

谢谢您的回答!你有关于如何设置定时器和中断处理程序的好文档吗?在系统上这么做容易吗?这个错误似乎表明您的标准库安装严重损坏…您知道这里的系统时间功能是什么吗?这完全取决于您的硬件以及您访问系统计时器的方式(如果您有可用的话)。这应该在哪里定义?我在需要这个函数的同一个文件中添加了它,但它没有链接。实际上,我只需要添加
extern“C”
,以防对任何人都有帮助。