Hi, Sterling asked me to go into a bit of detail about the implementation so here goes:
When the idle task is running it is an indication that there isn't any useful work to be done at this time. Useful work can be created by: 1. an interrupt requesting service OR 2. when tasks scheduled in the future are now runnable. With respect to (1) there isn't any way for the OS to know when an interrupt might be activated. However with respect to (2) the OS certainly knows how long until a particular task awakens or how long until a callout handler needs to run. The APIs 'os_sched_wakeup_ticks()' and 'os_callout_wakeup_ticks()' return the number of ticks until the earliest task or callout become active. These APIs are used by 'os_idle_task()' to determine whether to transition from periodic to tickless mode. The OS will transition to tickless mode if there is no useful work for at least 100 msec (arbitrary). The idle task also imposes a limit on how long the cpu remains in tickless mode (currently set to 10 minutes, also arbitrary). The transition to/from tickless mode is done by the MCU-specific function 'os_tick_idle(idleticks)'. Typically it will set up a one-shot timer to wake up the CPU after a duration equivalent to 'idleticks' has elapsed. Finally, it enters a low power idle state using a CPU-specific mechanism. For e.g. ARM processors use the 'WFI' instruction for this purpose. Note that 'os_tick_idle()' is an advisory API: - it may return immediately without doing anything - it may not transition into tickless mode - it may transition to tickless mode but return before 'idleticks' have elapsed The only guarantee made by 'os_tick_idle()' is that it will sleep for no more than 'idleticks' and that the OS time is up-to-date when it returns. A related change is to define 'OS_TICKS_PER_SEC' in MCU-specific header file. This is needed because the capabilities of the underlying periodic timer dictate the appropriate timer frequency. best Neel On Thu, Apr 7, 2016 at 1:59 PM, Neel Natu <n...@nahannisys.com> wrote: > Hi, > > I just opened a pull request that implements tickless operation during > idle: > https://github.com/apache/incubator-mynewt-core/pull/34 > > The motivation is to reduce power consumption by putting the CPU to sleep > when the OS does not have any useful work to do. At the moment the power > saving only extends to the CPU but hopefully this provides a foundation to > add off-cpu peripherals and i/o going forward. > > If you have any comments let me know and we can iterate on the patch. > > best > Neel >