freertos/tests: added test to evaluate scheduling time

freertos/Kconfig: fix trailing space on optimized scheduler option

freertos/tests: moved test context variables inside of test task.

The public variables used on scheduling time test now were packed into a structure allocated on  test case task stack and passed to tasks as arguments saving RAM comsumption.
This commit is contained in:
Felipe Neves 2019-11-06 16:59:16 +08:00
parent d4c82606fb
commit 77bf1ff1c0
4 changed files with 62 additions and 6 deletions

View File

@ -44,8 +44,8 @@ menu "FreeRTOS"
default y
help
On most platforms there are instructions can speedup the ready task
searching. Enabling this option the FreeRTOS with this instructions
support will be built
searching. Enabling this option the FreeRTOS with this instructions
support will be built.
config FREERTOS_HZ
int "Tick rate (Hz)"

View File

@ -472,10 +472,6 @@ void vApplicationSleep( TickType_t xExpectedIdleTime );
/*-----------------------------------------------------------*/
/* Architecture specific optimisations. */
#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#endif
#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
/* Check the configuration. */

View File

@ -0,0 +1,58 @@
#include <esp_types.h>
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "freertos/queue.h"
#include "freertos/xtensa_api.h"
#include "esp_intr_alloc.h"
#include "xtensa/hal.h"
#include "unity.h"
#include "soc/cpu.h"
#include "test_utils.h"
typedef struct {
uint32_t noof_runs;
SemaphoreHandle_t end_sema;
uint32_t before_sched;
uint32_t cycles_to_sched;
} test_context_t;
static void test_task_1(void *arg) {
test_context_t *context = (test_context_t *)arg;
for(context->noof_runs = 0 ;context->noof_runs < 10000; ) {
context->before_sched = portGET_RUN_TIME_COUNTER_VALUE();
vPortYield();
}
vTaskDelete(NULL);
}
static void test_task_2(void *arg) {
test_context_t *context = (test_context_t *)arg;
for( ; context->noof_runs < 10000; context->noof_runs++) {
context->cycles_to_sched += (portGET_RUN_TIME_COUNTER_VALUE() - context->before_sched);
vPortYield();
}
context->cycles_to_sched /= 10000;
xSemaphoreGive(context->end_sema);
vTaskDelete(NULL);
}
TEST_CASE("scheduling time test", "[freertos]")
{
test_context_t context;
context.end_sema = xSemaphoreCreateBinary();
TEST_ASSERT(context.end_sema != NULL);
xTaskCreatePinnedToCore(test_task_1, "test1" , 4096, &context, 1, NULL,1);
xTaskCreatePinnedToCore(test_task_2, "test2" , 4096, &context, 1, NULL,1);
BaseType_t result = xSemaphoreTake(context.end_sema, portMAX_DELAY);
TEST_ASSERT_EQUAL_HEX32(pdTRUE, result);
TEST_PERFORMANCE_LESS_THAN(SCHEDULING_TIME , "scheduling time %d cycles" ,context.cycles_to_sched);
}

View File

@ -76,3 +76,5 @@
#endif //CONFIG_IDF_TARGET_ESP32S2BETA
//time to perform the task selection plus context switch (from task)
#define IDF_PERFORMANCE_MAX_SCHEDULING_TIME 4500