This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

FreeRTOS and app_scheduler

I'am currently porting an existing application that makes extensive use of the app_scheduler to FreeRTOS. To speed up the migration I have enabled the app_scheduler in the new project and created a scheduler thread that runs at lowest priority:

static void scheduler_thread(void * arg){

    UNUSED_PARAMETER(arg);

    NRF_LOG_INFO("Starting scheduler thread")

    while(1) {
        app_sched_execute();

        vTaskSuspend(NULL);
    }
}

I am using the vApplicationIdleHook to resume this scheduler thread.

Furthermore I have added scheduler support to app_timer_freertos.c:

static void app_timer_callback(TimerHandle_t xTimer)
{
    app_timer_info_t * pinfo = (app_timer_info_t*)(pvTimerGetTimerID(xTimer));
    ASSERT(pinfo->osHandle == xTimer);
    ASSERT(pinfo->func != NULL);

    if (pinfo->active)
    {
        pinfo->active = (pinfo->single_shot) ? false : true;
#if APP_TIMER_CONFIG_USE_SCHEDULER
        app_timer_event_t timer_event;

        timer_event.timeout_handler = pinfo->func;
        timer_event.p_context       = pinfo->argument;
        uint32_t err_code = app_sched_event_put(&timer_event, sizeof(timer_event), timeout_handler_scheduled_exec);
        APP_ERROR_CHECK(err_code);
#else
        pinfo->func(pinfo->argument);
#endif
    }
}

With these changes the old scheduler based application now seems to run flawlessly under FreeRTOS. Is this a smart way to go, or am I missing something?

Related