ucos_ii.h

定位到uCOS-II/Source/目录,这部分是系统的核心代码。先看ucos_ii.h文件:

1. 宏定义类型以及头文件包含

#define OS_VERSION  29207u  //定义版本号

#include <app_cfg.h>
#include <os_cfg.h>
#include <os_cpu.h>

#ifdef   OS_GLOBALS
#define  OS_EXT
#else
#define  OS_EXT  extern
#endif

#ifndef  OS_FALSE
#define  OS_FALSE       0u
#endif

#ifndef  OS_TRUE
#define  OS_TRUE        1u
#endif

#define  OS_ASCII_NUL   (INT8U)0
#define  OS_PRIO_SELF   0xFFu   /* Indicate SELF priority */

OS_PRIO_SELF被宏定义为0xFF,从注释上看OS_PRIO_SELF代表的是任务自身的优先级。为什么是0xff?这宏是适用于当你不知道任务的优先级但是又要操作任务的优先级的时候,uCOS-II的内部函数会将其转换为真正优先级的代码。例如你想用OSTaskDel()删除当前任务但是你又不知道当前任务的优先级,可以写为:

OSTaskDel(OS_PRIO_SELF);
#if OS_TASK_STAT_EN > 0
#define  OS_N_SYS_TASKS 2u      /* Number of system tasks */
#else
#define  OS_N_SYS_TASKS 1u
#endif

OS_TASK_STAT_EN是一个配置宏,OS_TASK_STAT_EN > 0表示使用系统中的统计任务。统计任务是属于系统任务,默认开启且无法被删除的系统任务还有一个空闲任务。当使能了系统统计任务,那么OS_N_SYS_TASKS=2,反之OS_N_SYS_TASKS=1。

#define  OS_TASK_STAT_PRIO  (OS_LOWEST_PRIO - 1)
#define  OS_TASK_IDLE_PRIO  (OS_LOWEST_PRIO) 

OS_TASK_STAT_PRIO、OS_TASK_IDLE_PRIO分别是统计任务、空闲任务的优先级,OS_LOWEST_PRIO为系统任务的最低优先级。假设系统为最多支持32个任务,那么任务的最低优先级为31(优先级数值越大,优先级越低)。倒数两个低优先级分别赋给统计任务和空闲任务。OS_TASK_STAT_PRIO = 30,OS_TASK_IDLE_PRIO = 29。统计任务用于统计系统各种状态参数,如内存/CPU使用率等,空闲任务在系统中无任务可执行时才轮到它执行。

#if OS_LOWEST_PRIO <= 63
#define  OS_EVENT_TBL_SIZE ((OS_LOWEST_PRIO) / 8 + 1)   /* Size of event table */
#define  OS_RDY_TBL_SIZE   ((OS_LOWEST_PRIO) / 8 + 1)   /* Size of ready table */
#else
#define  OS_EVENT_TBL_SIZE ((OS_LOWEST_PRIO) / 16 + 1)  /* Size of event table */
#define  OS_RDY_TBL_SIZE   ((OS_LOWEST_PRIO) / 16 + 1)  /* Size of ready table */
#endif

OS_RDY_TBL_SIZE是任务就绪表的下标取值范围,OS_LOWEST_PRIO=31, 这里计算得出OS_RDY_TBL_SIZE等于4,即下标取值为0~3。OS_EVENT_TBL_SIZE同理。

#define  OS_TASK_IDLE_ID    65535u  /* ID numbers for Idle, Stat and Timer tasks */
#define  OS_TASK_STAT_ID    65534u
#define  OS_TASK_TMR_ID     65533u

Idle、Stat、Timer任务的ID,为什么是65535?因为uCOS-II最多支持2^16个任务,其ID最大为65535。在uCOS-II中id值并没什么用处。

#define  OS_EVENT_EN  (((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0))
#define  OS_TCB_RESERVED ((OS_TCB *)1)

OS_EVENT_EN为1表示开启系统的事件功能机制。

