Skip to content

Commit f61dcf4

Browse files
committed
Merge branch 'bugfix/freertos_eventgroup_isr_test' into 'master'
freertos/Fix Event Group ISR test case See merge request !1733
2 parents ddf3d92 + 9df9e23 commit f61dcf4

File tree

1 file changed

+44
-31
lines changed

1 file changed

+44
-31
lines changed

components/freertos/test/test_freertos_eventgroups.c

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -127,28 +127,37 @@ TEST_CASE("FreeRTOS Event Group Sync", "[freertos]")
127127

128128
//Use a timer to trigger an ISr
129129
#define TIMER_DIVIDER 10000
130-
#define TIMER_COUNT 1000
130+
#define TIMER_COUNT 100
131131
#define TIMER_NUMBER 0
132-
#define SET_BITS 0xAA
133-
#define CLEAR_BITS 0x55
132+
#define BITS 0xAA
134133

135-
static bool event_grp_cleared = false;
134+
static timer_isr_handle_t isr_handle;
135+
static bool test_set_bits;
136+
static bool test_clear_bits;
136137

137138
static void IRAM_ATTR event_group_isr()
138139
{
140+
portBASE_TYPE task_woken = pdFALSE;
139141
TIMERG0.int_clr_timers.t0 = 1;
140142
TIMERG0.hw_timer[xPortGetCoreID()].config.alarm_en = 1;
141-
if(!event_grp_cleared){
142-
xEventGroupClearBitsFromISR(eg, CLEAR_BITS);
143-
event_grp_cleared = true;
144-
}else{
145-
xEventGroupSetBitsFromISR(eg, SET_BITS, NULL);
143+
144+
if(test_set_bits){
145+
xEventGroupSetBitsFromISR(eg, BITS, &task_woken);
146+
timer_pause(TIMER_GROUP_0, TIMER_NUMBER);
147+
test_set_bits = false;
148+
} else if (test_clear_bits){
149+
xEventGroupClearBitsFromISR(eg, BITS);
150+
xSemaphoreGiveFromISR(done_sem, &task_woken);
146151
timer_pause(TIMER_GROUP_0, TIMER_NUMBER);
152+
test_clear_bits = false;
153+
}
154+
//Switch context if necessary
155+
if(task_woken == pdTRUE){
156+
portYIELD_FROM_ISR();
147157
}
148158
}
149159

150-
151-
static void test_event_group_trace_facility(void* arg)
160+
static void setup_timer()
152161
{
153162
//Setup timer for ISR
154163
int timer_group = TIMER_GROUP_0;
@@ -166,37 +175,41 @@ static void test_event_group_trace_facility(void* arg)
166175
timer_set_alarm_value(timer_group, timer_idx, TIMER_COUNT); //Set alarm value
167176
timer_enable_intr(timer_group, timer_idx); //Enable timer interrupt
168177
timer_set_auto_reload(timer_group, timer_idx, 1); //Auto Reload
169-
timer_isr_register(timer_group, timer_idx, event_group_isr, NULL, ESP_INTR_FLAG_IRAM, NULL); //Set ISR handler
170-
171-
//Start timer to trigger isr
172-
timer_start(TIMER_GROUP_0, TIMER_NUMBER);
173-
TEST_ASSERT(xEventGroupWaitBits(eg, SET_BITS, pdFALSE, pdTRUE, portMAX_DELAY));
174-
//Check clear was successful
175-
TEST_ASSERT((xEventGroupGetBits(eg) & CLEAR_BITS) == 0);
176-
177-
//Give semaphore to signal done
178-
xSemaphoreGive(done_sem);
179-
vTaskDelete(NULL);
178+
timer_isr_register(timer_group, timer_idx, event_group_isr, NULL, ESP_INTR_FLAG_IRAM, &isr_handle); //Set ISR handler
179+
}
180180

181+
static void cleanup_timer()
182+
{
183+
timer_disable_intr(TIMER_GROUP_0, TIMER_NUMBER);
184+
esp_intr_free(isr_handle);
181185
}
182186

183187
TEST_CASE("FreeRTOS Event Group ISR", "[freertos]")
184188
{
185-
186189
done_sem = xSemaphoreCreateBinary();
187190
eg = xEventGroupCreate();
188-
xEventGroupSetBits(eg, CLEAR_BITS); //Set bits to be cleared by ISR
191+
test_set_bits = false;
192+
test_clear_bits = false;
193+
setup_timer(); //Init timer to trigger ISR
189194

190-
xTaskCreatePinnedToCore(test_event_group_trace_facility, "Testing Task", 4096, NULL, configMAX_PRIORITIES - 1, NULL, 0);
195+
//Test set bits
196+
test_set_bits = true;
197+
timer_start(TIMER_GROUP_0, TIMER_NUMBER);
198+
TEST_ASSERT_EQUAL(BITS, xEventGroupWaitBits(eg, BITS, pdFALSE, pdTRUE, portMAX_DELAY)); //Let ISR set event group bits
199+
200+
//Test clear bits
201+
xEventGroupSetBits(eg, BITS); //Set bits to be cleared
202+
test_clear_bits = true;
203+
timer_start(TIMER_GROUP_0, TIMER_NUMBER);
204+
xSemaphoreTake(done_sem, portMAX_DELAY); //Wait for ISR to clear bits
205+
vTaskDelay(10); //Event group clear bits runs via daemon task, delay so daemon can run
206+
TEST_ASSERT_EQUAL(0, xEventGroupGetBits(eg)); //Check bits are cleared
191207

192-
//Wait until task and isr have finished testing
193-
xSemaphoreTake(done_sem, portMAX_DELAY);
194208
//Clean up
195-
vSemaphoreDelete(done_sem);
209+
cleanup_timer();
196210
vEventGroupDelete(eg);
197-
198-
vTaskDelay(10); //Give time for idle task to clear up delted tasks
199-
211+
vSemaphoreDelete(done_sem);
212+
vTaskDelay(10); //Give time for idle task to clear up deleted tasks
200213
}
201214

202215
#endif //CONFIG_FREERTOS_USE_TRACE_FACILITY

0 commit comments

Comments
 (0)