时间管理(uC/OS-II)

一、时钟节拍

uC/OS-II需要提供周期性信号源,用于实现时间延迟和确认超时。时钟节拍率越高,系统的额外负荷就越重。时钟节拍的实际频率取决于应用程序的精度。时钟节拍可以是专门的硬件定时器,也可以是来自50/60Hz交流电源信号。

注意:必须在多任务系统启动以后,即在调用OSStart()之后,再开启时钟节拍器。调用OSStart()之后应做的第一件事就是初始化定时器中断。通常容易犯的错误是将允许时钟节拍中断放在系统初始化函数OSInit()之后,在启动多任务OSStart()之前。

uC/OS-II中的时钟节拍服务是通过在中断服务子程序中调用OSTimeTick()实现的。OSTimeTick()跟踪所有任务的定时器以及超时时限。

 1 void  OSTimeTick (void)
 2 {
 3 #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
 4     OS_CPU_SR  cpu_sr;
 5 #endif
 6     OS_TCB    *ptcb;
 7
 8
 9     OSTimeTickHook();                                      /* Call user definable hook                 */
10 #if OS_TIME_GET_SET_EN > 0
11     OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter           */
12     OSTime++;
13     OS_EXIT_CRITICAL();
14 #endif
15     if (OSRunning == TRUE) {
16         ptcb = OSTCBList;                                  /* Point at first TCB in TCB list           */
17         while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {          /* Go through all TCBs in TCB list          */
18             OS_ENTER_CRITICAL();
19             if (ptcb->OSTCBDly != 0) {                     /* Delayed or waiting for event with TO     */
20                 if (--ptcb->OSTCBDly == 0) {               /* Decrement nbr of ticks to end of delay   */
21                     if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended?    */
22                         OSRdyGrp               |= ptcb->OSTCBBitY; /* No,  Make task R-to-R (timed out)*/
23                         OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
24                     } else {                               /* Yes, Leave 1 tick to prevent ...         */
25                         ptcb->OSTCBDly = 1;                /* ... loosing the task when the ...        */
26                     }                                      /* ... suspension is removed.               */
27                 }
28             }
29             ptcb = ptcb->OSTCBNext;                        /* Point at next TCB in TCB list            */
30             OS_EXIT_CRITICAL();
31         }
32     }
33 }

1、OSTimeTick首先调用由用户定义的函数OSTimeTickHook。OSTimeTick中工作量较大的是,给每个任务控制块OS_TCB中的时间延迟项OSTCBDly减1。

2、OSTimeTick还计算了自系统上电以来的时钟节拍数OSTime,这是一个无符号的32位数。

3、当某任务的任务控制块中的时间延迟项OSTCBDly减为0时,这个任务就进入了就绪态。

4、OSTimeTick的执行时间正比于应用程序中建立的任务数,然而执行时间仍然是可确定的。

二、时间管理

任务调用了OSTimeDly后,一旦规定的时间期满或者有其他的任务通过调用OSTimeDlyResume取消了延时,它就会立即进入就绪态。注意:只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。

时间: 2024-10-23 00:14:49

时间管理(uC/OS-II)的相关文章

uC/OS II 任务切换原理

今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引发一次中断,自动将CS.IP寄存器压入堆栈,再利用中断返回,将新任务的任务断点指针弹出到CPU的CS.IP寄存器中,实现任务切换.虽然明白个大概,但是其中的细节却有点模糊,为什么调用IRET中断返回指令后,弹入CPU的CS.IP寄存器的断点指针是新任务的断点指针,而不是当前任务的,UCOS II是如

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

1. OSTaskCreate()    OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务.注意,ISR中禁止建立任务,一个任务必须为无限循环结构.        源码例如以下: #if OS_TASK_CREATE_EN > 0                    /* 条件编译,是否同意任务的创建               */INT8U  OSTaskCreate (void (*task)(void *pd), /* 函数指针,void *

Linux系统的时间管理及优化

