Board logo

标题: UCOS之任务调度机制 [打印本页]

作者: yuyang911220    时间: 2014-10-23 20:40     标题: UCOS之任务调度机制

一. 内核概述:
      多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU的占用时间一般在 2到5个百分点之间。uCOS II有一个精巧的内核调度算法,实时内核精小,执行效率高,算法巧妙,代码空间很少。
  二. uCOS II内核调度特点:
      三. 任务控制块 OS_TCB描述:
      uCOS II的TCB数据结构简单,内容容易理解,保存最基本的任务信息,同时还支持裁减来减小内存消耗,TCB是事先根据用户配置,静态分配内存的结构数组,通过优先级序号进行添加,查找,删除等功能。减少动态内存分配和释放。因为依靠优先级进行TCB分配,每个任务必须有自己的优先级,不能和其他任务具有相同的优先级。
  typedef struct os_tcb
  {
      OS_STK        *OSTCBStkPtr;
  #if OS_TASK_CREATE_EXT_EN
      void          *OSTCBExtPtr;
      OS_STK        *OSTCBStkBottom;
      INT32U         OSTCBStkSize;
      INT16U         OSTCBOpt;
      INT16U         OSTCBId;
  #endif
      struct os_tcb *OSTCBNext;
      struct os_tcb *OSTCBPrev;
  #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
      OS_EVENT      *OSTCBEventPtr;
  #endif  
  #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
      void          *OSTCBMsg;
  #endif  
      INT16U         OSTCBDly;
      INT8U          OSTCBStat;
      INT8U          OSTCBPrio;
      INT8U          OSTCBX;
      INT8U          OSTCBY;
      INT8U          OSTCBBitX;
      INT8U          OSTCBBitY;
  #if OS_TASK_DEL_EN
      BOOLEAN        OSTCBDelReq;
  #endif
  } OS_TCB;
  .OSTCBStkPtr是指向当前任务栈顶的指针。
  .*OSTCBExtPtr;:任务扩展模块使用;
  .*OSTCBStkBottom;
  .OSTCBStkSize; .
  .OSTCBOpt;
  .OSTCBId;
  .OSTCBNext和.OSTCBPrev用于任务控制块OS_TCBs的双重链接,
  .OSTCBEventPtr是指向事件控制块的指针
  .OSTCBMsg是指向传给任务的消息的指针。
  .OSTCBDly当需要把任务延时若干时钟节拍时要用到这个变量,或者需要把任务挂起一段时间以等待某事件的发生,
  .OSTCBStat是任务的状态字。
  .OSTCBPrio是任务优先级。
  .OSTCBX, .OSTCBY, .OSTCBBitX和 .OSTCBBitY用于加速任务进入就绪态的过程或进入等待事件发生状态的过程
  OSTCBY = priority >> 3;
  OSTCBBitY = OSMapTbl[priority >> 3];
  OSTCBX = priority & 0x07;
  OSTCBBitX = OSMapTbl[priority & 0x07];
  .OSTCBDelReq是一个布尔量,用于表示该任务是否需要删除




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0