Hello,

I also dont have a github account (anymore), also for reasons.

If you contribution is small enough (like a few lines) you can just show it on the mailing list and people with a github account may pick it up when they have time.

Or send a git patch that would be easy to apply for people with github accounts.

Thats what I plan to do for my next potential contribution, at least.

Sebastien


On 23/03/2025 11:58, kr....@kerogit.eu wrote:
Hello,

I decided to try NuttX out - just as a hobbyist for learning experience. I am currently attempting to create port for DA/DB family of AVR architecture with support for tickless OS. My initial implementation worked sort-of well: I created a simple application with a LED blinking in 1/2 second interval using usleep() and tried it with USEC_PER_TICK set to 62500. There was some imprecision in the frequency but that is to be expected. However, when I tried to tweak USEC_PER_TICK, the results became weird. NuttX requested (via up_alarm_start) to set the alarm in nonsensical intervals - 29 seconds, a day... or a few microseconds.

After some debugging I found out that up_alarm_tick_cancel in sched/sched/sched_timerexpiration.c reads an incorrect ticks value from clock_time2ticks macro. It received 0 seconds, 0x77358ns as a parameter, which - rounded up - should yield 1 tick with USEC_PER_TICK set to 1000. Instead, it was returning 29 ticks. I tried to make a simple standalone reimplementation of clock_time2ticks and NSEC2TICK from include/nuttx/clock.h to see what exactly is going on and it worked well, returned correct result of 1. I then tried to compare the generated assembly and found out the difference: while the reimplementation was calculating (nsec + 999999) / 1000000, NuttX was counting (nsec + 16959) / 16960. The former is 0xf423f and 0xf4240 in hex, the latter is 0x423f and 0x4240 which led me to the idea that the compiler truncates something to 16bit - that something turned to be NSEC_PER_TICK.

I then changed NSEC_PER_USEC to 1000L, the calculation in clock_time2ticks corrected itself and the timer seems to work like a charm. (I can't explain why the reimplementation worked corectly though, it was setting NSEC_PER_USEC to 1000 without the "L" as well. Yet in this case, the compiler did the right thing.)

In case I ever decided that my code is actually worth contributing(*), is this change (and to be safe, same thing for USEC_PER_MSEC and MSEC_PER_SEC) acceptable? I have to admit that I have little clue what it can do (ie. break) for other architectures.

Thanks for any input

(*) which may be problematic in itself - as far as I found on the NuttX website, PR on GitHub is the only listed way contributions are accepted. I can provide publicly accessible Git repo but I don't have a GitHub account and am not willing to make one for a few reasons.

Reply via email to