"FreeRTOS之支持多优先级"和"FreeRTOS之任务延时列表的实现"都是为了实现时间片的功能。
1、 修改app_task.c文件
#include "app_task.h"
#include "task.h"
uint32_t flag1=0;
uint32_t flag2=0;
uint32_t flag3=0;
void delay (uint32_t count)
{
for(; count!=0; count--);
}
void Task1_Entry( void *p_arg )
{
for( ;; )
{
flag1 = 1;
delay( 100 );
flag1 = 0;
delay( 100 );
}
}
void Task2_Entry( void *p_arg )
{
for( ;; )
{
flag2 = 1;
delay( 100 );
flag2 = 0;
delay( 100 );
}
}
void Task3_Entry( void *p_arg )
{
for( ;; )
{
flag3 = 1;
vTaskDelay(2);//delay( 100 );
flag3 = 0;
vTaskDelay(2);//delay( 100 );
}
}
2、 修改main.c
#include "task_lists.h"
#include "task.h"
#include "app_task.h"
#include "port.h"
#include "idle_task.h"
#include "sys_tick.h"
#include "delay_lists.h"
#define TASK1_STACK_SIZE 20
StackType_t Task1Stack[TASK1_STACK_SIZE];
TCB_t Task1TCB;
#define TASK2_STACK_SIZE 20
StackType_t Task2Stack[TASK2_STACK_SIZE];
TCB_t Task2TCB;
#define TASK3_STACK_SIZE 20
StackType_t Task3Stack[TASK3_STACK_SIZE];
TCB_t Task3TCB;
int main(void)
{
/* 就绪列表初始化*/
prvInitialiseTaskLists();
/* 初始化延迟列表*/
prvInitialiseDelayLists();
/* 创建任务1*/
xTaskCreateStatic(Task1_Entry,"task1",TASK1_STACK_SIZE,0,1,Task1Stack,&Task1TCB);
/* 创建任务2*/
xTaskCreateStatic(Task2_Entry,"task2",TASK2_STACK_SIZE,0,1,Task2Stack,&Task2TCB);
/* 创建任务3*/
xTaskCreateStatic(Task3_Entry,"task3",TASK3_STACK_SIZE,0,2,Task3Stack,&Task3TCB);
/* 创建空闲任务*/
AppTaskCreateIdleTask();
/* 初始化 SysTick*/
vPortSetupTimerInterrupt();
/*启动任务*/
vTaskStartScheduler();
//理论是不会到这里
while(1){}
}
运行结果如下。
①任务3的优先级是最高的。
②任务1和任务2的时间片用完后,会切换到同一优先级的其他任务去。