Merge branch 'bugfix/freertos_eventgroup_isr_test' into 'master'

freertos/Fix Event Group ISR test case

See merge request !1733
This commit is contained in:
Ivan Grokhotkov 2018-01-08 16:51:27 +08:00
commit f61dcf4d1a

View file

@ -127,28 +127,37 @@ TEST_CASE("FreeRTOS Event Group Sync", "[freertos]")
//Use a timer to trigger an ISr //Use a timer to trigger an ISr
#define TIMER_DIVIDER 10000 #define TIMER_DIVIDER 10000
#define TIMER_COUNT 1000 #define TIMER_COUNT 100
#define TIMER_NUMBER 0 #define TIMER_NUMBER 0
#define SET_BITS 0xAA #define BITS 0xAA
#define CLEAR_BITS 0x55
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() static void IRAM_ATTR event_group_isr()
{ {
portBASE_TYPE task_woken = pdFALSE;
TIMERG0.int_clr_timers.t0 = 1; TIMERG0.int_clr_timers.t0 = 1;
TIMERG0.hw_timer[xPortGetCoreID()].config.alarm_en = 1; TIMERG0.hw_timer[xPortGetCoreID()].config.alarm_en = 1;
if(!event_grp_cleared){
xEventGroupClearBitsFromISR(eg, CLEAR_BITS); if(test_set_bits){
event_grp_cleared = true; xEventGroupSetBitsFromISR(eg, BITS, &task_woken);
}else{
xEventGroupSetBitsFromISR(eg, SET_BITS, NULL);
timer_pause(TIMER_GROUP_0, TIMER_NUMBER); 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 setup_timer()
static void test_event_group_trace_facility(void* arg)
{ {
//Setup timer for ISR //Setup timer for ISR
int timer_group = TIMER_GROUP_0; 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_set_alarm_value(timer_group, timer_idx, TIMER_COUNT); //Set alarm value
timer_enable_intr(timer_group, timer_idx); //Enable timer interrupt timer_enable_intr(timer_group, timer_idx); //Enable timer interrupt
timer_set_auto_reload(timer_group, timer_idx, 1); //Auto Reload 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 timer_isr_register(timer_group, timer_idx, event_group_isr, NULL, ESP_INTR_FLAG_IRAM, &isr_handle); //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);
static void cleanup_timer()
{
timer_disable_intr(TIMER_GROUP_0, TIMER_NUMBER);
esp_intr_free(isr_handle);
} }
TEST_CASE("FreeRTOS Event Group ISR", "[freertos]") TEST_CASE("FreeRTOS Event Group ISR", "[freertos]")
{ {
done_sem = xSemaphoreCreateBinary(); done_sem = xSemaphoreCreateBinary();
eg = xEventGroupCreate(); 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 //Clean up
vSemaphoreDelete(done_sem); cleanup_timer();
vEventGroupDelete(eg); vEventGroupDelete(eg);
vSemaphoreDelete(done_sem);
vTaskDelay(10); //Give time for idle task to clear up delted tasks vTaskDelay(10); //Give time for idle task to clear up deleted tasks
} }
#endif //CONFIG_FREERTOS_USE_TRACE_FACILITY #endif //CONFIG_FREERTOS_USE_TRACE_FACILITY