]> granicus.if.org Git - esp-idf/commitdiff
freertos/Fix Event Group ISR test case
authorDarian Leung <darian@espressif.com>
Tue, 2 Jan 2018 10:57:28 +0000 (18:57 +0800)
committerDarian Leung <darian@espressif.com>
Tue, 2 Jan 2018 10:57:28 +0000 (18:57 +0800)
This commit fixes and reimplements the Event Group ISR test case. The test
case tests xEventGroupSetBitsFromISR() and xEventGroupClearBitsFromISR()

components/freertos/test/test_freertos_eventgroups.c

index 2b79060f4f913a3d155ac8962343696fe6c2a6f3..0a25d301632f604e8000dbcbd6c24bd81ca53adf 100644 (file)
@@ -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