时间片在FreeRTOS中的含义解析

什么是时间片

时间片是一个任务被任务调度管理器强制切换出CPU之前连续运行的最长时间。

FreeRTOS 中,时间片的长度固定为 1 个 tick。

tick的时长可以通过配置文件FreeRTOSConfig.h中的宏定义configTICK_RATE_HZ修改。

每个时间片的长度 (秒) = 1 / configTICK_RATE_HZ。

复制代码
// 将Tick频率设置为1000Hz,此时1个Tick = 1ms
#define configTICK_RATE_HZ    1000

什么是时间片轮转

时间片轮转是一种任务调度算法,让多个同优先级任务轮流使用 CPU,每个任务每次运行一个固定长度的时间片,时间片用完后强制切换到下一个任务。

时间片轮转的触发机制

复制代码
void vTask1(void *pvParameters)
{
    for(;;)
    {
        printf("Task1 running\r\n");
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

这里printf() 执行时间极短(比如 10 微秒),然后任务主动调用 vTaskDelay(),立即进入阻塞态。

任务在 printf() 刚执行完就主动让出了 CPU。时间片轮转并没有触发。

因为时间片轮转触发的前提是:任务连续运行满 1 个 tick 且没有主动让出。

任务在 1 个 tick 还没到(才运行了 10 微秒)就主动调用 vTaskDelay() 阻塞了,所以:

✅ 触发的是 vTaskDelay() 的阻塞机制。

❌ 没有触发时间片轮转机制。

复制代码
void Task_TimeSlice(void *pv) {
    while(1) {
        for(int i = 0; i < 1000000; i++);  // 耗时 > 1 tick
       vTaskDelay(1000);
    }
}

即使后面有 vTaskDelay(1000),for(int i = 0; i < 1000000; i++)超过1 tick,CPU也会强制进行任务切换。

如果不想比打断可以使用临界区:

复制代码
taskENTER_CRITICAL();
for(int i = 0; i < 1000000; i++);  // 不会被中断
taskEXIT_CRITICAL();

时间片轮转的开关

  • configUSE_TIME_SLICING = 1 (开启):系统会在每个Tick中断时,检查当前优先级下是否还有其他就绪任务。如果有,就强制切换到下一个任务,实现时间片轮转调度。
  • configUSE_TIME_SLICING = 0 (关闭):系统关闭自动轮转。此时,同优先级任务之间不会因为Tick中断而自动切换,必须通过任务主动阻塞(如调用vTaskDelay)或主动让出(如调用taskYIELD())才能发生切换。
    注意:configUSE_TIME_SLICING 只有开(1)和关(0)两种状态。
相关推荐
捷瑞电子工坊3 天前
FreeRTOS中断管理:从原理到实践(标准库版)
嵌入式·freertos·实时操作系统·任务通知·临界区·中断管理·二值信号量
捷瑞电子工坊3 天前
FreeRTOS 内存管理详解:从 heap_1 到 heap_5 的选择与实践
freertos·内存管理·嵌入式开发·内存碎片·嵌入式实时操作系统·动态内存分配
qq_401700414 天前
FreeRTOS队列集--允许任务同时在多个队列或信号量上阻塞等待读取操作
freertos
hsjiasb4 天前
FreeRTOS学习(三十九)——最终总结
学习·学习笔记·freertos
捷瑞电子工坊5 天前
FreeRTOS事件组:多任务同步的利器
stm32·嵌入式·freertos·实时操作系统·标准外设库·事件组·任务同步
hsjiasb5 天前
FreeRTOS学习(三十八)——性能优化
学习·学习笔记·freertos
hsjiasb5 天前
FreeRTOS学习(三十七)——常见错误与工程规范
学习·学习笔记·freertos
捷瑞电子工坊6 天前
FreeRTOS任务管理:从入门到实践(标准库版)
stm32·嵌入式·freertos·实时操作系统·任务管理·标准外设库·任务挂起与恢复
hsjiasb7 天前
FreeRTOS学习(三十五)——系统架构综合项目
学习·学习笔记·freertos
拾知_H8 天前
STM32+FreeRTOS基础配置
stm32·嵌入式硬件·freertos