[En-Nut-Discussion] Timing issues on Ethernut 1.3 (AVR)
Harald Kipp
harald.kipp at egnite.de
Thu Nov 12 10:10:44 CET 2009
Hi Daniel,
Daniel wrote:
> Issue 1, NutGetMillis()
> =======================
I tried this one:
#include <dev/board.h>
#include <sys/thread.h>
#include <sys/timer.h>
#include <stdio.h>
#include <io.h>
THREAD(Thread, arg)
{
for (;;) {
uint32_t start = NutGetMillis();
uint32_t end = start + 500;
uint16_t i = 0;
printf("Start Millis %p: %lu ms\n", arg, NutGetMillis());
do {
NutThreadYield();
i++;
if (i > 500) {
printf("Current Millis %p: %lu ms\n", arg, NutGetMillis());
i = 0;
}
} while(NutGetMillis() < end);
printf(" End Millis %p: %lu ms\n", arg, NutGetMillis());
}
}
int main(void)
{
uint32_t baud = 115200;
int i;
NutRegisterDevice(&DEV_DEBUG, 0, 0);
freopen(DEV_DEBUG_NAME, "w", stdout);
_ioctl(_fileno(stdout), UART_SETSPEED, &baud);
puts("\nTest Millis");
for (i = 1; i <= 10; i++) {
NutThreadCreate("th", Thread, (void *)i, 512);
}
for (;;) {
NutSleep(1000);
}
return 0;
}
It works as expected:
Test Millis
Start Millis 0x1: 5 ms
Start Millis 0x2: 7 ms
Start Millis 0x3: 9 ms
Start Millis 0x4: 11 ms
Start Millis 0x5: 13 ms
Start Millis 0x6: 15 ms
Start Millis 0x7: 17 ms
Start Millis 0x8: 20 ms
Start Millis 0x9: 22 ms
Start Millis 0xa: 24 ms
Current Millis 0x1: 109 ms
Current Millis 0x2: 111 ms
Current Millis 0x3: 114 ms
Current Millis 0x4: 116 ms
Current Millis 0x5: 119 ms
Current Millis 0x6: 121 ms
Current Millis 0x7: 124 ms
Current Millis 0x8: 126 ms
Current Millis 0x9: 129 ms
Current Millis 0xa: 131 ms
Current Millis 0x1: 218 ms
Current Millis 0x2: 220 ms
...
End Millis 0x1: 505 ms
Start Millis 0x1: 507 ms
End Millis 0x2: 509 ms
Start Millis 0x2: 511 ms
End Millis 0x3: 514 ms
Start Millis 0x3: 516 ms
End Millis 0x4: 518 ms
Start Millis 0x4: 520 ms
End Millis 0x5: 523 ms
Start Millis 0x5: 525 ms
End Millis 0x6: 527 ms
Start Millis 0x6: 529 ms
End Millis 0x7: 532 ms
Start Millis 0x7: 534 ms
End Millis 0x8: 536 ms
Start Millis 0x8: 539 ms
End Millis 0x9: 541 ms
Start Millis 0x9: 543 ms
End Millis 0xa: 545 ms
Start Millis 0xa: 548 ms
...
May be in your application you should check entry and return time of
NutThreadYield(). Possibly another thread occupies the CPU for too long
time.
Harald
PS: I tested on Ethernut 3 (ARM), but AVR should work similar.
More information about the En-Nut-Discussion
mailing list