UcOS-II时间管理.

Slides:



Advertisements
Similar presentations
因数与倍数 2 、 5 的倍数的特征
Advertisements

2 、 5 的倍数的特征 玉田百姓. 1 、在 2 、 3 、 5 、 8 、 10 、 12 、 25 、 40 这几个数中, 40 的因数有几个? 5 的倍数有几个? 复习: 2 、在 6 、 10 、 12 、 15 、 18 、 20 这几个数中,哪些数 是 2 的倍数?哪些数是 5 的倍数?
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
九年级物理一轮复习 第一章 声现象 知识要点. 1. 声音的产生和传播  ( 1 )声音的产生:声音是由于物体的振动产生的。  凡是发声的物体都在振动。振动停止,发声也停止。  ( 2 )声源:正在发声的物体叫声源。固体、液体、气体 都可以作为声源,有声音一定有声源。  ( 3 )声音的传播:声音的传播必须有介质,声音可以在.
第一章 声现象 第二节声音的特征.
回归教材、梳理知识、突出能力 ——2015年历史二轮复习思考 李树全 西安市第八十九中学.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
朝鲜.
健康檢查簡介 新湖國小健康中心 王淑華護理師 99/11/17.
湖南师大附中高三政治第二次月考 试题讲评 试题讲评.
第五章 C/OS-II在ARM系统中的应用与开发
嵌入式系统概论 —基于32位微处理器与实时操作系统 第五讲实时操作系统C/OS-Ⅱ分析 北京航空航天大学 机器人研究所 魏洪兴.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
身边的噪音 ——六(1)班班队活动 李瑷蔚 符蓉.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
日本 班級:六年四班 座號: 八號 姓名:楊維綱.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
嵌入式系统及应用.
嵌入式操作系统ucOS-II分析.
第7章 移植μC/OS-II到ARM7.
UcOS-II(RTOS)的基本概念.
UcOS-II任务管理.
嵌入式系统及应用.
《手把手教你学STM32-UCOS》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
UCOS -II的使用 撰写:李湧 2006-06-29.
《手把手教你学STM32-UCOS》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
网络常用常用命令 课件制作人:谢希仁.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Windows网络操作系统管理 ——Windows Server 2008 R2.
移植μC/OS-Ⅱ.
嵌入式系统 —嵌入式实时操作系统C/OS-Ⅱ分析 2006年5月.
第48组:姜立群(SC ) 谭兆路(SC ) 闫 佼(SC )
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
逆向工程-汇编语言
ΜC/OSⅡ中的任务调度 Group01小组 柴永锋 李逢春 苗 冬.
嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 北京航空航天大学 智能嵌入式技术工作室 王田苗 魏洪兴.
绿色圃中小学教育网 比例 比例的意义 绿色圃中小学教育网
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
3. µC/OS-II内核 2019/4/11.
第四章 MCS-51定时器/计数器 一、定时器结构 1.定时器结构框图
UcOS-II任务之间的通讯与同步.
6. 面向任务程序设计(TOP).
Ch6. uC/OS-II分析 宋健建 南京大学软件学院.
Lightweight Data-flow Analysis for Execution-driven Constraint Solving
Web安全基础教程
信号量(Semaphore).
《信息技术与教育技术》听觉媒体技术.
FBs系列PLC 高级应用篇高速计数/定时器
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
HSC高速输出例程 HORNER APG.
学习目标 1、了解基本运算符 2、运算符优先级.
2、5的倍数的特征 马郎小学 陈伟.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
力学实验复习 杨昌彪 月.
阻塞式模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
2.4 让声音为人类服务.
Chinese Virtual Observatory
信号发生电路 -非正弦波发生电路.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
《手把手教你学STM32-UCOS》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
上节复习(11.14) 1、方式2、方式0的特点? 2、定时/计数器的编程要点? 3、实验5方案优化问题.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
声音的特性.
Presentation transcript:

ucOS-II时间管理

