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, ...
随机推荐
- poj 1819 Disks
http://poj.org/problem?id=1819 #include <cstdio> #include <cstring> #include <cmath&g ...
- Android双击返回键退出Activity的两种方法
在开发应用程序的时候,有一种功能是非常常用到的,那就是迅速双击返回按钮,然后实现退出Activity的功能.本人在网上看了很多资料代码,总结起来,主要有两种比较好的方式.一种是开线程延时执行,一种是记 ...
- @Valid springMVC bean校验不起作用及如何统一处理校验
SpringMVC 使用JSR-303进行校验 @Valid 使用注解 一.准备校验时使用的JAR validation-api-1.0.0.GA.jar:JDK的接口: hibernate-vali ...
- Filter Conditions 过滤条件
<pre name="code" class="html">Filter Conditions 过滤条件: Rsyslog 提供4种不同类型的&qu ...
- 2014-07-24 .NET实现微信公众号的消息回复与自定义菜单
今天是在吾索实习的第12天.我们在这一天中,基本实现了微信公众号的消息回复与自定义菜单的创建. 首先,是实现消息回复,其关键点如下: 读取POST来的数据流:Stream 数据流变量 = HttpCo ...
- 从一些简单代码实例彻底理解面向对象编程思想|OOP本质是什么?
从Rob Pike 的 Google+上的一个推看到了一篇叫<Understanding Object Oriented Programming>的文章,我先把这篇文章简述一下,然后再说说 ...
- 常用渗透性测试工具(Tools for penetration testing)
常用渗透性测试工具 原文:http://hi.baidu.com/limpid/item/14a2df166adfa8cb38cb3068 对一个应用项目进行渗透性测试一般要经过三个步骤. 第一步, ...
- Linux字符设备驱动
一.字符设备基础 字符设备 二.字符设备驱动与用户空间访问该设备的程序三者之间的关系 三.字符设备模型 1.Linux内核中,使用 struct cdev 来描述一个字符设备 动态申请(构造)cdev ...
- C++沉思录之三——设计容器类
一.对容器的基本认识 总的来说,容器应该包含放在其中的对象的副本,而不是对象本身. 二.复制容器意味着什么? 通常将容器成为模板,而容器内的对象的类型就是模板参数.Container<T> ...
- InstallShield常用prq文件的下载地址
VC 2010 redist X86: http://saturn.installshield.com/is/prerequisites/microsoft visual c++ 2010 redis ...