Невозможно связаться с gettimeofday на встроенной системе, предложения по истекшему времени?
Я пытаюсь использовать gettimeofday на встроенном устройстве ARM, но мне кажется, что я не могу его использовать:
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 мс)
6 ответов
Вам нужно создать собственную функцию _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 кГц, поэтому он будет генерировать прерывание каждую миллисекунду, в обработчике прерываний я увеличиваю глобальную переменную на единицу, скажем, 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
}
Другая альтернатива, поскольку ARM 32-битные и ваш таймер, вероятно, будет 32-битным, вместо того, чтобы генерировать прерывание 1 кГц, вы оставляете его свободным и просто используете счетчик в качестве вашего ms_ticks
,
Вы можете использовать таймер производительности, как показано в принятом ответе на этот вопрос...
Как измерить время выполнения программы в процессоре ARM Cortex-A8?
Похоже, вы используете Econotag, который основан на MC13224v от Freescale.
Регистр MACA_CLK обеспечивает очень хорошую временную базу (при условии, что радио работает). Вы также можете использовать RTC с CRM->RTC_COUNT. RTC может или не может быть очень хорошим в зависимости от того, есть ли у вас внешний кристалл 32 кГц или нет (эконотег НЕ).
например, с 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 (что хорошо поддерживает Econotag). (см. http://www.sics.se/contiki/wiki/index.php/Timers)
Я делал это раньше в одном из моих приложений. Просто используйте:
while(1)
{
...
}