时间是一个非常重要的概念,我们和朋友出去游玩需要约定一个时间,做事情也需要花费一段时间,总之,我们的生活离不开时间。操作系统也一样,也需要一个时间来规范其任务的执行。

我们生活中,时间的最小单位是秒,硬件电路中,产生的最小的时间是晶振的频率,在操作系统中,其最小的时间单位叫做时钟节拍(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中的时间 (转)的更多相关文章

  1. 【原创】uC/OS II 任务切换原理

    今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...

  2. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  3. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  4. uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()

    1. OSTaskCreate()    OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务.注意,ISR中禁止建立任务,一个任务必须为无限循环结构.    ...

  5. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  6. 【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理

    LES BX, DWORD PTR DS:_OSTCBCur ;OSTCBCur->OSTCBStkPtr = SS:SP!!! ], SS ;将当前SS(栈的基地址)寄存器值存放至当前任务控制 ...

  7. 关于uC/OS的简单学习(转)

    1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...

  8. uC/OS-III 时钟节拍,时间管理,时间片调度

    uC/OS-III 时钟节拍,时间管理,时间片调度   时钟节拍 时钟节拍可谓是 uC/OS 操作系统的心脏,它若不跳动,整个系统都将会瘫痪. 时钟节拍就是操作系统的时基,操作系统要实现时间上的管理, ...

  9. 在STM32F401上移植uC/OS的一个小问题 [原创]

    STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...

随机推荐

  1. Install and use Karma

    1:安装karma y@y:~$ npm install --global karma 2:安装karma插件 y@y:~$ npm install --global karma-jasmine ka ...

  2. Android 把从网络获取的图片缓存到内存中

    1:activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi ...

  3. try catch 学习记入

    执行过程 public void method(Action action) { //2.method执行中 try { action(); //3.调用委托 "; //如果action执行 ...

  4. 不建议用wxWidgets,底层有过多的bug

    不建议用wxWidgets, 搞了wxWidgets 3年,不是所说的那么容易跨平台,很多bug,不稳定, 莫名其妙的崩溃找源代码修改编译真是费时费力. 开发速度真没有使用本地sdk开发高, 很难定制 ...

  5. BZOJ3402: [Usaco2009 Open]Hide and Seek 捉迷藏

    3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 51  Solved: 4 ...

  6. 黑马程序员_JavaIO流(三)

    字节流File读写操作 字符流: FileReader FileWriter BufferedReader BufferedWrtier 字节流: FileInputStream FileOutput ...

  7. CDH-5.4.3离线安装

    使用CM离线安装CDH-5.4.3,如下: cdh5.4.3安装 配置/etc/hosts vim /etc/hosts 192.168.10.1 s1 192.168.10.2 s2 192.168 ...

  8. IT项目外包有哪些注意事项

    2015年两会上,李克强总理在政府工作报告中首次提出“互联网+”计划,各种互联网创业项目也如雨后春笋般破土而出.由于很多创业团队并没有自己的技术团队,所以软件外包成为很多创业项目普遍采取的一种方案.在 ...

  9. socket实现局域网通信

    今天实现了一个局域网通信的小例子,上来记录一下,代码不成熟,勿拍. 这是我本机客户端: 这是我虚拟机的客户端. 我为他们分配了静态IP,这样就可以实现局域网通信了.注意代码中必须把监视线程的IsBac ...

  10. form表单提交之前推断

    1.使用onsubmit方法 <form name="Form" action="t" method="post" onsubmit= ...