2022-04-20 07:31:49 -04:00
|
|
|
/*
|
|
|
|
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
|
2017-05-29 02:10:38 -04:00
|
|
|
/*
|
|
|
|
Unit tests for FreeRTOS task priority get/set
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <esp_types.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <strings.h>
|
|
|
|
|
|
|
|
#include "freertos/FreeRTOS.h"
|
|
|
|
#include "freertos/task.h"
|
|
|
|
#include "unity.h"
|
2018-10-25 00:52:32 -04:00
|
|
|
#include "test_utils.h"
|
2017-05-29 02:10:38 -04:00
|
|
|
|
|
|
|
|
|
|
|
static void counter_task(void *param)
|
|
|
|
{
|
|
|
|
volatile uint32_t *counter = (volatile uint32_t *)param;
|
|
|
|
while (1) {
|
|
|
|
(*counter)++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("Get/Set Priorities", "[freertos]")
|
|
|
|
{
|
|
|
|
/* Two tasks per processor */
|
|
|
|
TaskHandle_t tasks[portNUM_PROCESSORS][2] = { 0 };
|
|
|
|
unsigned volatile counters[portNUM_PROCESSORS][2] = { 0 };
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL(UNITY_FREERTOS_PRIORITY, uxTaskPriorityGet(NULL));
|
|
|
|
|
|
|
|
/* create a matrix of counter tasks on each core */
|
|
|
|
for (int cpu = 0; cpu < portNUM_PROCESSORS; cpu++) {
|
|
|
|
for (int task = 0; task < 2; task++) {
|
|
|
|
xTaskCreatePinnedToCore(counter_task, "count", 2048, (void *)&(counters[cpu][task]), UNITY_FREERTOS_PRIORITY - task, &(tasks[cpu][task]), cpu);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* check they were created with the expected priorities */
|
|
|
|
for (int cpu = 0; cpu < portNUM_PROCESSORS; cpu++) {
|
|
|
|
for (int task = 0; task < 2; task++) {
|
|
|
|
TEST_ASSERT_EQUAL(UNITY_FREERTOS_PRIORITY - task, uxTaskPriorityGet(tasks[cpu][task]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
vTaskDelay(10);
|
|
|
|
|
|
|
|
/* at this point, only the higher priority tasks (first index) should be counting */
|
|
|
|
for (int cpu = 0; cpu < portNUM_PROCESSORS; cpu++) {
|
|
|
|
TEST_ASSERT_NOT_EQUAL(0, counters[cpu][0]);
|
|
|
|
TEST_ASSERT_EQUAL(0, counters[cpu][1]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* swap priorities! */
|
|
|
|
for (int cpu = 0; cpu < portNUM_PROCESSORS; cpu++) {
|
|
|
|
vTaskPrioritySet(tasks[cpu][0], UNITY_FREERTOS_PRIORITY - 1);
|
|
|
|
vTaskPrioritySet(tasks[cpu][1], UNITY_FREERTOS_PRIORITY);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* check priorities have swapped... */
|
|
|
|
for (int cpu = 0; cpu < portNUM_PROCESSORS; cpu++) {
|
|
|
|
TEST_ASSERT_EQUAL(UNITY_FREERTOS_PRIORITY -1, uxTaskPriorityGet(tasks[cpu][0]));
|
|
|
|
TEST_ASSERT_EQUAL(UNITY_FREERTOS_PRIORITY, uxTaskPriorityGet(tasks[cpu][1]));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* check the tasks which are counting have also swapped now... */
|
|
|
|
for (int cpu = 0; cpu < portNUM_PROCESSORS; cpu++) {
|
|
|
|
unsigned old_counters[2];
|
|
|
|
old_counters[0] = counters[cpu][0];
|
|
|
|
old_counters[1] = counters[cpu][1];
|
|
|
|
vTaskDelay(10);
|
|
|
|
TEST_ASSERT_EQUAL(old_counters[0], counters[cpu][0]);
|
|
|
|
TEST_ASSERT_NOT_EQUAL(old_counters[1], counters[cpu][1]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* clean up */
|
|
|
|
for (int cpu = 0; cpu < portNUM_PROCESSORS; cpu++) {
|
|
|
|
for (int task = 0; task < 2; task++) {
|
|
|
|
vTaskDelete(tasks[cpu][task]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|