您的位置 首页 软件

ucOS学习笔记(3)——ucOS的数据结构

ucOS的数据结构中最核心的一个数据结构就是任务控制块数据结构,其他的数据类型都是围绕该数据结构展开的,任务切换,代码调度也都是以该数…

ucOS数据结构中最中心的一个数据结构便是使命操控块数据结构,其他的数据类型都是环绕该数据结构打开的,使命切换,代码调度也都是以该数据结构为根底来完结的。认清了该数据结构就了解了ucOS的运转机制。使命操控块数据结构如下:

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指向的存储区域
OSTCBExtPtr–使命扩展数据信息指针,现在我了解这一部分首要用于保存使命姓名的ASCII码
OSTCBStkBottom–使命栈底指针
OSTCBStkSize–使命栈的巨细
OSTCBNext–使命操控块链表中的下一使命指针
OSTCBPrev–使命操控块链表中的上一使命指针
OSTCBEventPtr–使命等待时间指针,该数据结构自身是归于一个事情的,使命也仅仅归于事情的一个候选资源
OSTCBEventMultiPtr–互斥信号量指针
OSTCBMsg–邮箱指针

使命私有栈–是使命履行进程或许使命数据切换进程用于寄存零时数据的一片内存区域
使命链表–为了便于管理ucOS将多个使命用链表的方法串接起来,这个链表称为使命链表
空使命链表–也是为了便于内存分配,ucOS在编译的时分就决议了整个体系最多支撑多少个使命,一起就为这些使命预留了相应的使命操控块,这部分使命操控块就被称为空使命链表。在真实需求运用使命的时分,将从空使命链表中获取使命操控块到使命操控链表中
当时运转使命指针–指向当时正在运转的使命操控块
使命链表索引–为了更快的查找使命链表,ucOS建立了一个指向一切使命操控块的数组,这个数组便是使命链表索引。该索引以优先级排序
使命安排妥当表–现已安排妥当的使命表
使命安排妥当表索引
使命安排妥当表辅佐登记表–一下三张表都是ucOS为了查找任何一个使命都运用相同的查找时间运用的额表面,它们的仅有效果便是确保体系的时效性
使命安排妥当表辅佐刊出表
使命安排妥当表辅佐查找表
全局变量不完全统计:
OSLockNesting
OSIntNesting
OSCtxSwCtr
OSPrioHighRdy
OSPrioCur
OSTCBHighRdy
OSTCBCur
OSTaskCtr
OSRunning

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/275956.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部