diff --git a/components/freertos/test/test_freertos_eventgroups.c b/components/freertos/test/test_freertos_eventgroups.c index 2b79060f4..0a25d3016 100644 --- a/components/freertos/test/test_freertos_eventgroups.c +++ b/components/freertos/test/test_freertos_eventgroups.c @@ -127,28 +127,37 @@ TEST_CASE("FreeRTOS Event Group Sync", "[freertos]") //Use a timer to trigger an ISr #define TIMER_DIVIDER 10000 -#define TIMER_COUNT 1000 +#define TIMER_COUNT 100 #define TIMER_NUMBER 0 -#define SET_BITS 0xAA -#define CLEAR_BITS 0x55 +#define BITS 0xAA -static bool event_grp_cleared = false; +static timer_isr_handle_t isr_handle; +static bool test_set_bits; +static bool test_clear_bits; static void IRAM_ATTR event_group_isr() { + portBASE_TYPE task_woken = pdFALSE; TIMERG0.int_clr_timers.t0 = 1; TIMERG0.hw_timer[xPortGetCoreID()].config.alarm_en = 1; - if(!event_grp_cleared){ - xEventGroupClearBitsFromISR(eg, CLEAR_BITS); - event_grp_cleared = true; - }else{ - xEventGroupSetBitsFromISR(eg, SET_BITS, NULL); + + if(test_set_bits){ + xEventGroupSetBitsFromISR(eg, BITS, &task_woken); timer_pause(TIMER_GROUP_0, TIMER_NUMBER); + test_set_bits = false; + } else if (test_clear_bits){ + xEventGroupClearBitsFromISR(eg, BITS); + xSemaphoreGiveFromISR(done_sem, &task_woken); + timer_pause(TIMER_GROUP_0, TIMER_NUMBER); + test_clear_bits = false; + } + //Switch context if necessary + if(task_woken == pdTRUE){ + portYIELD_FROM_ISR(); } } - -static void test_event_group_trace_facility(void* arg) +static void setup_timer() { //Setup timer for ISR int timer_group = TIMER_GROUP_0; @@ -166,37 +175,41 @@ static void test_event_group_trace_facility(void* arg) timer_set_alarm_value(timer_group, timer_idx, TIMER_COUNT); //Set alarm value timer_enable_intr(timer_group, timer_idx); //Enable timer interrupt timer_set_auto_reload(timer_group, timer_idx, 1); //Auto Reload - timer_isr_register(timer_group, timer_idx, event_group_isr, NULL, ESP_INTR_FLAG_IRAM, NULL); //Set ISR handler - - //Start timer to trigger isr - timer_start(TIMER_GROUP_0, TIMER_NUMBER); - TEST_ASSERT(xEventGroupWaitBits(eg, SET_BITS, pdFALSE, pdTRUE, portMAX_DELAY)); - //Check clear was successful - TEST_ASSERT((xEventGroupGetBits(eg) & CLEAR_BITS) == 0); - - //Give semaphore to signal done - xSemaphoreGive(done_sem); - vTaskDelete(NULL); + timer_isr_register(timer_group, timer_idx, event_group_isr, NULL, ESP_INTR_FLAG_IRAM, &isr_handle); //Set ISR handler +} +static void cleanup_timer() +{ + timer_disable_intr(TIMER_GROUP_0, TIMER_NUMBER); + esp_intr_free(isr_handle); } TEST_CASE("FreeRTOS Event Group ISR", "[freertos]") { - done_sem = xSemaphoreCreateBinary(); eg = xEventGroupCreate(); - xEventGroupSetBits(eg, CLEAR_BITS); //Set bits to be cleared by ISR + test_set_bits = false; + test_clear_bits = false; + setup_timer(); //Init timer to trigger ISR - xTaskCreatePinnedToCore(test_event_group_trace_facility, "Testing Task", 4096, NULL, configMAX_PRIORITIES - 1, NULL, 0); + //Test set bits + test_set_bits = true; + timer_start(TIMER_GROUP_0, TIMER_NUMBER); + TEST_ASSERT_EQUAL(BITS, xEventGroupWaitBits(eg, BITS, pdFALSE, pdTRUE, portMAX_DELAY)); //Let ISR set event group bits + + //Test clear bits + xEventGroupSetBits(eg, BITS); //Set bits to be cleared + test_clear_bits = true; + timer_start(TIMER_GROUP_0, TIMER_NUMBER); + xSemaphoreTake(done_sem, portMAX_DELAY); //Wait for ISR to clear bits + vTaskDelay(10); //Event group clear bits runs via daemon task, delay so daemon can run + TEST_ASSERT_EQUAL(0, xEventGroupGetBits(eg)); //Check bits are cleared - //Wait until task and isr have finished testing - xSemaphoreTake(done_sem, portMAX_DELAY); //Clean up - vSemaphoreDelete(done_sem); + cleanup_timer(); vEventGroupDelete(eg); - - vTaskDelay(10); //Give time for idle task to clear up delted tasks - + vSemaphoreDelete(done_sem); + vTaskDelay(10); //Give time for idle task to clear up deleted tasks } #endif //CONFIG_FREERTOS_USE_TRACE_FACILITY