Невозможно связаться с gettimeofday на встроенной системе, предложения по истекшему времени? - PullRequest
3 голосов
/ 10 августа 2011

Я пытаюсь использовать 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 ]

3 голосов
/ 08 июля 2014

Что вам нужно сделать, это создать свою собственную функцию _gettimeofday (), чтобы заставить ее правильно ссылаться.Эта функция может использовать соответствующий код, чтобы получить время для вашего процессора, при условии, что у вас есть свободный системный таймер.

2 голосов
/ 10 августа 2011

Используйте один из таймеров в чипе ...

2 голосов
/ 10 августа 2011

Что я обычно делаю, так это чтобы таймер работал с частотой 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.

0 голосов
/ 05 августа 2012

Похоже, вы используете 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)

0 голосов
/ 10 августа 2011

Я делал это раньше в одном из моих приложений.Просто используйте:

while(1)
{
...
}
0 голосов
/ 10 августа 2011

Вы можете использовать таймер производительности, как показано в принятом ответе на этот вопрос ...

Как измерить время выполнения программы в процессоре ARM Cortex-A8?

...