<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > ucOS學習筆記(3)——ucOS的數(shù)據(jù)結(jié)構(gòu)

          ucOS學習筆記(3)——ucOS的數(shù)據(jù)結(jié)構(gòu)

          作者: 時間:2016-11-10 來源:網(wǎng)絡 收藏
          ucOS數(shù)據(jù)結(jié)構(gòu)中最核心的一個數(shù)據(jù)結(jié)構(gòu)就是任務控制塊數(shù)據(jù)結(jié)構(gòu),其他的數(shù)據(jù)類型都是圍繞該數(shù)據(jù)結(jié)構(gòu)展開的,任務切換,代碼調(diào)度也都是以該數(shù)據(jù)結(jié)構(gòu)為基礎(chǔ)來完成的。認清了該數(shù)據(jù)結(jié)構(gòu)就了解了ucOS的運行機制。任務控制塊數(shù)據(jù)結(jié)構(gòu)如下:

          typedef struct os_tcb {
          OS_STK *OSTCBStkPtr; /* Pointer to current top of stack */

          #if OS_TASK_CREATE_EXT_EN > 0
          void *OSTCBExtPtr; /* Pointer to user definable data for TCB extension */
          OS_STK *OSTCBStkBottom; /* Pointer to bottom of stack */
          INT32U OSTCBStkSize; /* Size of task stack (in number of stack elements) */
          INT16U OSTCBOpt; /* Task options as passed by OSTaskCreateExt() */
          INT16U OSTCBId; /* Task ID (0..65535) */
          #endif

          struct os_tcb *OSTCBNext; /* Pointer to next TCB in the TCB list */
          struct os_tcb *OSTCBPrev; /* Pointer to previous TCB in the TCB list */

          #if (OS_EVENT_EN) || (OS_FLAG_EN > 0)
          OS_EVENT *OSTCBEventPtr; /* Pointer to event control block */
          #endif

          #if (OS_EVENT_EN) && (OS_EVENT_MULTI_EN > 0)
          OS_EVENT **OSTCBEventMultiPtr; /* Pointer to multiple event control blocks */
          #endif

          #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
          void *OSTCBMsg; /* Message received from OSMboxPost() or OSQPost() */
          #endif

          #if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
          #if OS_TASK_DEL_EN > 0
          OS_FLAG_NODE *OSTCBFlagNode; /* Pointer to event flag node */
          #endif
          OS_FLAGS OSTCBFlagsRdy; /* Event flags that made task ready to run */
          #endif

          INT16U OSTCBDly; /* Nbr ticks to delay task or, timeout waiting for event */
          INT8U OSTCBStat; /* Task status */
          INT8U OSTCBStatPend; /* Task PEND status */
          INT8U OSTCBPrio; /* Task priority (0 == highest) */

          INT8U OSTCBX; /* Bit position in group corresponding to task priority */
          INT8U OSTCBY; /* Index into ready table corresponding to task priority */
          #if OS_LOWEST_PRIO <= 63
          INT8U OSTCBBitX; /* Bit mask to access bit position in ready table */
          INT8U OSTCBBitY; /* Bit mask to access bit position in ready group */
          #else
          INT16U OSTCBBitX; /* Bit mask to access bit position in ready table */
          INT16U OSTCBBitY; /* Bit mask to access bit position in ready group */
          #endif

          #if OS_TASK_DEL_EN > 0
          INT8U OSTCBDelReq; /* Indicates whether a task needs to delete itself */
          #endif

          #if OS_TASK_PROFILE_EN > 0
          INT32U OSTCBCtxSwCtr; /* Number of time the task was switched in */
          INT32U OSTCBCyclesTot; /* Total number of clock cycles the task has been running */
          INT32U OSTCBCyclesStart; /* Snapshot of cycle counter at start of task resumption */
          OS_STK *OSTCBStkBase; /* Pointer to the beginning of the task stack */
          INT32U OSTCBStkUsed; /* Number of bytes used from the stack */
          #endif

          #if OS_TASK_NAME_SIZE > 1
          INT8U OSTCBTaskName[OS_TASK_NAME_SIZE];
          #endif
          } OS_TCB;
          其中
          OSTCBStkPtr--任務棧的指針,在任務中使用到的所有零時變量(包括任務切換時需要保存的上下文)都保存在OSTCBStkPtr指向的存儲區(qū)域
          OSTCBExtPtr--任務擴展數(shù)據(jù)信息指針,目前我理解這一部分主要用于保存任務名字的ASCII碼
          OSTCBStkBottom--任務棧底指針
          OSTCBStkSize--任務棧的大小
          OSTCBNext--任務控制塊鏈表中的下一任務指針
          OSTCBPrev--任務控制塊鏈表中的上一任務指針
          OSTCBEventPtr--任務等待時間指針,該數(shù)據(jù)結(jié)構(gòu)本身是屬于一個事件的,任務也只是屬于事件的一個候選資源
          OSTCBEventMultiPtr--互斥信號量指針
          OSTCBMsg--郵箱指針



          任務私有棧--是任務執(zhí)行過程或者任務數(shù)據(jù)切換過程用于存放零時數(shù)據(jù)的一片內(nèi)存區(qū)域
          任務鏈表--為了便于管理ucOS將多個任務用鏈表的方式串接起來,這個鏈表稱為任務鏈表
          空任務鏈表--也是為了便于內(nèi)存分配,ucOS在編譯的時候就決定了整個系統(tǒng)最多支持多少個任務,同時就為這些任務預留了相應的任務控制塊,這部分任務控制塊就被稱為空任務鏈表。在真正需要使用任務的時候,將從空任務鏈表中獲取任務控制塊到任務控制鏈表中
          當前運行任務指針--指向當前正在運行的任務控制塊
          任務鏈表索引--為了更快的查找任務鏈表,ucOS建立了一個指向所有任務控制塊的數(shù)組,這個數(shù)組就是任務鏈表索引。該索引以優(yōu)先級排序
          任務就緒表--已經(jīng)就緒的任務表
          任務就緒表索引
          任務就緒表輔助登記表--一下三張表都是ucOS為了查找任何一個任務都使用相同的查找時間使用的額外表,它們的唯一作用就是保證系統(tǒng)的時效性
          任務就緒表輔助注銷表
          任務就緒表輔助查找表
          全局變量不完全統(tǒng)計:
          OSLockNesting
          OSIntNesting
          OSCtxSwCtr
          OSPrioHighRdy
          OSPrioCur
          OSTCBHighRdy
          OSTCBCur
          OSTaskCtr
          OSRunning


          關(guān)鍵詞: ucOS數(shù)據(jù)結(jié)

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();