一、时间片调度简介
同等优先级任务轮流地享有相同的CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片就等于SysTick中断周期
1、同等优先级任务,轮流执行;时间片流转
2、一个时间片大小,取决为滴答定时器中断频率
3、主要没有用完的时间片不会再次使用,下次任务Task3得到执行,还是按照一个时间片执行
二、时间片调度实验演示
1、实验目的:学会对FreeRTOS时间片调度使用
2、实验设计:
将设计三个任务:timer_start_task、timer_task1、timer_task2其中timer_task1和timer_task2优先级相同均为2。
为了使现象明显,将滴答定时器的中断频率设置为50ms中断一次,即一个时间片50ms
任务功能:
(1)timer_start_task:用来创建其他的2个任务
(2)timer_task1:通过串口打印timer_task1的运行次数
(3)timer_task2:通过串口打印timer_task2的运行次数
注意:使用时间片调度需要把宏configUSE_TIME_SLCING 和configUSE_PREEMPTION置1
#define TIMER_START_TASK_PRIO 1
#define TIMER_START_STK_SIZE 128
TaskHandle_t TimerStartTask_Handler;
void timer_start_task(void *pvParameters);
#define TIMER_TASK1_PRIO 2
#define TIMER_TASK1_SIZE 128
TaskHandle_t TimerTask1_Handler;
void timer_task1(void *pvParameters);
#define TIMER_TASK2_PRIO 2
#define TIMER_TASK2_SIZE 128
TaskHandle_t TimerTask2_Handler;
void timer_task2(void *pvParameters);
void Timer_Start_init(void)
{
xTaskCreate((TaskFunction_t )timer_start_task,
(const char* )"timer_start_task",
(uint16_t ) TIMER_START_STK_SIZE,
(void* )NULL,
(UBaseType_t )TIMER_START_TASK_PRIO,
(TaskHandle_t* )&TimerStartTask_Handler);
// vTaskStartScheduler(); //开启任务调度
}
void timer_start_task(void *pvParameters)
{
taskENTER_CRITICAL(); /*进入临界区*/
xTaskCreate((TaskFunction_t )timer_task1,
(const char* )"timer_task1",
(uint16_t ) TIMER_TASK1_SIZE,
(void* )NULL,
(UBaseType_t )TIMER_TASK1_PRIO,
(TaskHandle_t* )&TimerTask1_Handler);
xTaskCreate((TaskFunction_t )timer_task2,
(const char* )"timer_task2",
(uint16_t ) TIMER_TASK2_SIZE,
(void* )NULL,
(UBaseType_t )TIMER_TASK2_PRIO,
(TaskHandle_t* )&TimerTask2_Handler);
vTaskDelete(TimerStartTask_Handler);
taskEXIT_CRITICAL(); /*退出临界区*/
}
void timer_task1(void *pvParameters)
{
static uint32_t task1_cnt = 0;
while(1)
{
task1_cnt++;
LED0 =! LED0;
taskENTER_CRITICAL();
printf("task1打印了 %d 次 \n",task1_cnt);
taskEXIT_CRITICAL();
delay_ms(10);
}
}
void timer_task2(void *pvParameters)
{
static uint32_t task2_cnt = 0;
while(1)
{
task2_cnt++;
LED1 =! LED1;
taskENTER_CRITICAL();
printf("task2打印了 %d 次 \n",task2_cnt);
taskEXIT_CRITICAL();
delay_ms(10);
}
}