与时钟节拍有关的系统服务 μC/OS-Ⅱ(其它内核也一样)要求用户提供定时中断来实现延时与超时控制等功能。 这个定时中断叫做时钟节拍,它应该每秒发生10至100次,时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就越重。 五个与时钟节拍有关的系统服务(见OS_TIME.C文件): OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet()

任务延时函数OSTimeDly() μC/OS-Ⅱ提供了这样一个系统服务:申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的。 实现这个系统服务的函数叫做OSTimeDly(),调用该函数会使μC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。 任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。(只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。)

OSTimeDly()程序 void OSTimeDly (INT16U ticks) /通过提供延时的时钟节拍数ticks(1 到65535之间),来调用该函数。 { if (ticks > 0) {(1) /如果时钟节拍数ticks为0值,则表明用户不想延时任务,函数会立即返回到调用者。 OS_ENTER_CRITICAL(); if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {(2) /将当前任务从就绪表中移除 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;} OSTCBCur->OSTCBDly = ticks;(3) /将延时节拍数被保存到当前任务的OS_TCB中,并且通过OSTimeTick()每隔一个时钟节拍就减少一个延时节拍数。 OS_EXIT_CRITICAL(); OSSched(); (4) /当任务已经不再处于就绪状态,任务调度程序会执行下一个优先级最高的就绪任务。 } }

延时过程分析 如果系统每隔10ms发生一次时钟节拍(100Hz)中断[下图(1)]。 假如用户没有执行其它的中断并且此时中断是开着的,时钟节拍中断服务就会发生[下图(2)]。 如果用户有几个高优先级的任务(HPT)在等待延时期满,它们会接着执行[下图(3)]。 接下来,低优先级任务(LPT)会得到执行的机会,该任务在执行完后马上调用[下图(4)] OSTimeDly(1)。 μC/OS-Ⅱ会使该任务处于休眠状态直至下一个节拍的到来。当下一个节拍到来后,时钟节拍中断服务子程序会执行[下图(5)],但是这一次由于没有高优先级的任务被执行,μC/OS-Ⅱ会立即执行申请延时一个时钟节拍的任务[下图(6)]。 该任务实际的延时少于一个节拍!在负荷很重的系统中,任务甚至有可能会在时钟中断即将发生时调用OSTimeDly(1),在这种情况下,任务几乎没有得到任何延时,因为任务马上又被重新调度了。如果用户的应用程序至少得延时一个节拍,必须要调用OSTimeDly(2),指定延时两个节拍!

延时过程分析图

按时分秒延时函数OSTimeDlyHMSM() 调用OSTimeDlyHMSM()函数也会使μC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。 任务调用OSTimeDlyHMSM()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上处于就绪态。同样,只有当该任务在所有就绪态任务中具有最高的优先级时,它才会立即运行。

OSTimeDlyHMSM()程序 INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli) {INT32U ticks; INT16U loops;   if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) { (1) /检验参数定义是否为有效的值 if (minutes > 59) {return(OS_TIME_INVALID_MINUTES); } if (seconds > 59) {return (OS_TIME_INVALID_SECONDS);} if (milli > 999) {return (OS_TIME_INVALID_MILLI);}

OSTimeDlyHMSM()程序(续) ticks = (INT32U)hours * 3600L * OS_TICKS_PER_SEC (2) /支持更长时间的延时 + (INT32U)minutes * 60L * OS_TICKS_PER_SEC + (INT32U)seconds * OS_TICKS_PER_SEC + OS_TICKS_PER_SEC * ((INT32U)milli + 500L/OS_TICKS_PER_SEC) / 1000L; (3) /需要延迟的时间所对应的时钟节拍总数(从指定的时间中计算出节拍总数 ) loops = ticks / 65536L; (4) /延时多少次超过65,535个节拍的数目 ticks = ticks % 65536L; (5) /和剩下的节拍数 OSTimeDly(ticks); (6) / OSTimeDlyHMSM()首先考虑剩下的节拍 while (loops > 0) {(7) /若OS_TICKS_PER_SEC的值为100,用户想延时15分钟,则OSTimeDlyHMSM()会延时15x60x100=90,000个时钟。这个延时会被分割成两次32,768个节拍的延时(因为用户只能延时65,535个节拍而不是65536个节拍)和一次24,464个节拍的延时。在这种情况下,OSTimeDlyHMSM()首先考虑剩下的节拍,然后是超过65,535的节拍数 OSTimeDly(32768); (8) OSTimeDly(32768); loops--; } return (OS_NO_ERR); } else {return (OS_TIME_ZERO_DLY); (9) /如果用户没有定义延时,则返回。 } } 例如,若OS_TICKS_PER_SEC的值为100,用户想延时15分钟,则OSTimeDlyHMSM()会延时15x60x100=90,000个时钟。这个延时会被分割成两次32,768个节拍的延时(因为用户只能延时65,535个节拍而不是65536个节拍)和一次24,464个节拍的延时。在这种情况下,OSTimeDlyHMSM()首先考虑剩下的节拍,然后是超过65,535的节拍数[L5.2(7)和(8)](即两个32,768个节拍延时)。

