The scheduler is used for transferring execution from the interrupt context to the main context.
Requirements:
Logic in main context:
- Define an event handler for each type of event expected.
- Initialize the scheduler by calling the APP_SCHED_INIT() macro before entering the application main loop.
- Call app_sched_execute() from the main loop each time the application wakes up because of an event (typically when sd_app_evt_wait() returns).
Logic in interrupt context:
- In the interrupt handler, call app_sched_event_put() with the appropriate data and event handler. This will insert an event into the scheduler's queue. The app_sched_execute() function will pull this event and call its handler in the main context.
For an example usage of the scheduler, please see the implementations of ble_sdk_app_hids_mouse and ble_sdk_app_hids_keyboard.
The high level design of the scheduler
Applications using the Scheduler
Sequence diagrams illustrating the flow of events for various scenarios in the example applications when using the Scheduler.
Figure 1: Receiving an event from the ble stack causing a service event
Figure 2: The battery timer expires
Applications not using the Scheduler
Sequence diagrams illustrating the flow of events for various scenarios in the example applications when not using the Scheduler.
Figure 3: Receiving an event from the ble stack causing a service event
Figure 4: The battery timer expires