Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1183490
  • 博文数量: 221
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2139
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-27 19:53
个人简介

JustForFun

文章分类

全部博文(221)

文章存档

2024年(6)

2023年(8)

2022年(2)

2021年(2)

2020年(29)

2019年(11)

2018年(23)

2017年(41)

2016年(76)

2015年(23)

我的朋友
最近访客

分类: 嵌入式

2015-07-21 22:08:59

 μC/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在每秒10次到100次之间,或者说10到100Hz
时钟节拍率越高,系统的额外负荷就越重时钟节拍的实际频率取决于用户应用程序的精度
注意:
        用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。
容易犯的错误:
        是将允许时钟节拍器中断放在系统初始化函数OSInit()之后,在调用启动多任务系统启动函数OSStart()之前
 原因:
        时钟节拍中断有可能在μC/OS-Ⅱ启动第一个任务之前发生,此时μC/OS-Ⅱ是处在一种不确定的状态之中,用户应用程序有可能会崩溃。
    



μC/OS-Ⅱ中的时钟节拍服务是通过在(SysTickHandler系统滴答时钟中断)中断服务子程序中调用OSTimeTick()实现的
void SysTickHandler(void)
{
    OS_CPU_SR  cpu_sr;
 OS_ENTER_CRITICAL();
 OSIntNesting++;
 OS_EXIT_CRITICAL();
 OSTimeTick();
 OSIntExit();
}
OSTimeTick()的两个主要功能:
遍历“已建立任务TCB链表”,给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1(如果该项不为零的话)。当某任务的任务控制块中的时间延时项OSTCBDly减到了零时,把任务转入就绪态
调用OSTime累加从开机以来的时间,用的是一个无符号32位变量
//ucos_ii.h
OS_EXT  INT8U             OSIntNesting;             /* Interrupt nesting level                         */



**********************************************************************************************
508 * 时钟节拍函数 PROCESS SYSTEM TICK
509 *
510 * 描述: uC/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在每秒10次到100次
511 * 之间,或者说10到100Hz。时钟节拍率越高,系统的额外负荷就越重.时钟节拍的实际频率取决于
512 * 用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,也可以是来自50/60Hz交流电源的
513 * 信号
514 *
515 * 参数: 无
516 *
517 * 返回: 无
518 **********************************************************************************************
519 */
520
 void OSTimeTick (void) //时钟节拍函数
 {
 #if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3
 OS_CPU_SR cpu_sr;
 #endif
 OS_TCB *ptcb; //定义任务控制块优先级表变量
#if OS_TIME_GET_SET_EN > 0 //允许生成OSTimeGet() 函数代码
OS_ENTER_CRITICAL(); //关闭中断
OSTime++; //累加从开机以来的时间,用的是一个无符号32位变量
OS_EXIT_CRITICAL(); //打开中断
#endif

ptcb = OSTCBList; //保存任务控制块列表首地址
 //从OSTCBList开始,沿着OS_TCB链表做,一直做到空闲任务
while (ptcb->OSTCBPrio != OS_IDLE_PRIO)
{
      OS_ENTER_CRITICAL(); //关闭中断
      if (ptcb->OSTCBDly != 0) 
      { //如果任务等待时的最多节拍数不为0  
            if (--ptcb->OSTCBDly == 0)
           {  //如果任务等待时的最多节拍数为0
              //而确切被任务挂起的函数OSTaskSuspend()挂起的任务则不会进入就绪态
              //执行时间直接与应用程序中建立了多少个任务成正比
                 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == 0x00)
                {
                     //当某任务的任务控制块中的时间延时项OSTCBDly减到了零,这个任务就进入了就绪态
                     OSRdyGrp |= ptcb->OSTCBBitY;
                     OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                }
                else
                {
                       ptcb->OSTCBDly = 1; //否则
                } //允许任务等待时的最多节拍数为1
          }
     }
ptcb = ptcb->OSTCBNext; //指向任务块双向链接表的后链接
OS_EXIT_CRITICAL(); //打开中断
}
阅读(1856) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~