#define  OS_STAT_RDY        0x00u    /* Ready to run (就绪态) */
#define  OS_STAT_SEM        0x01u    /* Pending on semaphore (因等待信号量而被挂起) */
#define  OS_STAT_MBOX       0x02u    /* Pending on mailbox (因等效MBox而被挂起) */
#define  OS_STAT_Q          0x04u    /* Pending on queue (因等待消息队列而被挂起) */
#define  OS_STAT_SUSPEND    0x08u    /* Task is suspended (挂起态) */
#define  OS_STAT_MUTEX      0x10u    /* Pending on mutual exclusion semaphore (因等待Mutex而被挂起) */
#define  OS_STAT_FLAG       0x20u    /* Pending on event flag group (因等待flag而被挂起) */
#define  OS_STAT_MULTI      0x80u    /* Pending on multiple events (因等待MULTI而被挂起,MULTI指代所有事件类型的综合) */
#define  OS_STAT_PEND_ANY   (OS_STAT_SEM | OS_STAT_MBOX | OS_STAT_Q | OS_STAT_MUTEX | OS_STAT_FLAG)

如上宏表示任务当前的运行状态,是TCB中OSTCBStat成员的取值选项。

#define  OS_STAT_PEND_OK              0u  /* 已经挂起结束或没有挂起 */
#define  OS_STAT_PEND_TO              1u  /* 在有超时机制的挂起状态中 */
#define  OS_STAT_PEND_ABORT           2u  /* 挂起出错 */

如上宏表示任务当前的挂起状态,也是TCB中OSTCBStatPend成员的取值选项。

#define  OS_EVENT_TYPE_UNUSED         0u
#define  OS_EVENT_TYPE_MBOX           1u
#define  OS_EVENT_TYPE_Q              2u
#define  OS_EVENT_TYPE_SEM            3u
#define  OS_EVENT_TYPE_MUTEX          4u
#define  OS_EVENT_TYPE_FLAG           5u

#define  OS_TMR_TYPE                  100u

如上宏表示系统中的事件类型。

#define  OS_FLAG_WAIT_CLR_ALL         0u    /* Wait for ALL    the bits specified to be CLR (i.e. 0)   */
#define  OS_FLAG_WAIT_CLR_AND         0u

#define  OS_FLAG_WAIT_CLR_ANY         1u    /* Wait for ANY of the bits specified to be CLR (i.e. 0)   */
#define  OS_FLAG_WAIT_CLR_OR          1u

#define  OS_FLAG_WAIT_SET_ALL         2u    /* Wait for ALL    the bits specified to be SET (i.e. 1)   */
#define  OS_FLAG_WAIT_SET_AND         2u

#define  OS_FLAG_WAIT_SET_ANY         3u    /* Wait for ANY of the bits specified to be SET (i.e. 1)   */
#define  OS_FLAG_WAIT_SET_OR          3u

#define  OS_FLAG_CONSUME           0x80u    /* Consume the flags if condition(s) satisfied             */
#define  OS_FLAG_CLR                  0u
#define  OS_FLAG_SET                  1u

跟flag事件相关的宏定义。

#if OS_TICK_STEP_EN > 0
#define  OS_TICK_STEP_DIS             0u    /* Stepping is disabled, tick runs as mormal               */
#define  OS_TICK_STEP_WAIT            1u    /* Waiting for uC/OS-View to set OSTickStepState to _ONCE  */
#define  OS_TICK_STEP_ONCE            2u    /* Process tick once and wait for next cmd from uC/OS-View */
#endif

uC/OS-View使用。uC/OS-View是一个基于uCOS-II的中间件监控程序,通过串口同windows平台上的客户端程序Viewer配合使用,可以实时显示uCOS-II及其所有任务的当前状态,如任务栈起始地址,栈大小,任务名称,任务当前状态,任务被执行次数和CPU占用率等。最重要的一点是,uC/OS-View已经被Micrium无情抛弃了,所以先不细究。

#define  OS_DEL_NO_PEND 0u
#define  OS_DEL_ALWAYS  1u

删除事件函数,如OSSemDel()、OSMboxDel()等,其opt参数的取值选项。前者表示若有任务在等待/使用该事件则不删除,后者则总是删除。

/*
*********************************************************************************************************
*                                        OS???Pend() OPTIONS
*
* These #defines are used to establish the options for OS???PendAbort().
*********************************************************************************************************
*/
#define  OS_PEND_OPT_NONE             0u    /* NO option selected                                      */
#define  OS_PEND_OPT_BROADCAST        1u    /* Broadcast action to ALL tasks waiting                   */

