freertos: HAVE_FREERTOS_TASK_NOTIFICATION uses FreeRTOS Task Notifications from v8.2 to trigger run loop

This commit is contained in:
Matthias Ringwald 2017-07-04 19:43:02 +02:00
parent 7c5fbb2726
commit 828fd804b0
2 changed files with 30 additions and 3 deletions

View File

@ -39,6 +39,8 @@
* btstack_run_loop_freertos.c
*
* Run loop on dedicated thread on FreeRTOS
* The run loop is triggered from other task/ISRs either via Event Groups
* or Task Notifications if HAVE_FREERTOS_TASK_NOTIFICATIONS is defined
*/
#include <stddef.h> // NULL
@ -63,7 +65,11 @@ typedef struct function_call {
static const btstack_run_loop_t btstack_run_loop_freertos;
static QueueHandle_t btstack_run_loop_queue;
#ifdef HAVE_FREERTOS_TASK_NOTIFICATIONS
static TaskHandle_t btstack_run_loop_task;
#else
static EventGroupHandle_t btstack_run_loop_event_group;
#endif
// bit 0 event group reserved to wakeup run loop
#define EVENT_GROUP_FLAG_RUN_LOOP 1
@ -120,7 +126,11 @@ static void btstack_run_loop_freertos_dump_timer(void){
// schedules execution from regular thread
void btstack_run_loop_freertos_trigger(void){
#ifdef HAVE_FREERTOS_TASK_NOTIFICATIONS
xTaskNotify(btstack_run_loop_task, EVENT_GROUP_FLAG_RUN_LOOP, eSetBits);
#else
xEventGroupSetBits(btstack_run_loop_event_group, EVENT_GROUP_FLAG_RUN_LOOP);
#endif
}
void btstack_run_loop_freertos_execute_code_on_main_thread(void (*fn)(void *arg), void * arg){
@ -134,10 +144,17 @@ void btstack_run_loop_freertos_execute_code_on_main_thread(void (*fn)(void *arg)
btstack_run_loop_freertos_trigger();
}
#if (INCLUDE_xEventGroupSetBitFromISR == 1)
#if defined(HAVE_FREERTOS_TASK_NOTIFICATIONS) || (INCLUDE_xEventGroupSetBitFromISR == 1)
void btstack_run_loop_freertos_trigger_from_isr(void){
BaseType_t xHigherPriorityTaskWoken;
#ifdef HAVE_FREERTOS_TASK_NOTIFICATIONS
xTaskNotifyFromISR(btstack_run_loop_task, EVENT_GROUP_FLAG_RUN_LOOP, eSetBits, &xHigherPriorityTaskWoken);
if (xHigherPriorityTaskWoken) {
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}
#else
xEventGroupSetBitsFromISR(btstack_run_loop_event_group, EVENT_GROUP_FLAG_RUN_LOOP, &xHigherPriorityTaskWoken);
#endif
}
void btstack_run_loop_freertos_execute_code_on_main_thread_from_isr(void (*fn)(void *arg), void * arg){
@ -158,6 +175,10 @@ static void btstack_run_loop_freertos_task(void *pvParameter){
log_debug("RL: execute");
#ifdef HAVE_FREERTOS_TASK_NOTIFICATIONS
btstack_run_loop_task = xTaskGetCurrentTaskHandle();
#endif
while (1) {
// process data sources
@ -197,9 +218,13 @@ static void btstack_run_loop_freertos_task(void *pvParameter){
ts->process(ts);
}
// wait for timeout or event group
// wait for timeout or event group/task notification
log_debug("RL: wait with timeout %u", (int) timeout_ms);
#ifdef HAVE_FREERTOS_TASK_NOTIFICATIONS
xTaskNotifyWait(pdFALSE, 0xffffffff, NULL, pdMS_TO_TICKS(timeout_ms));
#else
xEventGroupWaitBits(btstack_run_loop_event_group, EVENT_GROUP_FLAG_RUN_LOOP, 1, 0, pdMS_TO_TICKS(timeout_ms));
#endif
}
}
@ -231,8 +256,10 @@ static void btstack_run_loop_freertos_init(void){
// queue to receive events: up to 2 calls from transport, up to 3 for app
btstack_run_loop_queue = xQueueCreate(20, sizeof(function_call_t));
#ifndef HAVE_FREERTOS_TASK_NOTIFICATIONS
// event group to wake run loop
btstack_run_loop_event_group = xEventGroupCreate();
#endif
log_info("run loop init, queue item size %u", (int) sizeof(function_call_t));
}

View File

@ -53,7 +53,7 @@
// hack to avoid error for ESP32
#ifndef ESP_PLATFORM
#if (INCLUDE_xEventGroupSetBitFromISR != 1)
#if (INCLUDE_xEventGroupSetBitFromISR != 1) && !defined(HAVE_FREERTOS_TASK_NOTIFICATION)
#error "The BTstack HAL UART Run Loop integration (btstack_uart_block_freertos) needs to trigger Run Loop iterations from ISR context," \
"but 'INCLUDE_xEventGroupSetBitFromISR' is not enabled in your FreeRTOS configuration. Please enable INCLUDE_xEventGroupSetBitFromISR."
#endif