uC/OS-III 时钟节拍,时间管理,时间片调度
uC/OS-III 时钟节拍,时间管理,时间片调度
时钟节拍
时钟节拍可谓是 uC/OS 操作系统的心脏,它若不跳动,整个系统都将会瘫痪。 时钟节拍就是操作系统的时基,操作系统要实现时间上的管理,必须依赖于时基。
时钟节拍就是系统以固定的频率产生中断(时基中断),并在中断中处理与时间相关的
事件,推动所有任务向前运行。 时钟节拍需要依赖于硬件定时器, 在 STM32 裸机程序中经
常使用的 SysTick时钟是 MCU的内核定时器,通常都使用该定时器产生操作系统的时钟节拍。
用户需要先在“os_cfg_app.h”中设定时钟节拍的频率,该频率越高,操作系统检测事
件就越频繁,可以增强任务的实时性,但太频繁也会增加操作系统内核的负担加重,所以用
户需要权衡该频率的设置。在这里采用默认的 1000 Hz(之后若无特别声明,均采
用 1000 Hz),也就是时钟节拍的周期为 1 ms。 
时间管理
OSTimeDly()

任务调用这个函数后就会被挂起直到期满。这个函数可以有三种模式:相对延时模式,周期性延时模式,绝对定时模式 
( 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()将不会执行延时操作
OSTimeDlyHMSM()

任务可以调用这个函数为任务设置延时,这个函数更“ 友好” 于
用户。特别的,可以设置为小时,分钟,秒,毫秒( HMSM由此四
个英文首字母得来)。这个函数只在相对延时模式下运行 。

( 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输入等 。
OSTimeDlyResume()
OSTimeDlyResume () 函数用于直接结束其他任务(非当前任务)的延时。 用户若要使用
OSTimeDlyResume () 函数,得事先将宏 OS_CFG_TIME_DLY_RESUME_EN(位于“os_cfg.h”)设为 1。 

OSTimeGet ()
OSTimeGet () 函数用于获取当前的时钟节拍计数值。 OSTimeGet () 函数的信息如下表所示。 
OSTimeSet ()
OSTimeSet () 函数用于设置当前的时钟节拍计数值。 OSTimeSet () 函数的信息如下表所示。 
代码练兵场(时间轮转片调度方式):
在任务中一定要增加条件编译,如下图方框处:

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

这样,创建相同优先级的任务,采用时间轮转片的方式进行调度。
红色方框处:任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10)
我们可以查看源码如下:

1. 由于这几个参数是全局变量,所以必须关闭中断。
2. 根据形参设置是否使能时间片调度。
3. 变量 OSSchedRoundRobinDfltTimeQuanta 是用来设置默认的时间片个数,也就是说,如果程序中
没有单独配置任务的时间片个数,就会使用这个默认时间片个数。
放弃剩余时间片OSSchedRoundRobinYield ()
这个函数的主要功能就是任务在完成工作的情况下,如果还有剩余的时间片,可以放弃这些时间去执行另外的同优先级任务(切记,是另外的同优先级任务) 。

1. 获取此优先级的就绪链表。从而得到此优先级下任务的个数,如果同优先级下只有一个任务,将退出
这个函数。
2. 移动同优先级就绪链表中任务的位置,从实现同优先级下任务的切换。
3. 参数 p_tcb->TimeQuanta = 0 的时候就会使用默认的时间片个数,如果非 0,就会给这个任务的时
间片计数器赋予相应的时间片个数。
4. 执行任务调度。

当多个任务有相同的优先级时,μCOS-III 允许任务在切换到另一个任务前运行特定的时间,也就是大
家常说的时间片。这个过程就是 Round-Robin 调度或者时间片调度。如果任务不需要将所有的时间片用
完,可以调用上面讲的函数 OSSchedRoundRobinYield (),放弃剩余时间片从而切换到同优先级的另一
个任务。 μCOS-III 支持用户在系统运行过程中使能或者禁止时间片调度,同时也支持全局的时间片设置,
也支持每个任务的单独设置 。
uC/OS-III 时钟节拍,时间管理,时间片调度的更多相关文章
- uc/os iii移植到STM32F4---IAR开发环境
也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...
- uC/OS - III 移植 IAR平台
关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...
- 在STM32F401上移植uC/OS的一个小问题 [原创]
STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...
- 关于uC/OS的简单学习(转)
1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...
- RTX——第12章 系统时钟节拍和时间管理
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 RTX 操作系统的时钟节拍和时间管理函数,其中时间管理函数是 RTX 的基本函数,初学 ...
- FreeRTOS 系统时钟节拍和时间管理
以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的时钟节拍任何操作系统都需要提供一个时钟节拍,以供系统处理诸如延时. 超时等与时间相关的事 ...
- uC/OS-III 时间管理(二)
时间管理就是一种建立在时钟节拍上,对操作系统任务的运行实现时间上管理的一种系统内核机制. 常用以下五个函数: OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() ...
- uC/OS-III 时钟节拍(一)
时钟节拍就是操作系统的时基,操作系统要实现时间上的管理,必须依赖于时基(时基即时间基准,操作系统的基准时钟). uC/OS-III时钟节拍的实现过程 时钟节拍就是系统以固定的频率产生中断(时基中断), ...
- Linux时间管理涉及数据结构和传统低分辨率时钟的实现
上篇文章大致描述了Linux时间管理的基本情况,看了一些大牛们的博客感觉自己写的内容很匮乏,但是没办法,只能通过这种方式提升自己……闲话不说,本节介绍下时间管理下重要的数据结构 设备相关数据结构 // ...
随机推荐
- PHP如何批量更新MYSQL中的数据
最近项目需要用到批量更新数据库里的数据,在网上找了一下这方面的例子,觉得这个还不错,分享给大家. 在这个业务里里面涉及到了更新两张数据表,那么大家是不是会想到非常简单,马上上代码 $sql ,type ...
- JdbcTemplate 方法使用
作者QQ:1095737364 QQ群:123300273 欢迎加入! execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句: update方法及batchUpdate ...
- 【读书笔记】iOS-网络-三种错误
一,操作系统错误. iOS人机界面指南中,Apple建议不要过度使用AlertViews,因为这会破坏设备的使用感受. 操作系统错误: 1,没有网络. 2,无法路由到目标主机. 3,没用应和监听目标端 ...
- hadoop完全分布式的安装
下载地址: centos 7.5 下载地址 清华 http://mirrors.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DV ...
- 腾讯Ocr文字识别
简述 上篇文章记录了百度Ocr的两种模式用法,接下来这篇文章开始记录腾讯Ocr的使用方法.腾讯Ocr的通用印刷体识别模式使用比较简单,直接接入sdk即可,但手写体的识别相对比较麻烦,需要自己post表 ...
- 微信小程序获取Access_token和页面URL生成小程序码或二维码
1.微信小程序获取Access_token: access_token具体时效看官方文档. using System; using System.Collections.Generic; using ...
- Android应用程序进程启动过程(前篇)
在此前我讲过Android系统的启动流程,系统启动后,我们就比较关心应用程序是如何启动的,这一篇我们来一起学习Android7.0 应用程序进程启动过程,需要注意的是“应用程序进程启动过程”,而不是应 ...
- D3、EChart、HighChart绘图demol
1.echarts: <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- 使用vue脚手架(vue-cli)快速搭建项目
一.从最简单的环境搭建开始: 安装node.js,从node.js官网下载并安装node,安装过程很简单,一路“下一步”就可以了(傻瓜式安装).安装完成之后,打开命令行工具(win+r,然后输入cmd ...
- 使用代码段遍历,枚举类型Enum
最近项目中定义了一些枚举类型,需要将枚举的键值传给前端,用于制作下拉菜单. 1.首先定义了枚举类型 public enum 请假类型 : int { 病假 = 1, 事假 = 2, 婚假 = 3, 产 ...