/*
*********************************************************************************************************
*                                     OS???PostOpt() OPTIONS
*
* These #defines are used to establish the options for OSMboxPostOpt() and OSQPostOpt().
*********************************************************************************************************
*/
#define  OS_POST_OPT_NONE          0x00u    /* NO option selected                                      */
#define  OS_POST_OPT_BROADCAST     0x01u    /* Broadcast message to ALL tasks waiting                  */
#define  OS_POST_OPT_FRONT         0x02u    /* Post to highest priority task waiting                   */
#define  OS_POST_OPT_NO_SCHED      0x04u 

事件相关宏定义。

#define  OS_TASK_OPT_NONE        0x0000u    /* 不使用 */
#define  OS_TASK_OPT_STK_CHK     0x0001u    /* 栈空间还剩下多少 */ 
#define  OS_TASK_OPT_STK_CLR     0x0002u    /* 清理栈 */
#define  OS_TASK_OPT_SAVE_FP     0x0004u    /* 保存浮点单元的寄存器 */

CM3内核不支持浮点单元的(CM4内核支持)。OS_TASK_OPT_SAVE_FP用于保存浮点指针(在进行上下文切换时)。
这几个宏在用于创建任务的函数OSTaskCreateExt()的参数使用。OSTaskCreate()是早期uCOS-II创建任务的函数,OSTaskCreateExt()则后期添加上的,也是用于创建任务。前者原型为:

INT8U  OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio)

后者的原型为:

INT8U  OSTaskCreateExt (void   (*task)(void *p_arg),
                        void    *p_arg,
                        OS_STK  *ptos,     /* top */
                        INT8U    prio,
                        INT16U   id,
                        OS_STK  *pbos,      /* button */
                        INT32U   stk_size,  /* 栈的大小 */
                        void    *pext,      /* 用户扩展数据 */
                        INT16U   opt)   

后者多了5个参数,其中opt参数取值为以上宏。

/*
*********************************************************************************************************
*                            TIMER OPTIONS (see OSTmrStart() and OSTmrStop())
*********************************************************************************************************
*/
#define  OS_TMR_OPT_NONE              0u    /* No option selected                                      */

#define  OS_TMR_OPT_ONE_SHOT          1u    /* Timer will not automatically restart when it expires    */
#define  OS_TMR_OPT_PERIODIC          2u    /* Timer will     automatically restart when it expires    */

#define  OS_TMR_OPT_CALLBACK          3u    /* OSTmrStop() option to call 'callback' w/ timer arg.     */
#define  OS_TMR_OPT_CALLBACK_ARG      4u    /* OSTmrStop() option to call 'callback' w/ new   arg.     */

/*
*********************************************************************************************************
*                                            TIMER STATES
*********************************************************************************************************
*/
#define  OS_TMR_STATE_UNUSED          0u
#define  OS_TMR_STATE_STOPPED         1u
#define  OS_TMR_STATE_COMPLETED       2u
#define  OS_TMR_STATE_RUNNING         3u

定时器相关的宏定义。

#define OS_ERR_NONE                   0u

#define OS_ERR_EVENT_TYPE             1u
#define OS_ERR_PEND_ISR               2u

...

#define OS_ERR_TMR_NAME_TOO_LONG    140u
#define OS_ERR_TMR_INVALID_STATE    141u
#define OS_ERR_TMR_STOPPED          142u
#define OS_ERR_TMR_NO_CALLBACK      143u

系统使用的错误码。

#define OS_NO_ERR                    OS_ERR_NONE
#define OS_TIMEOUT                   OS_ERR_TIMEOUT
//...
#define OS_FLAG_GRP_DEPLETED         OS_ERR_FLAG_GRP_DEPLETED

版本后小于2.84的系统使用的错误码。

2. 事件控制块OS_EVENT

#if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0)
typedef struct os_event {
    INT8U    OSEventType;                    /* 指明何种类型的事件,取值见上面的OS_EVENT_TYPE_xxxx */
    void    *OSEventPtr;                     /* 指向事件的有效信息 */
    INT16U   OSEventCnt;                     /* 用于指明信号量的总数(信号量也是一种事件)。因为Mutex是一种特殊的信号量,
                                                其初始值为1,所以也支持此值 */
#if OS_LOWEST_PRIO <= 63
    INT8U    OSEventGrp;                     /* 事件表的组 */
    INT8U    OSEventTbl[OS_EVENT_TBL_SIZE];  /* 事件表。这两个参数类似于之前讲的任务就绪表 */
#else
    INT16U   OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */
    INT16U   OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur                */
#endif

#if OS_EVENT_NAME_SIZE > 1
    INT8U    OSEventName[OS_EVENT_NAME_SIZE]; /* 事件的名字 */
#endif
} OS_EVENT;
#endif

