[En-Nut-Discussion] AT91SAM7X-EK, UART messing up the NutSleep

Harald Kipp harald.kipp at egnite.de
Tue Jul 25 09:19:37 CEST 2006


Looks like the correct fix to me too. Except, further down

         if (flags & TM_ONESHOT) {
             tn->tn_ticks = 0;
         } else {
             tn->tn_ticks = tn->tn_ticks_left;

needs to be replaced by

         if (flags & TM_ONESHOT) {
             tn->tn_ticks = 0;
         } else {
             tn->tn_ticks = ticks;

Otherwise periodic timer intervals would be too short.

Anyway, what puzzles me is the relatively large deviation in Jix'
test case.


At 16:22 24.07.2006 +0300, you wrote:
>As I can see the problem is that when you create a new timer for NutSleep()
>NutTimerProcessElapsed is not up to date with nut_ticks_resume holding a 
>value 3-4 timer tick smaller than actual time.
>That's why when doing first NutTimerProcessElapsed SleepTimer is 
>decremented with time elapsed from last processing, and not time from creation.
>Probably there are simple work around, but maybe the timer creating should 
>take care of the difference between nut_ticks_resume and NutGetTickCount().
>Should be nut_ticks_resume global for this?
>For example:
>NUTTIMERINFO * NutTimerCreate(u_long ticks, void (*callback) (HANDLE, void 
>*), void *arg, u_char flags)
>    tn = NutHeapAlloc(sizeof(NUTTIMERINFO));
>    if (tn) {
>        tn->tn_ticks_left = ticks+NutGetTickCount()-nut_ticks_resume;

More information about the En-Nut-Discussion mailing list