From 45d5780b39bfebeda6dc64713d5145ed42c22f56 Mon Sep 17 00:00:00 2001 From: cjh Date: Mon, 9 Dec 2024 13:53:54 +0000 Subject: [PATCH] feat:softdeadline --- FreeRTOS/Demo/EDF/FreeRTOSConfig.h | 174 ++++++++++++++++------------- FreeRTOS/Demo/EDF/main_blinky.c | 37 +++--- 2 files changed, 119 insertions(+), 92 deletions(-) diff --git a/FreeRTOS/Demo/EDF/FreeRTOSConfig.h b/FreeRTOS/Demo/EDF/FreeRTOSConfig.h index 6f4f6feff5..c7d0667700 100644 --- a/FreeRTOS/Demo/EDF/FreeRTOSConfig.h +++ b/FreeRTOS/Demo/EDF/FreeRTOSConfig.h @@ -28,115 +28,139 @@ #define FREERTOS_CONFIG_H /*----------------------------------------------------------- -* Application specific definitions. -* -* These definitions should be adjusted for your particular hardware and -* application requirements. -* -* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE -* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. -* -* See http://www.freertos.org/a00110.html -*----------------------------------------------------------*/ - -#define configUSE_TRACE_FACILITY 1 -#define configGENERATE_RUN_TIME_STATS 0 - -#define configUSE_PREEMPTION 1 -#define configUSE_IDLE_HOOK 0 -#define configUSE_TICK_HOOK 1 -#define configCPU_CLOCK_HZ ( ( unsigned long ) 25000000 ) -#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) -#define configSLICE_INTERVAL ( ( TickType_t ) 10 ) -#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 256 ) -#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 60 * 1024 ) ) -#define configMAX_TASK_NAME_LEN ( 12 ) -#define configUSE_TRACE_FACILITY 1 -#define configUSE_16_BIT_TICKS 0 -#define configIDLE_SHOULD_YIELD 0 -#define configUSE_CO_ROUTINES 0 -#define configUSE_MUTEXES 1 -#define configUSE_RECURSIVE_MUTEXES 1 -#define configCHECK_FOR_STACK_OVERFLOW 2 -#define configUSE_MALLOC_FAILED_HOOK 1 -#define configUSE_QUEUE_SETS 1 -#define configUSE_COUNTING_SEMAPHORES 1 - -#define configMAX_PRIORITIES ( 9UL ) -#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) -#define configQUEUE_REGISTRY_SIZE 10 -#define configSUPPORT_STATIC_ALLOCATION 1 + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html + *----------------------------------------------------------*/ + +// choose target scheduling system in compiling phase + +#define configUSE_DEFAULT_SCHEDULING +// #define configUSE_EDF_SCHEDULING +// #define configUSE_RR_SCHEDULING +// #define configUSE_WRR_SCHEDULING + +#define configUSE_TRACE_FACILITY 1 +#define configGENERATE_RUN_TIME_STATS 0 + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 1 +#define configCPU_CLOCK_HZ ((unsigned long)25000000) +#define configTICK_RATE_HZ ((TickType_t)1000) +#define configSLICE_INTERVAL ((TickType_t)10) +#define configMINIMAL_STACK_SIZE ((unsigned short)80) +#define configTOTAL_HEAP_SIZE ((size_t)(60 * 1024)) +#define configMAX_TASK_NAME_LEN (12) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_MALLOC_FAILED_HOOK 1 +#define configUSE_QUEUE_SETS 1 +#define configUSE_COUNTING_SEMAPHORES 1 + +#define configMAX_PRIORITIES (9UL) +#define configMAX_CO_ROUTINE_PRIORITIES (2) +#define configQUEUE_REGISTRY_SIZE 10 +#define configSUPPORT_STATIC_ALLOCATION 1 /* Timer related defines. */ -#define configUSE_TIMERS 0 -#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 4 ) -#define configTIMER_QUEUE_LENGTH 20 -#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 ) +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES - 4) +#define configTIMER_QUEUE_LENGTH 20 +#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE * 2) -#define configUSE_TASK_NOTIFICATIONS 1 -#define configTASK_NOTIFICATION_ARRAY_ENTRIES 3 +#define configUSE_TASK_NOTIFICATIONS 1 +#define configTASK_NOTIFICATION_ARRAY_ENTRIES 3 /* Set the following definitions to 1 to include the API function, or zero * to exclude the API function. */ -#define INCLUDE_vTaskPrioritySet 1 -#define INCLUDE_uxTaskPriorityGet 1 -#define INCLUDE_vTaskDelete 1 -#define INCLUDE_vTaskCleanUpResources 0 -#define INCLUDE_vTaskSuspend 1 -#define INCLUDE_vTaskDelayUntil 1 -#define INCLUDE_vTaskDelay 1 -#define INCLUDE_uxTaskGetStackHighWaterMark 1 -#define INCLUDE_xTaskGetSchedulerState 1 -#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1 -#define INCLUDE_xTaskGetIdleTaskHandle 1 -#define INCLUDE_xSemaphoreGetMutexHolder 1 -#define INCLUDE_eTaskGetState 1 -#define INCLUDE_xTimerPendFunctionCall 1 -#define INCLUDE_xTaskAbortDelay 1 -#define INCLUDE_xTaskGetHandle 1 +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1 +#define INCLUDE_xTaskGetIdleTaskHandle 1 +#define INCLUDE_xSemaphoreGetMutexHolder 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_xTaskAbortDelay 1 +#define INCLUDE_xTaskGetHandle 1 /* This demo makes use of one or more example stats formatting functions. These * format the raw data provided by the uxTaskGetSystemState() function in to human * readable ASCII form. See the notes in the implementation of vTaskList() within * FreeRTOS/Source/tasks.c for limitations. */ -#define configUSE_STATS_FORMATTING_FUNCTIONS 0 - -#define configKERNEL_INTERRUPT_PRIORITY ( 255 ) /* All eight bits as QEMU doesn't model the priority bits. */ +#define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#define configKERNEL_INTERRUPT_PRIORITY (255) /* All eight bits as QEMU doesn't model the priority bits. */ /* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! * See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ -#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 4 ) +#define configMAX_SYSCALL_INTERRUPT_PRIORITY (4) /* Use the Cortex-M3 optimised task selection rather than the generic C code * version. */ -#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 /* The Win32 target is capable of running all the tests tasks at the same * time. */ -#define configRUN_ADDITIONAL_TESTS 1 +#define configRUN_ADDITIONAL_TESTS 1 /* The test that checks the trigger level on stream buffers requires an * allowable margin of error on slower processors (slower than the Win32 * machine on which the test is developed). */ -#define configSTREAM_BUFFER_TRIGGER_LEVEL_TEST_MARGIN 4 +#define configSTREAM_BUFFER_TRIGGER_LEVEL_TEST_MARGIN 4 // #ifndef __IASMARM__ /* Prevent C code being included in IAR asm files. */ - void vAssertCalled( const char * pcFileName, - uint32_t ulLine ); - #define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ ); +void vAssertCalled(const char *pcFileName, + uint32_t ulLine); +#define configASSERT(x) \ + if ((x) == 0) \ + vAssertCalled(__FILE__, __LINE__); // #endif -#define intqHIGHER_PRIORITY ( configMAX_PRIORITIES - 5 ) -#define bktPRIMARY_PRIORITY ( configMAX_PRIORITIES - 3 ) -#define bktSECONDARY_PRIORITY ( configMAX_PRIORITIES - 4 ) +#define intqHIGHER_PRIORITY (configMAX_PRIORITIES - 5) +#define bktPRIMARY_PRIORITY (configMAX_PRIORITIES - 3) +#define bktSECONDARY_PRIORITY (configMAX_PRIORITIES - 4) #define configENABLE_BACKWARD_COMPATIBILITY 0 -#define configEXPECTED_NO_RUNNING_TASKS ( 5 ) +#define configEXPECTED_NO_RUNNING_TASKS (5) + +#ifdef configUSE_DEFAULT_SCHEDULING + +#endif + +#ifdef configUSE_EDF_SCHEDULING + #define configUSE_EDF_SCHEDULER 1 +#endif -#define configUSE_EDF_SCHEDULER 1 +#ifdef configUSE_RR_SCHEDULING + #define configUSE_EDF_SCHEDULER 0 + #define configUSE_TIME_SLICING 1 +#endif +#ifdef configUSE_WRR_SCHEDULING + #define configUSE_TIME_SLICING 1 + #define configSLICE_INTERVAL ( ( TickType_t ) 10 ) + #define configUSE_WEIGHTED_ROUND_ROBIN 1 +#endif #endif /* FREERTOS_CONFIG_H */ diff --git a/FreeRTOS/Demo/EDF/main_blinky.c b/FreeRTOS/Demo/EDF/main_blinky.c index 7883bd9372..78cc7ab57d 100644 --- a/FreeRTOS/Demo/EDF/main_blinky.c +++ b/FreeRTOS/Demo/EDF/main_blinky.c @@ -124,7 +124,7 @@ static BaseType_t isTimeout = pdFALSE; /* Test functions */ unsigned long ulTaskNumber[configEXPECTED_NO_RUNNING_TASKS]; -BaseType_t T3_soft_deadline = 300; +BaseType_t T3_soft_deadline = 1000; BaseType_t T_punish_runtime = 0; static void T1(void *pvParameters); @@ -146,19 +146,22 @@ void main_blinky(void) pvParameter_t param[4]; - for(int i = 0; i < 4; i++) - param[i].uxWeight = 0; - param[0].uxDeadLine = 100; - param[1].uxDeadLine = 1400; - param[2].uxDeadLine = 1000; - param[3].uxDeadLine = 2000; + + param[0].uxWeight = 5; + param[1].uxWeight = 10; + param[2].uxWeight = 1; + param[3].uxWeight = 3; + param[0].uxDeadLine = 700; + param[1].uxDeadLine = 400; + param[2].uxDeadLine = 2000; + param[3].uxDeadLine = 600; if (xQueue != NULL) { // Create an eternal task evoked periodically for creating new tasks - xTaskCreate(T1, "task1", configMINIMAL_STACK_SIZE, ¶m[0], configMAX_PRIORITIES-1, &(xT[0])); - xTaskCreate(T2, "task2", configMINIMAL_STACK_SIZE, ¶m[1], configMAX_PRIORITIES-2, &(xT[1])); + xTaskCreate(T1, "task1", configMINIMAL_STACK_SIZE, ¶m[0], 4, &(xT[0])); + xTaskCreate(T2, "task2", configMINIMAL_STACK_SIZE, ¶m[1], 8, &(xT[1])); //xTaskCreate(T3, "task3", configMINIMAL_STACK_SIZE, ¶m[2], configMAX_PRIORITIES-3, &(xT[2])); - // xTaskCreate(T3_soft, "task3_soft", configMINIMAL_STACK_SIZE, ¶m[2], configMAX_PRIORITIES-3, &(xT[4])); - xTaskCreate(T4, "task4", configMINIMAL_STACK_SIZE, ¶m[3], configMAX_PRIORITIES-4, &(xT[3])); + xTaskCreate(T3_soft, "task3_soft", configMINIMAL_STACK_SIZE, ¶m[2], 1, &(xT[4])); + xTaskCreate(T4, "task4", configMINIMAL_STACK_SIZE, ¶m[3], 2, &(xT[3])); } vTaskStartScheduler(); @@ -177,7 +180,7 @@ void main_blinky(void) static void T1(void *pvParameters) { TickType_t previousTime = xTaskGetTickCount(); - TickType_t runtime = 100, period = 500; + TickType_t runtime = 200, period = 800; int iterNum = 0; BaseType_t loopCount = durationToLoop(runtime); for(;;) { @@ -192,7 +195,7 @@ static void T1(void *pvParameters) static void T2(void *pvParameters) { TickType_t previousTime = xTaskGetTickCount(); - TickType_t runtime = 1000, period = 1500; + TickType_t runtime = 100, period = 500; int iterNum = 0; BaseType_t loopCount = durationToLoop(runtime); for(;;) { @@ -225,7 +228,7 @@ static void T3(void *pvParameters) static void T4(void *pvParameters) { TickType_t previousTime = xTaskGetTickCount(); - TickType_t runtime = 500, period = 4000; + TickType_t runtime = 300, period = 2000; int iterNum = 0; BaseType_t loopCount = durationToLoop(runtime); for(;;) { @@ -241,7 +244,7 @@ static void T4(void *pvParameters) static void T3_soft(void *pvParameters) { TickType_t previousTime = xTaskGetTickCount(); - TickType_t runtime = 300, period = 2000; + TickType_t runtime = 495, period = 4000; int iterNum = 0; for(;;) { TickType_t startTime = xTaskGetTickCount(); @@ -257,10 +260,10 @@ static void T3_soft(void *pvParameters) printf("[iter:%d] task3_soft pass the soft deadline\n", iterNum); T_punish_runtime = endTime - startTime - T3_soft_deadline; pvParameter_t param_soft; - param_soft.uxWeight = 0; + param_soft.uxWeight = ((pvParameter_t *)pvParameters)->uxWeight; param_soft.uxDeadLine = runtime; printf("[iter:%d] task3_soft create a punished task, name:T_punish, deadline:%d, runtime:%d\n", iterNum, param_soft.uxDeadLine, T_punish_runtime); - // xTaskCreate(T_punish, (signed char *)"T_punish", 512, (void *)¶m_soft, configMAX_PRIORITIES-3, &xT[5]); + xTaskCreate(T_punish, (signed char *)"T_punish", 512, (void *)¶m_soft, 1, &xT[5]); } iterNum++; xTaskDelayUntil(&previousTime, period);