uC/OS-II中的时间 (转)
时间是一个非常重要的概念,我们和朋友出去游玩需要约定一个时间,做事情也需要花费一段时间,总之,我们的生活离不开时间。操作系统也一样,也需要一个时间来规范其任务的执行。
我们生活中,时间的最小单位是秒,硬件电路中,产生的最小的时间是晶振的频率,在操作系统中,其最小的时间单位叫做时钟节拍(Time Tick),其是有硬件定时器产生的一个周期为毫秒(ms)级的时间,即当定时器达到指定的时间后,产生一个中断(OSTickISR()),时钟节拍即两个中断之间间隔的时间。
当进入时钟节拍中断函数(OSTickISR())后,其首先保存CPU寄存器的值,(其值保存在哪呢?执行ISR和执行任务的时候,保存的地方应该不同啊,执行任务的时候,应该保存在任务堆栈中,但执行ISR的时候,保存在哪呢?)对终端嵌套层数(OSIntNesting)加1,然后判断其是否没有中断嵌套的情况,如果没有,则将堆栈指针(SP)赋值给当前任务的TCB成员OSTCBStkPtr。接着调用时钟节拍函数(OSTimeTick()),再接着清除中断,最后退出中断(OSIntExit()),在推出中断函数中,会引发一次任务调度。
在时钟节拍函数(OSTimeTick())中,主要的任务有两个,一是给记录时间的变量OSTime+1,二是遍历所有的任务控制块链表,给任务块中用来保存任务延时时限的OSTCBDly-1(即告诉任务,时间已经过去一个节拍了),若非挂起任务的时限已经到了,则使其进入任务就绪状态(注意:是非挂起的任务,挂起的任务(OSTaskSuspend()),必须调用恢复任务函数(OSTaskResume())来恢复其状态)。
有的时候,我们希望在每个时钟节拍都做一些工作,比如现实生活中,我让手机信号灯每秒钟闪一下。我们可以调用时钟节拍服务函数的钩子函数(OSTimeTickHook())完成这项任务。钩子函数有很多种,比如在任务切换的时候,要做的工作(OSTaskSwHook())。总共有10个这样的钩子函数。当然,如果不是很必要,最好必要使用钩子函数,因为执行也需要时间,会造成定时不准确。(在执行钩子函数的时候,硬件定时器不一样也是在工作的吗?当它达到定时时间的时候,一样会产生中断,这样会造成定时不准确吗?)
在每个任务(除了空闲任务)中,都必须使用延时函数(OSTimeDly())来使当前任务的运行暂停一段时间并执行一次任务调度,使系统去执行其他优先级高的就绪任务,否则该任务会一直占用CPU的使用权,造成任务的独占CPU的现象。
OSTimeDly()的作用就是将延时的时限存入任务控制开TCB的成员OSTCBDly中,并取消当前任务的就绪状态,接着进行一次任务调度,使系统去执行任务优先级最高的就绪任务。OSTimeDly(INT16U ticks)是以时钟节拍数来定时的一个函数,系统还定义了另一个延时函数INT8U OSTimeDlyHMSM(INT8U hours, INT8U minutes, int8u seconds, INT8U milli),即规定时、分、秒、毫秒。
有使任务延时的函数,自然也需要使任务取消延时的函数,OSTimeDiy(),无论调用的是上述中的那种延时函数,都是通过调用OSTimeDlyResume()取消该任务的延时从而进入就绪状态。该函数的原型是 INT8U OSTimeDlyResume(INT8U prio);
最后,还可以调用OSTimeGet()和OSTimeSet()来获取或设置系统时间,即发生的时钟节拍数(OSTime的值)。其函数原型分别问 INT32U OSTimeGet(void)和void OSTimeSet(INT32U ticks)。
uC/OS-II中的时间 (转)的更多相关文章
- 【原创】uC/OS II 任务切换原理
今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
- uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()
1. OSTaskCreate() OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务.注意,ISR中禁止建立任务,一个任务必须为无限循环结构. ...
- uc/os iii移植到STM32F4---IAR开发环境
也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...
- 【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理
LES BX, DWORD PTR DS:_OSTCBCur ;OSTCBCur->OSTCBStkPtr = SS:SP!!! ], SS ;将当前SS(栈的基地址)寄存器值存放至当前任务控制 ...
- 关于uC/OS的简单学习(转)
1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...
- uC/OS-III 时钟节拍,时间管理,时间片调度
uC/OS-III 时钟节拍,时间管理,时间片调度 时钟节拍 时钟节拍可谓是 uC/OS 操作系统的心脏,它若不跳动,整个系统都将会瘫痪. 时钟节拍就是操作系统的时基,操作系统要实现时间上的管理, ...
- 在STM32F401上移植uC/OS的一个小问题 [原创]
STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...
随机推荐
- 转:BZERO()等的区别
BZERO()等的区别 bzero 原型: extern void bzero(void *s, int n); 用法: #include <string.h> 功能:置字节字符串s的前 ...
- 转:MFC文件操作
讲到文件操作我们会联想到自己手动操作文件会涉及到哪些内容.很容易想到的是查看文件(文件夹)是否存在,创建,复制,删除,剪切文件(文件夹).另外就是设置文件的属性. 那MFC中一些操作文件的类也差不多是 ...
- Android使用百度地图定位
下面事例是使用Android平台的部分代码.对于这个平台百度的开放人员已经写了完整的demo,把工程导入到eclipse中之后一般没有错误,如果报错的话,eclipse也会给出提示.一般可以通过将pr ...
- swipejs
http://swipejs.com/ http://www.scoop.it/t/javascript-for-mobile http://www.open-open.com/news/view/c ...
- mvn 使用中的错误
出现这种错误的时候:mvn Error building POM may not be this project's POM,报的是那个jar 包,就删除那个jar 包,重新mvn clean ins ...
- Manor
Description Bob有n个正整数,他将这n个整数根据大小划分成两部分.对于小于等于k的整数放在集合A中,其余的放在集合B中.每次他从集合B中取出一个最大的值,将其变成0放入A集合中.然后将A ...
- HDOJ 1279 验证角谷猜想
Problem Description 数论中有许多猜想尚未解决,其中有一个被称为"角谷猜想"的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何 ...
- [LeetCode] Maximum Gap 解题思路
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- MD中bitmap源代码分析--SYNC IO和RAID5的补充
最近在做bwraid的R6的设计工作,需要调研一下bitmap下刷磁盘的IO属性(是否为SYNC IO),还有raid5中bitmap的存储和工作方式. 1.bitmap刷磁盘是否为 SYNC IO? ...
- linux patch
作为程序员,了解diff&patch命 令是非常必要的.比如说我们发现某个项目有bug代码,而自己又没有svn的提交权限,那么此时最合适的解决方法就是用diff命令做一个补丁发给项目成 员.项 ...