Skip to content

Commit

Permalink
feat:softdeadline
Browse files Browse the repository at this point in the history
  • Loading branch information
jiahaochen1015 committed Dec 9, 2024
1 parent a79e384 commit 45d5780
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 92 deletions.
174 changes: 99 additions & 75 deletions FreeRTOS/Demo/EDF/FreeRTOSConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
37 changes: 20 additions & 17 deletions FreeRTOS/Demo/EDF/main_blinky.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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, &param[0], configMAX_PRIORITIES-1, &(xT[0]));
xTaskCreate(T2, "task2", configMINIMAL_STACK_SIZE, &param[1], configMAX_PRIORITIES-2, &(xT[1]));
xTaskCreate(T1, "task1", configMINIMAL_STACK_SIZE, &param[0], 4, &(xT[0]));
xTaskCreate(T2, "task2", configMINIMAL_STACK_SIZE, &param[1], 8, &(xT[1]));
//xTaskCreate(T3, "task3", configMINIMAL_STACK_SIZE, &param[2], configMAX_PRIORITIES-3, &(xT[2]));
// xTaskCreate(T3_soft, "task3_soft", configMINIMAL_STACK_SIZE, &param[2], configMAX_PRIORITIES-3, &(xT[4]));
xTaskCreate(T4, "task4", configMINIMAL_STACK_SIZE, &param[3], configMAX_PRIORITIES-4, &(xT[3]));
xTaskCreate(T3_soft, "task3_soft", configMINIMAL_STACK_SIZE, &param[2], 1, &(xT[4]));
xTaskCreate(T4, "task4", configMINIMAL_STACK_SIZE, &param[3], 2, &(xT[3]));
}

vTaskStartScheduler();
Expand All @@ -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(;;) {
Expand All @@ -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(;;) {
Expand Down Expand Up @@ -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(;;) {
Expand All @@ -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();
Expand All @@ -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 *)&param_soft, configMAX_PRIORITIES-3, &xT[5]);
xTaskCreate(T_punish, (signed char *)"T_punish", 512, (void *)&param_soft, 1, &xT[5]);
}
iterNum++;
xTaskDelayUntil(&previousTime, period);
Expand Down

0 comments on commit 45d5780

Please sign in to comment.