ucos 时钟节拍_uC/OS-III 时钟节拍,时间管理,时间片调度

时钟节拍

时钟节拍可谓是 uC/OS 操作系统的心脏,它若不跳动,整个系统都将会瘫痪。 时钟节拍就是操作系统的时基,操作系统要实现时间上的管理,必须依赖于时基。

时钟节拍就是系统以固定的频率产生中断(时基中断),并在中断中处理与时间相关的

事件,推动所有任务向前运行。 时钟节拍需要依赖于硬件定时器, 在 STM32 裸机程序中经

常使用的 SysTick时钟是 MCU的内核定时器,通常都使用该定时器产生操作系统的时钟节拍。

用户需要先在“os_cfg_app.h”中设定时钟节拍的频率,该频率越高,操作系统检测事

件就越频繁,可以增强任务的实时性,但太频繁也会增加操作系统内核的负担加重,所以用

户需要权衡该频率的设置。在这里采用默认的 1000 Hz(之后若无特别声明,均采

用 1000 Hz),也就是时钟节拍的周期为 1 ms。

f4ca706f75e59cae0caf6c5f13ce4a82.png

时间管理

OSTimeDly()

e49b87ce04263347b26b2c2b716f94f8.png

任务调用这个函数后就会被挂起直到期满。这个函数可以有三种模式:相对延时模式,周期性延时模式,绝对定时模式

ad4fd31f11dcaaf4a729fab9f695d0ec.png

( 1) 第一个参数是任务的延时时基数。 如果时基速率被设置为

1000Hz, 任务会每次执行都会被延时大约2毫秒。 然而, 并不是精确

地延时2个时基,因为任务被挂起后是检测时基中断发生的次数与任

务的延时值是否相同来判断是否超时的。 也就是说, 当任务在时基中

断将要到来时被挂起,那么实际的延时时基会少1个时基( 2)参数为OS_OPT_TIME_DLY表明用户选择的相对延时模式

OS_OPT_TIME_DLY

指定相对延迟。

OS_OPT_TIME_TIMEOUT

等同OS_OPT_TIME_DLY。

OS_OPT_TIME_PERIODIC

指定周期模式。

OS_OPT_TIME_MATCH

指定任务在OSTickCtr达到指定的值时将被唤醒dly(绝对延时)

( 3)如大多数 uC/OS-III函数一样,错误代号会被返回。当所有的参数都是有效时会返回OS_ERR_NONE。( 4) 当返回不为OS_ERR_NONE时, OSTimeDly()将不会执行延时操作

54dc3e42e0db8114073b55cb4d54c073.png

OSTimeDlyHMSM()

27560247cf8b4358257db4a73f41c0dd.png

任务可以调用这个函数为任务设置延时,这个函数更“ 友好” 于

用户。特别的,可以设置为小时,分钟,秒,毫秒( HMSM由此四

个英文首字母得来)。这个函数只在相对延时模式下运行 。

a24ef2f69792b5a3819c0b574ae6de57.png

(1)这四个参数设置了延时的时间(分别对应为时、分、秒、

毫秒)。在这个例子中,设置了延时1秒。延时的分辨率决定于时基

频率。例如,如果时基频率为1000Hz那么延时的分辨率为1毫秒。

如果时基的频率为100Hz那么延时的分辨率为10毫秒。同样的,延时时间不会很精确 。

( 2)设置 OS_OPT_TIME_HMSM_STRICT后会检测函数的参

数是否合理。小时的范围是 0到 99,分的范围是 0到59,秒的范围

是0到59,毫秒的范围是0到999。

如果设置为 OS_OPT_TIME_HMSM_NON_STRICT,函数会接受

参数的范围变大。小时的范围是0到999,分的范围是0到9999,秒

的范围是0到65535,毫秒的范围是0到4294967295。

限制小时范围为0到999的原因是:一般是用32位的数记录时基

值的。如果时基的频率为1000Hz,那么最多能计数 4294967秒,大

约1193小时。因此设置999小时为上限( 3)如大多数uC/OS-III函数一样返回一个错误代号OSTimeDly()和 OSTimeDlyHMSM()经常被用于创建周期性的任

务。 例如, 设置任务每50毫秒扫描一次键盘、 每10毫秒读取AD输入等 。

