ARM上怎么用 gettimeofday函数

    xiaoxiao2021-03-26  28

    0 down vote favorite

    I am trying to use gettimeofday on an embedded ARM device, however it seems as though I am unable to use it:

    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

    I am assuming I cannot use gettimeofday() ? Does anyone have any suggestions for being able to tell elapsed time? (e.g., 100ms)

    c  embedded  arm  gettimeofday share improve this question asked  Aug 10 '11 at 0:49 gnychis 1,553 5 40 77   1  This error seems to indicate that your standard library installation is badly broken... –  R..  Aug 10 '11 at 1:53 add a comment

    6 Answers

    active oldest votes up vote 2 down vote

    What I usually do, is to have a timer running at 1khz, so it will generate an interrupt every millisecond, in the interrupt handler I increment a global var by one, say ms_ticks then do something like:

    volatile unsigned int ms_ticks = 0; void timer_isr() { //every ms ms_ticks++; } void delay(int ms) { ms += ms_ticks; while (ms > ms_ticks) ; }

    It is also possible to use this as a timestamp, so let's say I want to do something every 500ms:

    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 }

    Another alternative, since ARMs are 32bits and your timer will probably be a 32bits one, is to instead of generating a 1khz interrupt, you leave it free running and simply use the counter as your ms_ticks.

    share improve this answer answered  Aug 10 '11 at 1:01 Vinicius Kamakura 6,176 15 35     thanks for your answer! do you have any good documentation on how to set up the timer and interrupt handler? is this easy to do on the system? –  gnychis  Aug 10 '11 at 1:19 add a comment up vote 2 down vote

    Use one of the timers in the chip...

    share improve this answer answered  Aug 10 '11 at 3:26 old_timer 38.4k 5 48 101   add a comment up vote 1 down vote

    What you need to do is create your own _gettimeofday() function to get it to link properly. This function could use the appropriate code to get the time for your processor, assuming you have a free-running system timer available.

    #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() share improve this answer answered  Jul 8 '14 at 18:43 JonS 149 11     Any idea what your_system_time_function_here might be? –  jjxtra  May 19 '16 at 20:17   It entirely depends on your hardware and how you access the system timer, if you even have one available. –  JonS  May 26 '16 at 1:57 add a comment up vote 0 down vote

    You could use the performance timer as shown in the accepted answer of this question...

    How to measure program execution time in ARM Cortex-A8 processor?

    share improve this answer answered  Aug 10 '11 at 0:59 Skyler Saleh 3,191 14 33   add a comment up vote 0 down vote

    It looks like you are using the Econotag which is based on the MC13224v from Freescale.

    The MACA_CLK register provides a very good timebase (assuming the radio is running). You can also use the the RTC with CRM->RTC_COUNT. The RTC may or may not be very good depending on if you have an external 32kHz crystal or not (the econotag does NOT).

    e.g. with MACA_CLK:

    uint32_t t; t = *MACA_CLK; while (*MACA_CLK - t > SOMETIME);

    See also the timer examples in libmc1322x:

    http://git.devl.org/?p=malvira/libmc1322x.git;a=blob;f=tests/tmr.c

    Alternate methods are to use etimers or rtimers in Contiki (which has good support for the Econotag). (see http://www.sics.se/contiki/wiki/index.php/Timers )

    share improve this answer edited Aug 5 '12 at 15:17 Spudley 121k 29 163 248 answered  Aug 5 '12 at 2:32 Mariano Alvira 206 1 3   add a comment up vote -1 down vote

    I've done this before in one of my applications. Just use :

    while(1) { ... } 0 down vote favorite

    I am trying to use gettimeofday on an embedded ARM device, however it seems as though I am unable to use it:

    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

    I am assuming I cannot use gettimeofday() ? Does anyone have any suggestions for being able to tell elapsed time? (e.g., 100ms)

    c  embedded  arm  gettimeofday share improve this question asked  Aug 10 '11 at 0:49 gnychis 1,553 5 40 77   1  This error seems to indicate that your standard library installation is badly broken... –  R..  Aug 10 '11 at 1:53 add a comment

    6 Answers

    active oldest votes up vote 2 down vote

    What I usually do, is to have a timer running at 1khz, so it will generate an interrupt every millisecond, in the interrupt handler I increment a global var by one, say ms_ticks then do something like:

    volatile unsigned int ms_ticks = 0; void timer_isr() { //every ms ms_ticks++; } void delay(int ms) { ms += ms_ticks; while (ms > ms_ticks) ; }

    It is also possible to use this as a timestamp, so let's say I want to do something every 500ms:

    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 }

    Another alternative, since ARMs are 32bits and your timer will probably be a 32bits one, is to instead of generating a 1khz interrupt, you leave it free running and simply use the counter as your ms_ticks.

    share improve this answer answered  Aug 10 '11 at 1:01 Vinicius Kamakura 6,176 15 35       thanks for your answer! do you have any good documentation on how to set up the timer and interrupt handler? is this easy to do on the system? –  gnychis  Aug 10 '11 at 1:19 add a comment up vote 2 down vote

    Use one of the timers in the chip...

    share improve this answer answered  Aug 10 '11 at 3:26 old_timer 38.4k 5 48 101   add a comment up vote 1 down vote

    What you need to do is create your own _gettimeofday() function to get it to link properly. This function could use the appropriate code to get the time for your processor, assuming you have a free-running system timer available.

    #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() share improve this answer answered  Jul 8 '14 at 18:43 JonS 149 11       Any idea what your_system_time_function_here might be? –  jjxtra  May 19 '16 at 20:17     It entirely depends on your hardware and how you access the system timer, if you even have one available. –  JonS  May 26 '16 at 1:57 add a comment up vote 0 down vote

    You could use the performance timer as shown in the accepted answer of this question...

    How to measure program execution time in ARM Cortex-A8 processor?

    share improve this answer answered  Aug 10 '11 at 0:59 Skyler Saleh 3,191 14 33   add a comment up vote 0 down vote

    It looks like you are using the Econotag which is based on the MC13224v from Freescale.

    The MACA_CLK register provides a very good timebase (assuming the radio is running). You can also use the the RTC with CRM->RTC_COUNT. The RTC may or may not be very good depending on if you have an external 32kHz crystal or not (the econotag does NOT).

    e.g. with MACA_CLK:

    uint32_t t; t = *MACA_CLK; while (*MACA_CLK - t > SOMETIME);

    See also the timer examples in libmc1322x:

    http://git.devl.org/?p=malvira/libmc1322x.git;a=blob;f=tests/tmr.c

    Alternate methods are to use etimers or rtimers in Contiki (which has good support for the Econotag). (see http://www.sics.se/contiki/wiki/index.php/Timers )

    share improve this answer edited Aug 5 '12 at 15:17 Spudley 121k 29 163 248 answered  Aug 5 '12 at 2:32 Mariano Alvira 206 1 3   add a comment up vote -1 down vote

    I've done this before in one of my applications. Just use :

    while(1) { ... }
    转载请注明原文地址: https://ju.6miu.com/read-661856.html

    最新回复(0)