[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