3. flag控制块相关

flag也属于事件(event)的一种,像Mutex、信号量和消息盒子等也属于event。由于flag的设计及使用与众不同,用OS_EVENT结构体无法表征,所以单独使用OS_FLAG_GRP结构体描述。

#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
#if OS_FLAGS_NBITS == 8      /* Determine the size of OS_FLAGS (8, 16 or 32 bits) */
typedef  INT8U    OS_FLAGS;
#endif

#if OS_FLAGS_NBITS == 16
typedef  INT16U   OS_FLAGS;
#endif

#if OS_FLAGS_NBITS == 32
typedef  INT32U   OS_FLAGS;
#endif

系统中的flag是8位、16位、32位可选的。

typedef struct os_flag_grp {                /* Event Flag Group */
    INT8U         OSFlagType;               /* 前只有OS_EVENT_TYPE_FLAG这种类型的flag */
    void         *OSFlagWaitList;           /* 指向flag链表的首节点 */
    OS_FLAGS      OSFlagFlags;              /* 要等待flag中的哪几个bit */  
#if OS_FLAG_NAME_SIZE > 1
    INT8U         OSFlagName[OS_FLAG_NAME_SIZE];
#endif
} OS_FLAG_GRP;

每个flag节点用OS_FLAG_NODE结构体描述:
typedef struct os_flag_node {  
    void         *OSFlagNodeNext;           /* Pointer to next     NODE in wait list */
    void         *OSFlagNodePrev;           /* Pointer to previous NODE in wait list */
    void         *OSFlagNodeTCB;            /* 正在排队等待flag的任务的TCB */
    void         *OSFlagNodeFlagGrp;        /* 指向flag所在的节点 */
    OS_FLAGS      OSFlagNodeFlags;          /* 要等待的flag的BIT几 */
    INT8U         OSFlagNodeWaitType;       /* 等待flag的等待类型。Type of wait: */
                                            /*      OS_FLAG_WAIT_AND */
                                            /*      OS_FLAG_WAIT_ALL */
                                            /*      OS_FLAG_WAIT_OR */
                                            /*      OS_FLAG_WAIT_ANY */
} OS_FLAG_NODE;

每个flag节点用双向链表的方式管理。

4. 消息盒子Mbox的数据描述结构体

#if OS_MBOX_EN > 0
typedef struct os_mbox_data {
    void   *OSMsg;                   /* 指向数据的有效信息 */
#if OS_LOWEST_PRIO <= 63
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur                 */
    INT8U   OSEventGrp;                    /* Group corresponding to tasks waiting for event to occur  */
#else
    INT16U  OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur                 */
    INT16U  OSEventGrp;                    /* Group corresponding to tasks waiting for event to occur  */
#endif
} OS_MBOX_DATA;
#endif

5. 动态内存的相关结构体

在c语言中动态分配内存使用malloc()和free()两个c库函数,它们是属于c库的内容,所以uCOS-II要支持这两个函数来实现动态内存分配,就要移植c库。对于运行RTOS的嵌入式软件来说,显得庞大。所以uCOS-II自定义了动态内存分配相关的函数。如下即为函数相关的描述结构体:

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
typedef struct os_mem {                   /* MEMORY CONTROL BLOCK                                      */
    void   *OSMemAddr;                    /* Pointer to beginning of memory partition                  */
    void   *OSMemFreeList;                /* Pointer to list of free memory blocks                     */
    INT32U  OSMemBlkSize;                 /* Size (in bytes) of each block of memory                   */
    INT32U  OSMemNBlks;                   /* Total number of blocks in this partition                  */
    INT32U  OSMemNFree;                   /* Number of memory blocks remaining in this partition       */
#if OS_MEM_NAME_SIZE > 1
    INT8U   OSMemName[OS_MEM_NAME_SIZE];  /* Memory partition name                                     */
#endif
} OS_MEM;


typedef struct os_mem_data {
    void   *OSAddr;                    /* Pointer to the beginning address of the memory partition     */
    void   *OSFreeList;                /* Pointer to the beginning of the free list of memory blocks   */
    INT32U  OSBlkSize;                 /* Size (in bytes) of each memory block                         */
    INT32U  OSNBlks;                   /* Total number of blocks in the partition                      */
    INT32U  OSNFree;                   /* Number of memory blocks free                                 */
    INT32U  OSNUsed;                   /* Number of memory blocks used                                 */
} OS_MEM_DATA;
#endif

