@@ -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
137138static 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
183187TEST_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