简介
同等优先级任务轮流地享有相同的 CPU 时间(可设置), 叫时间片,在FreeRTOS中,一个时间片就等于SysTick 中断周期
注意:使用时间片调度需把宏 configUSE_TIME_SLICING 和 configUSE_PREEMPTION 置1
实验
实验设计:
将设计三个任务:start_task、task1、task2,其中task1和task2优先级相同均为2。 为了使现象明显,将滴答定时器的中断频率设置为50ms中断一次,即一个时间片50ms
三个任务的功能如下:
- start_task:用来创建其他的2个任务
- task1:通过串口打印task1的运行次数
- task2:通过串口打印task2的运行次数
代码部分:
配置部分
/* START_TASK 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO 1 /* 任务优先级 */
#define START_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t StartTask_Handler; /* 任务句柄 */
void start_task(void *pvParameters); /* 任务函数 */
/* TASK1 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK1_PRIO 2 /* 任务优先级 */
#define TASK1_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t Task1Task_Handler; /* 任务句柄 */
void task1(void *pvParameters); /* 任务函数 */
/* TASK2 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK2_PRIO 2 /* 任务优先级 */
#define TASK2_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t Task2Task_Handler; /* 任务句柄 */
void task2(void *pvParameters); /* 任务函数 */
创建任务部分及其他配置可自行看我前几篇博文 或者 该部分专栏
实现部分
void task1(void *pvParameters)
{
uint32_t task1_num = 0;
while (1)
{
taskENTER_CRITICAL();
printf("任务1运行次数: %d\r\n", ++task1_num);
taskEXIT_CRITICAL();
}
}
void task2(void *pvParameters)
{
uint32_t task2_num = 0;
while (1)
{
taskENTER_CRITICAL();
printf("任务2运行次数: %d\r\n", ++task2_num);
taskEXIT_CRITICAL();
}
}