6. 互斥锁(Mutex)数据的描述结构体

#if OS_MUTEX_EN > 0
typedef struct os_mutex_data {
#if OS_LOWEST_PRIO <= 63
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur                */
    INT8U   OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */
#else
    INT16U  OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur                */
    INT16U  OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */
#endif
    BOOLEAN OSValue;                        /* Mutex value (OS_FALSE = used, OS_TRUE = available)      */
    INT8U   OSOwnerPrio;                    /* Mutex owner's task priority or 0xFF if no owner         */
    INT8U   OSMutexPIP;                     /* Priority Inheritance Priority or 0xFF if no owner       */
} OS_MUTEX_DATA;
#endif

7. 消息队列(Queue)控制块及数据描述结构体

队列相当于环形缓冲区,需要4个指针:分别指向头、指向尾指针、指向下一个数据要放入的位置、指向下一个要放出数据的位置。

#if OS_Q_EN > 0
typedef struct os_q {    /* QUEUE CONTROL BLOCK                                         */
    struct os_q   *OSQPtr;              /* 指向下一个Queue */            
    void         **OSQStart;            /* Queue中的第一个元素 */
    void         **OSQEnd;              /* Queue中的最后一个元素 */
    void         **OSQIn;               /* Pointer to where next message will be inserted  in   the Q  */
    void         **OSQOut;              /* Pointer to where next message will be extracted from the Q  */
    INT16U         OSQSize;             /* Queue中元素的个数。单位是元素的个数,不是字节数 */
    INT16U         OSQEntries;          /* 当前队列用来存放数据的空间的内容用了多少 */  
} OS_Q;


typedef struct os_q_data {
    void          *OSMsg;             /* Queue的有效消息 */
    INT16U         OSNMsgs;           /* 有效消息的个数 */ 
    INT16U         OSQSize;           /* 数据总大小 */                                      */
#if OS_LOWEST_PRIO <= 63
    INT8U          OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur         */
    INT8U          OSEventGrp;          /* Group corresponding to tasks waiting for event to occur     */
#else
    INT16U         OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur         */
    INT16U         OSEventGrp;          /* Group corresponding to tasks waiting for event to occur     */
#endif
} OS_Q_DATA;
#endif

8. 信号量数据描述结构体

#if OS_SEM_EN > 0
typedef struct os_sem_data {
    INT16U  OSCnt;          /* 信号量的当前值为多少 */ 

/* 等待信号量的任务任务队列。用到这个两个参数说明OSCnt为零了,不然不会有等待任务的 */    
#if OS_LOWEST_PRIO <= 63
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE];   /* List of tasks waiting for event to occur                */
    INT8U   OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */
#else
    INT16U  OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur                */
    INT16U  OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */
#endif
} OS_SEM_DATA;
#endif

9. 任务栈信息

#if OS_TASK_CREATE_EXT_EN > 0
typedef struct os_stk_data {
    INT32U  OSFree;                    /* 还剩下多少栈空间 */
    INT32U  OSUsed;                    /* 已经使用了多少栈空间 */
} OS_STK_DATA;
#endif

10. 任务控制块TCB

见前面文章《uCOS-II系统中的任务》。链接为http://blog.csdn.net/qq_29344757/article/details/77625053

11. 定时器相关

#if OS_TMR_EN > 0
typedef  void (*OS_TMR_CALLBACK)(void *ptmr, void *parg);
typedef  struct  os_tmr {
    INT8U            OSTmrType;                       /* Should be set to OS_TMR_TYPE */
    OS_TMR_CALLBACK  OSTmrCallback;                   /* Function to call when timer expires */
    void            *OSTmrCallbackArg;                /* Argument to pass to function when timer expires */
    void            *OSTmrNext;                       /* Double link list pointers */
    void            *OSTmrPrev;
    INT32U           OSTmrMatch;                      /* Timer expires when OSTmrTime == OSTmrMatch */
    INT32U           OSTmrDly;                        /* Delay time before periodic update starts */
    INT32U           OSTmrPeriod;                     /* Period to repeat timer */
#if OS_TMR_CFG_NAME_SIZE > 0
    INT8U            OSTmrName[OS_TMR_CFG_NAME_SIZE]; /* Name to give the timer  */
#endif
    INT8U            OSTmrOpt;                        /* Options (see OS_TMR_OPT_xxx) */
    INT8U            OSTmrState;                      /* Indicates the state of the timer: */
                                                      /*     OS_TMR_STATE_UNUSED */
                                                      /*     OS_TMR_STATE_RUNNING */
                                                      /*     OS_TMR_STATE_STOPPED */
} OS_TMR;

