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

Jix Electronics jix.electronics at mbnet.fi
Tue Jul 25 07:50:51 CEST 2006


Thanks Andras,

ok it is not just SAM7X specifig bug, workaround works.

Jix


Albert Andras wrote:
> Hi,
>
> 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)
> {
>    NUTTIMERINFO *tn;
>
>    tn = NutHeapAlloc(sizeof(NUTTIMERINFO));
>    if (tn) {
>        tn->tn_ticks_left = ticks+NutGetTickCount()-nut_ticks_resume;
>
>
>
> Andras
>
> ----- Original Message ----- From: "Jix Electronics"
<jix.electronics at mbnet.fi>
> To: <en-nut-discussion at egnite.de>
> Sent: Saturday, July 22, 2006 2:33 PM
> Subject: [En-Nut-Discussion] AT91SAM7X-EK, UART messing up the NutSleep
>
>
>> Hi,
>>
>> I run to problems with uart, seems that devices DEV_UART and DEV_DEBUG
>> does not
>> work properly, tested with version 4.1.9-rc5.
>>
>> When example code (below) is compiled with DEV_UART device. The first
>> NutSleep
>> call works correctly before registering the device. Second NutSleep waits
>> just
>> zero ticks, after that seems to work correctly.
>>
>> example code print output:
>>
>> (10)start=0, stop=10  --> 10
>> (10)start=41, stop=41 --> 0
>> (5)start=41, stop=46  --> 5
>> (1)start=46, stop=47  --> 1
>>
>>
>> When example code is compiled with DEV_DEBUG device, the first NutSleep
works
>> correctly. All NutSleep calls after registering the device waits less than
>> asked for.
>>
>> example code print output:
>>
>> (10)start=0, stop=10  --> 10
>> (10)start=12, stop=20 --> 8
>> (5)start=22, stop=25  --> 3
>> (1)start=27, stop=27  --> 0
>>
>>
>> Modified threads example code
>> -----------------------------
>> int main(void)
>> {
>>    u_long baud = 115200;
>>    u_long start;
>>    u_long stop;
>>
>>    start = NutGetTickCount();
>>    NutSleep(10);
>>    stop = NutGetTickCount();
>>
>>    /*
>>     * Register the UART device, open it, assign stdout to it and set
>>     * the baudrate.
>>     */
>>    NutRegisterDevice(&DEV_DEBUG, 0, 0);
>>    freopen(DEV_DEBUG_NAME, "w", stdout);
>>    _ioctl(_fileno(stdout), UART_SETSPEED, &baud);
>>
>>    printf("\n(10)start=%lu, stop=%lu\t--> %lu", start, stop, stop-start);
>>
>>    start = NutGetTickCount();
>>    NutSleep(10);
>>    stop = NutGetTickCount();
>>    printf("\n(10)start=%lu, stop=%lu\t--> %lu", start, stop, stop-start);
>>
>>    start = NutGetTickCount();
>>    NutSleep(5);
>>    stop = NutGetTickCount();
>>    printf("\n(5)start=%lu, stop=%lu\t--> %lu", start, stop, stop-start);
>>
>>    start = NutGetTickCount();
>>    NutSleep(1);
>>    stop = NutGetTickCount();
>>    printf("\n(1)start=%lu, stop=%lu\t--> %lu", start, stop, stop-start);
>>
>>    /*
>>     * Start two additional threads. All threads are started with
>>     * priority 64.
>>     */
>>    NutThreadCreate("t1", Thread1, 0, 512);
>>    NutThreadCreate("t2", Thread2, 0, 512);
>>
>>    putchar('\n');
>>    putchar('\n');
>>    putchar('\r');
>>
>>    /*
>>     * Endless loop in main thread.
>>     */
>>    for (;;) {
>>        putchar('M');
>>        NutSleep(125);
>>    }
>> }
>>
>> Jix
>>
>> _______________________________________________
>> En-Nut-Discussion mailing list
>> En-Nut-Discussion at egnite.de
>> http://www.egnite.de/mailman/listinfo.cgi/en-nut-discussion
>>
>> !DSPAM:44c20d2b174418176186612!
>>
>>
>
> _______________________________________________
> En-Nut-Discussion mailing list
> En-Nut-Discussion at egnite.de
> http://www.egnite.de/mailman/listinfo.cgi/en-nut-discussion
>
>





More information about the En-Nut-Discussion mailing list