Hi, There might also be some kind of `offset` setter for the `now()` return value required, when considering that this new timer API should also be backended by RTC and/or RTT. This can come in handy to set the system time with time synchronization protocols like (S)NTP.
Cheers, Martine 2018-01-24 23:37 GMT+01:00 Kaspar Schleiser <kas...@schleiser.de>: > Hi all, > > I guess it is time to coordinate improving RIOT's timers - again. > > IMO xtimer is a dead end. It was designed with good intentions, but > unfortunately with not much real-world experience. It has also > (d)evolved into a complex and inflexible #ifdef-mess... > > Here's what I think is bad about it: > > - it allows only one type of base timer. On most platforms it tries to > use one 1MHz periph/timer. there are PR's and hacks to make it use e.g., > 32KHz RTTs or low power timers, but they didn't make it to master. The > API basically enforces 1us ticks, and mapping unchanged code bases to > very different timers is just too error prone. Also, the API would > require choosing at compile time, which is just too inflexible. > > - xtimer still doesn't support pm > > - by forcing 1us time, xtimer also requires 64bit time functions in > order to support > 2**32us (~71min) timeouts > > - xtimer is not ISR safe (xtimer_now() with <16bit base timers can break) > > - xtimer_t is quite large (20b on 32bit platforms) > > - xtimer's code has become very complex due to us/tick conversion and > the many #ifdefs that grew into it > > Here's what I propose: > > - re-write from scratch > > - in the API, allow "instances", e.g.: > > timer_now(instance); > timer_set(instance, timer_object); > > where an "instance" provides state and function pointers. > > - implement backends for periph/timer, rtt, rtc, lptim, systick, whatever > > - provide global instance aliases that every board provides, e.g., > "TIMER_USEC", "TIMER_MSEC", "TIMER_SEC". Map those to available timer > backends. Make it possible to enable / disable them as needed. > > - allow application specific timers to use the same API (e.g., allow > setting up a very high speed timer, which can be used alongside > "default" timers) > > - provide stackable "converters" > e.g., if there's no MSEC resolution low power timer that can be mapped > to "TIMER_MSEC", use "TIMER_USEC", but transparently convert all values > or if periph/timer doesn't support 32bit, create a "timer instance" > that transparently handles the extension. > Maybe stack those (e.g., if the rtt backend only supports 1024hz and > 16bit, stack a 1024 to 1000 converter on that, stack a 16bit to 32bit on > that and map the result to "TIMER_MSEC". > this would lead to re-usable components that can also be individually > tested (think unittests using a software-controlled fake timer). > > - provide either clear convention (e.g., TIMER_USEC stops when sleeping, > unless a timer using it is set, TIMER_MSEC keeps running in low power > mode) or controlling API (e.g., "timer_block_sleep(TIMER_USEC)" for > behaviour in sleep modes > > - try to slim down the timer struct (if possible) > > - drop the 64bit API (usec resolution over 64bit range is unrealistic on > real hardware. if, for larger ranges, TIMER_MSEC or TIMER_SEC can be > used, the range that 64bit provides is not needed anymore. thus all the > expensive 64bit arithmetic can be dropped) > > - consider new insights like the clock domain issue fixed by [1] > > - obviously, avoid long-standing xtimer bugs like the ISR unsafeness > > The main point I would like to push is the introduction of "timer > instances", which would basically make the timer interface object > oriented. This would allow having multiple implementations with > different tradeoffs without changing actual application code. > > What do you think? > > Kaspar > > [1] https://github.com/RIOT-OS/RIOT/pull/7053 > _______________________________________________ > devel mailing list > devel@riot-os.org > https://lists.riot-os.org/mailman/listinfo/devel >
_______________________________________________ devel mailing list devel@riot-os.org https://lists.riot-os.org/mailman/listinfo/devel