typedef  struct  os_tmr_wheel {
    OS_TMR          *OSTmrFirst;                      /* Pointer to first timer in linked list                         */
    INT16U           OSTmrEntries;
} OS_TMR_WHEEL;
#endif

12. 系统全局变量的定义

OS_EXT  INT32U OSCtxSwCtr; /* 任务切换的次数 */

#if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0)
OS_EXT  OS_EVENT         *OSEventFreeList;          /* 指向event链表的空闲节点 */
OS_EXT  OS_EVENT          OSEventTbl[OS_MAX_EVENTS];/* 全局event数组 */
#endif

#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
OS_EXT  OS_FLAG_GRP       OSFlagTbl[OS_MAX_FLAGS];  /* 全局flag数组*/
OS_EXT  OS_FLAG_GRP      *OSFlagFreeList;           /* 指向flag链表的空闲节点 */
#endif

#if OS_TASK_STAT_EN > 0
OS_EXT  INT8U             OSCPUUsage;               /* cpu使用率 */
OS_EXT  INT32U            OSIdleCtrMax;             /* 1s内空闲计数最大值,cpu在没事做的时候计的数 */

OS_EXT  INT32U            OSIdleCtrRun;             /* 1s内空闲计数器计数了多少。1s内可能含有空闲任务和非空闲任务,这个值用于记录空闲的。*/

OS_EXT  BOOLEAN           OSStatRdy;                /* 标志标量指示统计任务是否准备好*/

OS_EXT  OS_STK            OSTaskStatStk[OS_TASK_STAT_STK_SIZE];      /* 统计任务的任务栈 */
#endif

OS_EXT  INT8U             OSIntNesting;             /* 中断的嵌套级别 */
OS_EXT  INT8U             OSLockNesting;            /* 多任务锁的嵌套级别 */
OS_EXT  INT8U             OSPrioCur;                /* 当前正在运行的任务的优先级 */
OS_EXT  INT8U             OSPrioHighRdy;            /* 当前处于就绪态的任务中优先级最高的优先级 */

#if OS_LOWEST_PRIO <= 63
OS_EXT  INT8U             OSRdyGrp;                        /* 就绪组 */
OS_EXT  INT8U             OSRdyTbl[OS_RDY_TBL_SIZE];       /* 就绪表 */
#else
OS_EXT  INT16U            OSRdyGrp; 
OS_EXT  INT16U            OSRdyTbl[OS_RDY_TBL_SIZE]; 
#endif

OS_EXT  BOOLEAN           OSRunning;                /* 表示os启动尚未完成初始化时候为0 */
OS_EXT  INT8U             OSTaskCtr;                /* 当前一共创建了几个任务 */
OS_EXT  volatile  INT32U  OSIdleCtr;                /* 空闲计数器。跟统计任务计算cpu空闲使用率等相关 */
OS_EXT  OS_STK            OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE];      /* 空闲任务栈 */

OS_EXT  OS_TCB           *OSTCBCur;                 /* 指向当前正在执行的任务TCB */
OS_EXT  OS_TCB           *OSTCBFreeList;            /* 这个全局变量作为链表头指针,指向uc/OS维护的TCB双向链表。uCOS-II */
                                                    /* 中每个任务都有一个TCB,这些TCB是通过内置的TCB结构体中的2个指针
                                                    /* (OSTCBNext、OSTCBPrev)构建了双向链表这样我们整个uC/OS中所有的代码在 */
                                                    /* 任何位置都可以通过访问全局变量OSTCBList来找到所有任务的TCB */

OS_EXT  OS_TCB           *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];
OS_EXT  OS_TCB            OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];  /* 系统中事先定义好的所有任务的TCB数组 */
                                                                    /* OS_N_SYS_TASKS指系统创建的任务数 */

