首页 > 其他分享 >UCOSIII 时间片轮调度接口OS_SchedRoundRobin详解

UCOSIII 时间片轮调度接口OS_SchedRoundRobin详解

时间:2024-07-26 23:55:06浏览次数:8  
标签:UCOSIII SchedRoundRobin 调度 任务 time 片轮 OS CPU

        时间片轮调度(Round-Robin Scheduling)是一种常见的任务调度算法,它将CPU时间片均匀地分配给每个任务,确保每个任务在一定时间内能够获得CPU资源。这种调度方式适用于需要公平分配CPU时间的系统,特别是在有多个相同优先级的任务时,片轮调度能有效防止某个任务长期占用CPU资源。本文将详细介绍uCOS-III中的片轮调度的配置使用及实现原理。

 1. 片轮调度的配置及使用

1.1 编译前配置宏定义使能

在配置片轮调度之前,需要在配置文件 os_cfg.h 中使能相关宏定义:

#define OS_CFG_SCHED_ROUND_ROBIN_EN  1u  /* Enable (1) or Disable (0) Round Robin scheduling */

1.2 运行时配置使能及片轮时间

void OSSchedRoundRobinCfg(CPU_BOOLEAN en, OS_TICK dflt_time_quanta, OS_ERR *p_err);

参数解释:

  • en:确定是否启用片轮调度,当值为 OS_TRUE 时启用,为 OS_FALSE 时禁用。
  • dflt_time_quanta:默认的时间片长度(单位为系统时钟节拍),如果设置为0,则默认值为 OSCfg_TickRate_Hz / 10
  • p_err:指向错误代码变量的指针,函数返回时会通过该变量报告错误状态。

2. 时间片轮调度的使用场景

多任务环境:系统中有多个相同优先级的任务需要公平地分配CPU时间。

任务并发:提高任务的响应速度,确保系统的实时性和公平性

3. 片轮调度的实现原理

        片轮调度的核心实现包括 OS_SchedRoundRobinOSSchedRoundRobinYield 函数。OS_SchedRoundRobin 函数在每个系统时钟节拍(tick)中被调用,用于更新当前任务的时间片计数器并决定是否需要切换任务。而 OSSchedRoundRobinYield 函数允许任务在完成当前时间片之前主动放弃CPU。

3.1 OS_SchedRoundRobin 调用流程图

3.1 OS_SchedRoundRobin 实现流程图

4. 如何配置任务时间片长度 

可以通过以下方式配置任务的时间片长度:

全局配置:使用 OSSchedRoundRobinCfg 函数设置所有任务的默认时间片长度。

void OSSchedRoundRobinCfg(CPU_BOOLEAN en, OS_TICK dflt_time_quanta, OS_ERR *p_err);

任务创建时配置:在创建任务时,通过 OSTaskCreate 函数的 time_quanta参数设置特定任务的时间片长度。

p_tcb->TimeQuanta = time_quanta; /* Save the #ticks for time slice (0 means not sliced) */
if (time_quanta == 0u) {
    p_tcb->TimeQuantaCtr = OSSchedRoundRobinDfltTimeQuanta;
} else {
    p_tcb->TimeQuantaCtr = time_quanta;
}

运行时配置:使用 OSTaskTimeQuantaSet 函数在任务运行期间动态修改特定任务的时间片长度。

void OSTaskTimeQuantaSet(OS_TCB *p_tcb, OS_TICK time_quanta, OS_ERR *p_err);

5. 任务主动放弃时间片

  当前任务调用OSSchedRoundRobinYield, 主动放弃剩余的时间片,让出CPU,以便调度器能切换到其他任务执行。

6. 时间片轮调度的缺点

  • 效率问题:时间片轮调度需要频繁地切换任务,这会带来一定的上下文切换开销,尤其是在任务切换频繁的情况下。
  • 锁竞争问题:在多任务环境中,不同任务对资源的竞争可能导致死锁的问题。
  • 临界资源问题:在多任务环境中,临界资源竞争问题可能会破坏数据的完整性及可视化