让处在延时期的任务结束延时OSTimeDlyResume()

恢复正在延时的任务OSTimeDlyResume()程序 INT8U OSTimeDlyResume (INT8U prio) { OS_TCB *ptcb;  if (prio >= OS_LOWEST_PRIO) {(1) /确保指定的任务优先级有效 return (OS_PRIO_INVALID); } OS_ENTER_CRITICAL(); ptcb = (OS_TCB *)OSTCBPrioTbl[prio]; if (ptcb != (OS_TCB *)0) {(2) /确认要结束延时的任务是确实存在的 if (ptcb->OSTCBDly != 0) {(3) /如果任务存在,则检验任务是否在等待延时期满,只要OS_TCB域中的OSTCBDly包含非0值就表明任务正在等待延时期满。 ptcb->OSTCBDly = 0; (4) /通过强制命令OSTCBDly为0来取消延时

恢复正在延时的任务OSTimeDlyResume()程序(续) if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {(5) /任务只有在没被挂起的情况下才能处于就绪状态 OSRdyGrp |= ptcb->OSTCBBitY; (6) /当上面的条件都满足后,任务就会被放在就绪表中 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; OS_EXIT_CRITICAL(); OSSched(); (7) /调用任务调度程序来看被恢复的任务是否拥有比当前任务更高的优先级,如果是的话则引起任务切换。 } else {OS_EXIT_CRITICAL(); } return (OS_NO_ERR);} else {OS_EXIT_CRITICAL(); return (OS_TIME_NOT_DLY);} } else {OS_EXIT_CRITICAL(); return (OS_TASK_NOT_EXIST);} }

系统时间OSTimeGet()和OSTimeSet() 无论时钟节拍何时发生,μC/OS-Ⅱ都会将一个32位的计数器加1。这个计数器在用户调用OSStart()初始化多任务和 (0~4,294,967,295)个节拍执行完一遍时,重新从0开始计数。 当时钟节拍的频率等于100Hz的时候,这个32位的计数器每隔 =497天就重新开始计数。 通过调用OSTimeGet()可以获得该计数器的当前值,也可以通过调用OSTimeSet()来改变该计数器的值。 注意,在访问OSTime的时候中断是关掉的。这是因为在大多数8位处理器上增加和拷贝一个32位的数都需要数条指令,这些指令一般都需要一次执行完毕,而不能被中断等因素打断。

得到和改变系统时间OSTimeGet()和OSTimeSet()程序 INT32U OSTimeGet (void) { INT32U ticks;  OS_ENTER_CRITICAL(); ticks = OSTime; OS_EXIT_CRITICAL(); return (ticks); }  void OSTimeSet (INT32U ticks) { OS_ENTER_CRITICAL(); OSTime = ticks; OS_EXIT_CRITICAL(); }