#if OS_TICK_STEP_EN > 0
OS_EXT  INT8U             OSTickStepState;          /* os view相关,不重要 */
#endif

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
OS_EXT  OS_MEM           *OSMemFreeList;                /* 动态内存管理相关  */
OS_EXT  OS_MEM            OSMemTbl[OS_MAX_MEM_PART];    /* Storage for memory partition manager            */
#endif

#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
OS_EXT  OS_Q             *OSQFreeList;              /* Pointer to list of free QUEUE control blocks    */
OS_EXT  OS_Q              OSQTbl[OS_MAX_QS];        /* 支持4个Queue */
#endif

#if OS_TIME_GET_SET_EN > 0
OS_EXT  volatile  INT32U  OSTime;                   /* 系统当前时间记录,以tick单位来记录 */
#endif

#if OS_TMR_EN > 0
//定时器相关
OS_EXT  INT16U            OSTmrFree;                /* Number of free entries in the timer pool        */
OS_EXT  INT16U            OSTmrUsed;                /* Number of timers used                           */
OS_EXT  INT32U            OSTmrTime;                /* Current timer time                              */

OS_EXT  OS_EVENT         *OSTmrSem;                 /* Sem. used to gain exclusive access to timers    */
OS_EXT  OS_EVENT         *OSTmrSemSignal;           /* Sem. used to signal the update of timers        */

OS_EXT  OS_TMR            OSTmrTbl[OS_TMR_CFG_MAX]; /* Table containing pool of timers                 */
OS_EXT  OS_TMR           *OSTmrFreeList;            /* Pointer to free list of timers                  */
OS_EXT  OS_STK            OSTmrTaskStk[OS_TASK_TMR_STK_SIZE];

OS_EXT  OS_TMR_WHEEL      OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE];
#endif

extern  INT8U   const     OSUnMapTbl[256];          /* 常数数组,跟计算当前的最高优先级的任务有关 */

接下来就是uCOS-II的核心函数的声明。ucos_ii.h文件就粗略阅读到这里,下来将阅读本目录下的其他.c文件。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ucos_II2.52 是一份非常完美的嵌入式开发系统,在学习ARM 的基础上,嵌入ucos 系统并增加自己的源码是一件不错的选择,目前在市面上已经有了大量的ucos 嵌入案例,特别是在arm 和dsp 的应用当中,已经成为一种主流,虽然和其它的嵌入式系统相比,ucos 不是很完善,如没有内存分配、任务级别不多;但却是一个代码简短、条理清晰、实时性及安全性能很高的嵌入式操作系统。 Ucos_II2.52 对比2.8 版的256 个任务而言,任务数量相比过少,但却是目前应用量最大的一个版本,相对而言,能够满足我们的基本要求,而且增加了很多消息处理,特别是在优先级别方面,具有不可比拟的优势;我曾试图阅读ecos源码,但还是失败了,还有挑战linux0.01 版源码的想法,最终我不能不被屈服;对于Ucos 而言,很多入门者是一个福音,因为它的代码非常的少,而且能够对应贝贝老师的书本直接参考,他的书本对结构方面讲解的极为xian 详细。 在学习Ucos 的整个过程中,E 文的理解是一个致命的打击,原因是我的E 文水平很差,不过Ucos 还是给了我尝试的动力,在作者的原基础上增加中文译码,也许是一件非常不错的选择,相信在中国和我这种水平的人多不胜数,中文的注解对源码而言,能够具有极高的理解价值,可以在极短的时间内,能够充分了解ucos 的真正含义。整个翻译过程历时4 个月,每每在寒冬腊月坐在计算机前面,不断的查阅贝贝老师的书来对整个Ucos 进行理解,对每个源码进行逐条翻译,也是一件非常需要勇气的事情,但E 文的翻译过程中很多变量是不能完全理解的,所以在翻译过程中不乏错误译文很多,于此带来的错误还请读者纠正,相信克服种种困难一定会有所了解的。对于经济窘迫的我来说,曾试图希望卖一点资料来养家糊口,但这种做法根本不现实,很多的读者可能和我一样,习惯了拿不收费的资料,并对变相收费有一种深恶痛绝的感觉;想了很多决定还是把它贡献出来,让更多的人来(更容易)了解ucos,贡献自己的一点力量。希望更多的人能加入这种高尚的学习氛围当中来,共同的来把一套完整的U 系列源码译文 早一日与我们分享,祝愿大家能够早日实现自己的梦想。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值