kopia lustrzana https://github.com/espressif/esp-idf
unit tests: fix queue registry test
In the queue registry test, start_sem is given twice to let both tasks start the test. Each task takes start_sem, does some work, gives done_sem, and goes on to wait for start_sem again. It may happen that one task can grab start_sem, add queues to the registry, give done_sem, then grab start_sem again, delete the queues from the registry, and give done_sem again. At this point, main test task takes done_sem twice and proceeds to verify that queues have been added to the registry. But in fact, the first task has already deleted its queues from the registry, and the second one might not have added the queues yet. This causes test to fail. This changes the test to use separate start semaphores for each task, to avoid the race condition.pull/1278/merge
rodzic
41272c5b94
commit
8b56345e44
|
@ -18,7 +18,7 @@
|
|||
#define NO_OF_QUEUES_TOTAL (NO_OF_QUEUES_PER_CORE * portNUM_PROCESSORS)
|
||||
#define QUEUE_NAME_MAX_LENGTH 10
|
||||
|
||||
static SemaphoreHandle_t start_sem = NULL;
|
||||
static SemaphoreHandle_t start_sem[portNUM_PROCESSORS];
|
||||
static SemaphoreHandle_t done_sem = NULL;
|
||||
static char *names[NO_OF_QUEUES_TOTAL];
|
||||
static QueueHandle_t handles[NO_OF_QUEUES_TOTAL];
|
||||
|
@ -34,7 +34,7 @@ void test_queue_registry_task(void *arg)
|
|||
sprintf(names[i + offset], "Queue%d%d", core, i);
|
||||
}
|
||||
|
||||
xSemaphoreTake(start_sem, portMAX_DELAY); //Wait for start vQueueAddToRegistry()
|
||||
xSemaphoreTake(start_sem[core], portMAX_DELAY); //Wait for start vQueueAddToRegistry()
|
||||
for(int i = 0; i < NO_OF_QUEUES_PER_CORE; i++){
|
||||
vQueueAddToRegistry(handles[i + offset] , names[i + offset]); //Register queues to queue registry
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ void test_queue_registry_task(void *arg)
|
|||
|
||||
vTaskDelay(1);
|
||||
|
||||
xSemaphoreTake(start_sem, portMAX_DELAY); //Wait to start vQueueUnregisterQueue()
|
||||
xSemaphoreTake(start_sem[core], portMAX_DELAY); //Wait to start vQueueUnregisterQueue()
|
||||
for(int i = 0; i < NO_OF_QUEUES_PER_CORE; i++){
|
||||
vQueueDelete(handles[i + offset]); //Internally calls vQueueUnregisterQueue
|
||||
}
|
||||
|
@ -53,16 +53,16 @@ void test_queue_registry_task(void *arg)
|
|||
|
||||
TEST_CASE("Test FreeRTOS Queue Registry", "[freertos]")
|
||||
{
|
||||
//Create synchronization semaphores
|
||||
start_sem = xSemaphoreCreateCounting(portNUM_PROCESSORS, 0);
|
||||
//Create synchronization semaphores and tasks to test queue registry
|
||||
done_sem = xSemaphoreCreateCounting(portNUM_PROCESSORS, 0);
|
||||
for(int i = 0; i < portNUM_PROCESSORS; i++){ //Create tasks to test queue registry
|
||||
for(int i = 0; i < portNUM_PROCESSORS; i++){
|
||||
start_sem[i] = xSemaphoreCreateBinary();
|
||||
xTaskCreatePinnedToCore(test_queue_registry_task, "testing task", 4096, NULL, UNITY_FREERTOS_PRIORITY+1, NULL, i);
|
||||
}
|
||||
|
||||
portDISABLE_INTERRUPTS();
|
||||
for(int i = 0; i < portNUM_PROCESSORS; i++){
|
||||
xSemaphoreGive(start_sem); //Trigger start
|
||||
xSemaphoreGive(start_sem[i]); //Trigger start
|
||||
}
|
||||
portENABLE_INTERRUPTS();
|
||||
for(int i = 0; i < portNUM_PROCESSORS; i++){
|
||||
|
@ -75,7 +75,7 @@ TEST_CASE("Test FreeRTOS Queue Registry", "[freertos]")
|
|||
|
||||
portDISABLE_INTERRUPTS();
|
||||
for(int i = 0; i < portNUM_PROCESSORS; i++){
|
||||
xSemaphoreGive(start_sem); //Trigger start
|
||||
xSemaphoreGive(start_sem[i]); //Trigger start
|
||||
}
|
||||
portENABLE_INTERRUPTS();
|
||||
for(int i = 0; i < portNUM_PROCESSORS; i++){
|
||||
|
@ -92,8 +92,10 @@ TEST_CASE("Test FreeRTOS Queue Registry", "[freertos]")
|
|||
free(names[i]);
|
||||
names[i] = NULL;
|
||||
}
|
||||
vSemaphoreDelete(start_sem);
|
||||
start_sem = NULL;
|
||||
for(int i = 0; i < portNUM_PROCESSORS; i++){
|
||||
vSemaphoreDelete(start_sem[i]);
|
||||
start_sem[i] = NULL;
|
||||
}
|
||||
vSemaphoreDelete(done_sem);
|
||||
done_sem = NULL;
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue