FreeRTOS 时间片调度

简介

同等优先级任务轮流地享有相同的 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();
    }
}

 实验效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值