4768331ec9a613d0dfa231c1b96c7a43.png

OSTimeDlyResume()

OSTimeDlyResume ()函数用于直接结束其他任务(非当前任务)的延时。 用户若要使用

OSTimeDlyResume ()函数,得事先将宏OS_CFG_TIME_DLY_RESUME_EN(位于“os_cfg.h”)设为 1。

48e4fc9f377e6cf8a99107552ace9990.png

c77eecbfa920f5883954ebf2c473e966.png

OSTimeGet ()

OSTimeGet ()函数用于获取当前的时钟节拍计数值。OSTimeGet ()函数的信息如下表所示。

ac46e68376d8ec39ee0ae17bbb47109d.png

OSTimeSet ()

OSTimeSet ()函数用于设置当前的时钟节拍计数值。OSTimeSet ()函数的信息如下表所示。

0c1dc3892b0674258e1a8e3d9fcfaaf3.png

代码练兵场(时间轮转片调度方式):

在任务中一定要增加条件编译,如下图方框处:

f37e9e6003335074212b5585066f8597.png

并且在下图所示文件中,使能时间片的宏:

a5b658adc9ee5a9975af5ca9258eaeb2.png

这样,创建相同优先级的任务,采用时间轮转片的方式进行调度。

OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);

其中OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);

函数参数一:DEF_ENABLED使能调度轮转法,DEF_DISBLED失能调轮转法。

参数二:用来设置时间片长度。时间长度 = 参数值*时间节拍。其中时间节拍与系统时间频率OS_CFG_TICK_RATE_HZ,互为倒数。

第二步:创建任务时,通过设置(OS_TICK  )参数,来设置任务拥有几个时间片。

528a8da91f379bdf60129e844924026a.png

红色方框处:任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10)

我们可以查看源码如下:

25a92e93a53357002b7296491680369d.png

1. 由于这几个参数是全局变量,所以必须关闭中断。

2. 根据形参设置是否使能时间片调度。

3. 变量 OSSchedRoundRobinDfltTimeQuanta 是用来设置默认的时间片个数,也就是说,如果程序中

没有单独配置任务的时间片个数,就会使用这个默认时间片个数。

放弃剩余时间片OSSchedRoundRobinYield ()这个函数的主要功能就是任务在完成工作的情况下,如果还有剩余的时间片,可以放弃这些时间去执行另外的同优先级任务(切记,是另外的同优先级任务) 。

678d8a80993b5205761db33a42ea11eb.png

e80724f7f4af5671558421af28b18dfb.png

1. 获取此优先级的就绪链表。从而得到此优先级下任务的个数,如果同优先级下只有一个任务,将退出

这个函数。

2. 移动同优先级就绪链表中任务的位置,从实现同优先级下任务的切换。

3. 参数 p_tcb->TimeQuanta = 0 的时候就会使用默认的时间片个数,如果非 0,就会给这个任务的时

间片计数器赋予相应的时间片个数。

4. 执行任务调度。

bf4e9b614f09884213cfdbfc27ea4fd5.png

当多个任务有相同的优先级时,μCOS-III 允许任务在切换到另一个任务前运行特定的时间,也就是大

家常说的时间片。这个过程就是 Round-Robin 调度或者时间片调度。如果任务不需要将所有的时间片用

完,可以调用上面讲的函数 OSSchedRoundRobinYield (),放弃剩余时间片从而切换到同优先级的另一

个任务。 μCOS-III 支持用户在系统运行过程中使能或者禁止时间片调度,同时也支持全局的时间片设置,

也支持每个任务的单独设置 。

时间片轮转调度算法的作用及原理:

作用:用于相同优先级任务的切换。

原理:在ucos iii中任务优先级是依靠一个数组变量来实现的,数组变量的每一位代表一个优先级。当某一位为1时,代表当前优先级有任务已经处于就绪状态。等待CPU分配。当两个处于同一优先级的任务同时就绪时,则取任务链表中的第一个任务执行(每个优先级都拥有一个任务链表,该链表中任务的优先级均相同)。当该任务时间片用完时,将该任务插入任务链表尾部。由此就能完成时间片轮转调度了。

和FreeRTOS相比,ucos做得并没有那么好,前者如果没有使能某些配置就编译,会报错误,能更好的提示编程者,不过基本原理大家都一样。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值