The scheduler is used for transferring execution from the interrupt context to the main context.
More...
See 'Sequence Diagrams' for sequence diagrams illustrating the flow of events when using the Scheduler.
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_event_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 HID Mouse Application and HID Keyboard Application.
The high level design of the scheduler
#define APP_SCHED_EVENT_HEADER_SIZE 8 |
- Parameters
-
[in] | EVENT_SIZE | Maximum size of events to be passed through the scheduler. |
[in] | QUEUE_SIZE | Number of entries in scheduler queue (i.e. the maximum number of events that can be scheduled for execution). |
- Returns
- Required scheduler buffer size (in bytes).
#define APP_SCHED_INIT |
( |
|
EVENT_SIZE, |
|
|
|
QUEUE_SIZE |
|
) |
| |
Value:do \
{ \
sizeof(uint32_t))]; \
uint32_t ERR_CODE =
app_sched_init((EVENT_SIZE), (QUEUE_SIZE), APP_SCHED_BUF); \
APP_ERROR_CHECK(ERR_CODE); \
} while (0)
It will also handle dimensioning and allocation of the memory buffer required by the scheduler, making sure the buffer is correctly aligned.
- Parameters
-
[in] | EVENT_SIZE | Maximum size of events to be passed through the scheduler. |
[in] | QUEUE_SIZE | Number of entries in scheduler queue (i.e. the maximum number of events that can be scheduled for execution). |
- Note
- Since this macro allocates a buffer, it must only be called once (it is OK to call it several times as long as it is from the same location, e.g. to do a reinitialization).
uint32_t app_sched_init |
( |
uint16_t |
max_event_size, |
|
|
uint16_t |
queue_size, |
|
|
void * |
p_evt_buffer |
|
) |
| |
It must be called before entering the main loop.
- Parameters
-
[in] | max_event_size | Maximum size of events to be passed through the scheduler. |
[in] | queue_size | Number of entries in scheduler queue (i.e. the maximum number of events that can be scheduled for execution). |
[in] | p_event_buffer | Pointer to memory buffer for holding the scheduler queue. It must be dimensioned using the APP_SCHED_BUFFER_SIZE() macro. The buffer must be aligned to a 4 byte boundary. |
- Note
- Normally initialization should be done using the APP_SCHED_INIT() macro, as that will both allocate the scheduler buffer, and also align the buffer correctly.
- Return values
-
NRF_SUCCESS | Successful initialization. |
NRF_ERROR_INVALID_PARAM | Invalid parameter (buffer not aligned to a 4 byte boundary). |
void app_sched_execute |
( |
void |
| ) |
|
This function must be called from within the main loop. It will execute all events scheduled since the last time it was called.
Puts an event into the event queue.
- Parameters
-
[in] | p_event_data | Pointer to event data to be scheduled. |
[in] | p_event_size | Size of event data to be scheduled. |
[in] | handler | Event handler to receive the event. |
- Returns
- NRF_SUCCESS on success, otherwise an error code.