总结

        片轮调度是一种有效的任务调度策略,能够确保同优先级任务之间的公平性。在uCOS-III中,通过配置和使用片轮调度,可以在多任务环境中实现高效的任务管理。然而,需要根据系统的具体情况合理配置时间片长度,以避免潜在的效率问题、临界资源竞争问题。

标签:UCOSIII,SchedRoundRobin,调度,任务,time,片轮,OS,CPU
From: https://blog.csdn.net/sensorfeng/article/details/140678618

相关文章

  • ucosiii(1): 时钟节拍函数
    时钟节拍中断调用OSTimeTick()函数voidOSTimeTick(void){if(OSRunning!=OS_STATE_OS_RUNNING){return;}>OSTimeTickHook();/*Calluserdefinablehook*/#if(OS_CF......
  • FreeRTOS 简单内核实现8 时间片轮询
    0、思考与回答0.1、思考一为什么要增加时间片轮询?目前的RTOS内核已经支持抢占优先级,即高优先级的任务会抢占低优先级的任务得到执行,但是对于同等优先级的任务,如果不支持时间片轮询,则只能有一个任务运行,并且由于优先级相同所以除延时阻塞到期外也不会发生任务调度,因此需要增加......
  • CPU 时间片轮转机制
    CPU时间片轮转机制我们平时在开发的时候,感觉并没有受cpu核心数的限制,想启动线程就启动线程,哪怕是在单核CPU上,为什么?这是因为操作系统提供了一种CPU时间片轮转机制。时间片轮转调度是一种最古老、最简单、最公平且使用最广的算法,又称RR调度。每个进程被分配一个时间段,......
  • (学习日记)2024.04.11:UCOSIII第三十九节:软件定时器
    写在前面:由于时间的不足与学习的碎片化,写博客变得有些奢侈。但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。既然如此不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜......
  • 操作系统综合题之“采用时间片轮转调度算法(Round-Robin,RR)执行,分时系统中的进程可能出
    一、问题:某分时系统中的进程可能出现下图所示的状态变化,请回答下列问题:1.根据图示,您认为该系统采用的是什么进程调度策略?2.把图中所示的每一个状态变化的原因填在下表相应位置。变化原因1 2 3 4 5 6 二、参考答案答:1.时间片轮转调度......
  • 操作系统综合题之“采用时间片轮转调度算法(Round-Robin,RR)执行5个进程,P1进程周转时间
    一、问题:系统中有5个进程P1、P2、P3、P4、P5,它们的到达时间和服务时间如题9表所示。忽略I/O以及其他开销时间,若采用时间片轮转调度算法(时间片为1),则P1的周转时间为多少? 二、参考答案完整执行线p1,p2,p3,p4 ,p1,p2,p3,p4,p5,  p1,p3,p4,p5, p1,p3因为最后一次p1执行完......
  • 1. UCOSIII简介
    µC/OS-III的发音为“MicroCOSThree”,这意味着µC/OS-III是基于C语言编写的第三代小型操作系统。单个优先级任务数:比如说优先级是2,那么优先级为2时,可以创建多少个任务数量时间片调度是针对同等有限级任务的,因为第一代和第二代没有同等优先级任务,因此就没有时间片调度......
  • Bootstrap5 图片轮播
    Bootstrap5轮播样式表使用的是CDN资源<title>亚丁号</title><!--自定义样式表--><linkhref="static/front/css/front.css"rel="stylesheet"/><!--新Bootstrap5核心CSS文件--><linkrel="stylesheet"h......
  • 04_实验四_时间片轮转
    线程调度实验目的调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。为EOS添加时间片轮转调度,了解其它常用的调度算法。预备知识基于优先级的抢先式调度EOS使用双向链表存储同一个优先级的队列,用数组存放32个这种双向链表,并用下标表示不同优先级大小,同时设置一个32位就绪......
  • 嵌入式裸机设计思想——时间片轮裸机开发架构+状态机+定时器调度机制
    前言(1)(2)在MCU开发的时候,很多入门者会固执的认为,做项目一定要上实时操作系统。但是真的是这样的吗?(3)我曾经阅读过一位10年嵌入式开发经验的大佬分享的公众号,这位大佬感叹到,其实对于绝大多数时候,MCU开发不需要上操作系统。只要任务分配的合理,百分之九十的项目不上操作系统都是能够跑......