一直以来对Linux下的时间管理知之不详,GFree_wind在微博发起过几次Linux下时钟的讨论,和Godbach这些大牛比,我完全插不上话,因为不懂.近来闲暇时间研究了下Linux下的时间管理,分享出来,请大家指正.   从我们大白话的角度想,时间管理其实分成两部分,就像我们小时候学习物理的时候物理老师不断强调时间和时刻的区别.一个是时刻,比如现在是20:44:37秒,指的是时刻,我们手机上看时间,指的也是时刻.另一块是时间,比如说,我每天工作八小时,再比如说,半小时之后,我要出门了,结束

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

1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数,且处理函数非常简单,一般仅是向相应的Task发消息,唤醒该Task来处理中断任务. 一个高效的调度器,这是OS的灵魂,实现多任务间的调度(包括调度点.调度算法.任务切换等). 好像就这么点,呵呵.它不支持内存保护,即不像Linux那样分用户空间.内核空间.如一个Task运行时,可调用内核函数Task

时间管理

时间是一种快速移动的资产,你所拥有的时间就是那么多.如何运用你所拥有的时间对于你的前程来说,将是至关重要的. 从许多方面来说,时间是你最宝贵的商品----浪费它的风险必须由你自己来承担. 每个人每周都有168个小时,或者每月大约有720个小时的时间.每个小时呢对于我们来说都是非常重要的. 今天我们要讨论的是时间管理,首先我们必须得明白什么是时间管理?时间管理总的来说就是运用策略和技术,帮助你尽可能有效的利用你的时间. 现在我们知道了什么是时间管理,那我们要怎么去做呢? 1.首先我们得想想我们的时

bzoj1620[Usaco2008 Nov]Time Management 时间管理*

bzoj1620[Usaco2008 Nov]Time Management 时间管理 题意: n个任务,每个有一个所需时间和最晚完成时刻,问最晚要从什么时候开始工作.n≤1000 题解: 贪心,按最晚完成时刻从早到晚排序,如果当前任务来不及完成,就将前面的任务往前推,否则累积一个“自由时间”.当推任务时,如果之前有“自由时间”,就用自由时间减往前推的时间,否则用最晚开始时间去减往前推的时间.反思:我开始贪错了,按最晚开始时刻从早到晚排序,结果WA很久.现在还是想不太清楚原因,希望哪位神犇能帮我

花10万学时间管理,还不如明白这两个字

1 A是个很勤奋的人,无论是工作.学习还是社交,都很忙很忙.他经常挂在嘴边的话便是时间不够用. 于是,他找了一大堆时间管理书籍,还报了培训班,研究啊研究,用了不知道多少工具,尝试了不知道多少种方法. 过了很长一段时间后,朋友们见他,他还是会说时间不够用啊不够用.生活状态还是跟以前一样,忙而乱,没成绩. 2 其实我们很多人都跟A一样,一旦发觉自己的时间不够用,效率低,可能首先考虑的就是学习时间管理,问各种工具方法. 然后发现,大部分努力成了然并卵,时间一过,还是老样子. 最近,我也在琢磨这个问题,

程序员们的时间管理法则

转自:http://www.csdn.net/article/2012-07-26/2807737 软件开发是非常令人兴奋的工作,经过多年的工作,你不仅可以得到相应的报酬(随着工作经验增长)还会有其他晋升的机会.大多数人只关心保持头浮出水面.但这并不是我们所要追求的目标,那仅仅是我们在学校或者孩童时代的梦想? 为了赚更多的钱,大多数人还会找额外的工作并且不太关注编程以外的东西.没有时间休息.没有时间和家人朋友小聚.除了工作还是工作.因此导致压力越来越大,对生活的不满足感油然而生. 其实我们只要稍

统筹高效利用时间——《小强升职记(升级版):时间管理故事书》读后感

      统筹高效利用时间 --<小强升职记(升级版):时间管理故事书>读后感 看完<小强升职记:时间管理故事书>,很有感触.书只是以小强为人物线索,通篇讲解如何管理.高效利用时间,和功利的升职等没有任何关系.全书着重讲如何利用时间,如"摔倒身上的猴子"等方法很受用.也想让媳妇和大家伙读一遍. 每天的忙碌,为什么有的人效率很高,有的人效率很低,同样的任务还要加班(这点我做的也不好).很大的原因往往是时间安排的不合理,分不清轻重缓急,没有目标,或者有目标容易