uC/OS-II源码解析(ucos_ii.h)

转自:https://blog.csdn.net/u010650845/article/details/69555382

/*
** ver: 2.52
** file: uCOS_II.H
** brief: 头文件集合,其他.c文件都会包括该头文件
*/
#define  OS_VERSION              252                    /* 版本信息 ver=250/100=2.52       */

#ifdef   OS_GLOBALS                                     /* 为了避免重复定义                */
#define  OS_EXT
#else
#define  OS_EXT  extern
#endif

#ifndef  FALSE
#define  FALSE                     0
#endif

#ifndef  TRUE
#define  TRUE                      1
#endif

#define  OS_PRIO_SELF           0xFF                    /* 任务自身优先级                   */

#if OS_TASK_STAT_EN > 0
#define  OS_N_SYS_TASKS            2                    /* 系统任务数   统计任务+空闲任务   */
#else
#define  OS_N_SYS_TASKS            1                    /* 系统任务数   空闲任务            */
#endif

#define  OS_STAT_PRIO       (OS_LOWEST_PRIO - 1)        /* 统计任务优先级 最低优先级-1      */
#define  OS_IDLE_PRIO       (OS_LOWEST_PRIO)            /* 空闲任务优先级 最低优先级        */

#define  OS_EVENT_TBL_SIZE ((OS_LOWEST_PRIO) / 8 + 1)   /* 等待事件发生的任务表大小         */
#define  OS_RDY_TBL_SIZE   ((OS_LOWEST_PRIO) / 8 + 1)   /* 任务就绪表的大小                 */

#define  OS_TASK_IDLE_ID       65535                    /* 统计任务ID,创建统计任务时使用    */
#define  OS_TASK_STAT_ID       65534                    /* 空闲任务ID,创建空闲任务时使用    */

/* 1:定义了消息队列或消息邮箱或信号量或互斥型信号量  0:均未定义 */
#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_STAT_RDY            0x00        /* 就绪态                                       */
#define  OS_STAT_SEM            0x01        /* 等待信号量                                   */
#define  OS_STAT_MBOX           0x02        /* 等待消息邮箱                                 */
#define  OS_STAT_Q              0x04        /* 等待消息队列                                 */
#define  OS_STAT_SUSPEND        0x08        /* 挂起态                                       */
#define  OS_STAT_MUTEX          0x10        /* 等待互斥信号量                               */
#define  OS_STAT_FLAG           0x20        /* 等待时间标志组                               */

/*
*********************************************************************************************
*                                        事件类型
*********************************************************************************************
*/
#define  OS_EVENT_TYPE_UNUSED      0 /* 未使用,初始化时为该状态                            */
#define  OS_EVENT_TYPE_MBOX        1 /* 消息邮箱                                            */
#define  OS_EVENT_TYPE_Q           2 /* 消息队列                                            */
#define  OS_EVENT_TYPE_SEM         3 /* 信号量                                              */
#define  OS_EVENT_TYPE_MUTEX       4 /* 互斥型信号量                                        */
#define  OS_EVENT_TYPE_FLAG        5 /* 事件标志组                                          */

/*
*********************************************************************************************
*                                         事件标志组
*********************************************************************************************
*/
#define  OS_FLAG_WAIT_CLR_ALL      0        /* 等待选择的位全部变成0                        */ 
#define  OS_FLAG_WAIT_CLR_AND      0        /* 等待选择的位全部变成0                        */  

#define  OS_FLAG_WAIT_CLR_ANY      1        /* 等待选择的位中任意一个变为0                  */
#define  OS_FLAG_WAIT_CLR_OR       1        /* 等待选择的位中任意一个变为0                  */

#define  OS_FLAG_WAIT_SET_ALL      2        /* 等待选择的位全部变成1                        */ 
#define  OS_FLAG_WAIT_SET_AND      2        /* 等待选择的位全部变成1                        */

#define  OS_FLAG_WAIT_SET_ANY      3        /* 等待选择的位中任意一个变为1                  */
#define  OS_FLAG_WAIT_SET_OR       3        /* 等待选择的位中任意一个变为1                  */


#define  OS_FLAG_CONSUME        0x80        /* 清除选择的位                                 */


#define  OS_FLAG_CLR               0       /* 清0                                           */
#define  OS_FLAG_SET               1       /* 置1                                           */

/*
*********************************************************************************************
*       事件删除参数 : OSSemDel(), OSMboxDel(), OSQDel() and OSMutexDel()
*********************************************************************************************
*/
#define  OS_DEL_NO_PEND            0    /* 无任务等待该事件时删除                           */
#define  OS_DEL_ALWAYS             1    /* 有无任务等待该事件都删除                         */

/*
*********************************************************************************************
*                                消息发送参数 : OSMboxPostOpt() and OSQPostOpt().
*********************************************************************************************
*/
#define  OS_POST_OPT_NONE       0x00        /* 将消息发送给等待任务中优先级最高的任务        */
#define  OS_POST_OPT_BROADCAST  0x01        /* 将消息发送给所有的等待任务                    */  
#define  OS_POST_OPT_FRONT      0x02        /* 将消息发送给等待任务中优先级最高的任务        */

/*
**********************************************************************************************
*                                 创建任务时参数 : OSTaskCreateExt()
**********************************************************************************************
*/
#define  OS_TASK_OPT_STK_CHK  0x0001        /* 任务堆栈检查                                  */
#define  OS_TASK_OPT_STK_CLR  0x0002        /* 任务堆栈清0                                   */
#define  OS_TASK_OPT_SAVE_FP  0x0004        /* 保存浮点寄存器                                */

/*
**********************************************************************************************
*                                             错误码
**********************************************************************************************
*/
#define OS_NO_ERR                 0 /* 无错误 */

#define OS_ERR_EVENT_TYPE         1 /* 错误的事件类型                                         */
#define OS_ERR_PEND_ISR           2 /* 在中断中请求事件                                       */
#define OS_ERR_POST_NULL_PTR      3 /* 向邮箱/消息队列中发送消息时 消息指针为空               */
#define OS_ERR_PEVENT_NULL        4 /* 对事件进行操作时,事件指针为空                         */ 
#define OS_ERR_POST_ISR           5 /* 在中断中释放互斥型信号量                               */
#define OS_ERR_QUERY_ISR          6 /* 在中断中查询互斥型信号量                               */
#define OS_ERR_INVALID_OPT        7 /* 无效的参数                                             */ 
#define OS_ERR_TASK_WAITING       8 /* 有任务正在等待事件 不能删除该事件                      */

#define OS_TIMEOUT               10 /* 超时                                                   */
#define OS_TASK_NOT_EXIST        11 /* 任务不存在                                             */

#define OS_MBOX_FULL             20 /* 邮箱满                                                 */

#define OS_Q_FULL                30 /* 消息队列满                                             */

#define OS_PRIO_EXIST            40 /* 已存在该优先级任务                                     */
#define OS_PRIO_ERR              41 /* 错误的优先级                                           */
#define OS_PRIO_INVALID          42 /* 无效的优先级                                           */

#define OS_SEM_OVF               50 /* 信号量的值大于等于65535                                */

#define OS_TASK_DEL_ERR          60 /* 删除任务时指定了空的任务控制块指针                     */
#define OS_TASK_DEL_IDLE         61 /* 删除空闲任务                                           */
#define OS_TASK_DEL_REQ          62 /* 删除请求 该红定义并不是错误码                          */
#define OS_TASK_DEL_ISR          63 /* 中断中删除任务                                         */ 

#define OS_NO_MORE_TCB           70 /* 无空余任务控制块                                       */

#define OS_TIME_NOT_DLY          80 /* 任务本来就没有延时时取消延时                           */
#define OS_TIME_INVALID_MINUTES  81 /* 无效的分钟数                                           */
#define OS_TIME_INVALID_SECONDS  82 /* 无效的秒数                                             */
#define OS_TIME_INVALID_MILLI    83 /* 无效的毫秒数                                           */
#define OS_TIME_ZERO_DLY         84 /* 延时参数为0                                            */

#define OS_TASK_SUSPEND_PRIO     90 /* 待挂起的任务不存在                                     */
#define OS_TASK_SUSPEND_IDLE     91 /* 挂起空闲任务                                           */

#define OS_TASK_RESUME_PRIO     100 /* 待恢复的任务不存在                                     */
#define OS_TASK_NOT_SUSPENDED   101 /* 待恢复的任务没有被挂起                                 */

#define OS_MEM_INVALID_PART     110 /* 无剩余内存控制块                                       */
#define OS_MEM_INVALID_BLKS     111 /* 内存块的数目小于2                                      */
#define OS_MEM_INVALID_SIZE     112 /* 内存块的代销小于一个指针的大小                         */
#define OS_MEM_NO_FREE_BLKS     113 /* 无剩余内存块                                           */ 
#define OS_MEM_FULL             114 /* 内存满                                                 */
#define OS_MEM_INVALID_PBLK     115 /* 无效的内存块指针                                       */
#define OS_MEM_INVALID_PMEM     116 /* 无效的内存控制块指针                                   */
#define OS_MEM_INVALID_PDATA    117 /* 无效的OS_MEM_DATA指针                                  */
#define OS_MEM_INVALID_ADDR     118 /* 无效的地址                                             */

#define OS_ERR_NOT_MUTEX_OWNER  120 /* 未占用互斥性信号量的任务释放信号量                     */

#define OS_TASK_OPT_ERR         130 /* 任务不运行进行堆栈检查                                 */

#define OS_ERR_DEL_ISR          140 /* 中断中删除事件                                         */
#define OS_ERR_CREATE_ISR       141 /* 中断中创建任务                                         */

#define OS_FLAG_INVALID_PGRP    150 /* 无效的事件标志组指针呢                                 */
#define OS_FLAG_ERR_WAIT_TYPE   151 /* 无效的等待类型                                         */
#define OS_FLAG_ERR_NOT_RDY     152 /* 请求的标志组无效                                       */
#define OS_FLAG_INVALID_OPT     153 /* 无效的参数                                             */
#define OS_FLAG_GRP_DEPLETED    154 /* 无空闲的事件标志组                                     */

/*
***********************************************************************************************
*                                          事件控制块
***********************************************************************************************
*/

#if (OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)
typedef struct {
    INT8U   OSEventType;                   /* 事件类型 信号量/互斥型信号量/邮箱/消息队列      */
    INT8U   OSEventGrp;                    /* 等待任务发生的任务表                            */
    INT16U  OSEventCnt;                    /* 信号量值                                        */
    void   *OSEventPtr;                    /* 指向邮箱或消息队列指针                          */
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; /* 等待事件发生的任务表                            */
} OS_EVENT;
#endif


/*
************************************************************************************************
*                                       事件标志组控制块
************************************************************************************************
*/

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
typedef struct {                            /*  事件标志组                                     */
    INT8U         OSFlagType;               /*  用来检测指针的类型是否是指向事件标志组的指针   */
    void         *OSFlagWaitList;           /* 等待事件标志组的任务列表                        */
    OS_FLAGS      OSFlagFlags;              /* 当前事件标志状态位 8/16/32bits                  */
} OS_FLAG_GRP;    



typedef struct {                            /* 事件标志组等待链表节点                          */
    void         *OSFlagNodeNext;           /* 构建 OS_FLAG_NODE 双向链表                      */
    void         *OSFlagNodePrev;           /* 构建 OS_FLAG_NODE 双向链表                      */
    void         *OSFlagNodeTCB;            /* 指向等待事件标志组中事件标志的任务控制块        */  
    void         *OSFlagNodeFlagGrp;        /* 回指 OS_FLAG_GRP                                */  
    OS_FLAGS      OSFlagNodeFlags;          /* 指明任务等待事件标志组中的哪些事件标志          */  
    INT8U         OSFlagNodeWaitType;       /* 等待类型                                        */
                                            /*      OS_FLAG_WAIT_AND                           */
                                            /*      OS_FLAG_WAIT_ALL                           */
                                            /*      OS_FLAG_WAIT_OR                            */
                                            /*      OS_FLAG_WAIT_ANY                           */
} OS_FLAG_NODE;
#endif


/*
************************************************************************************************
*                                          消息邮箱
************************************************************************************************
*/

#if OS_MBOX_EN > 0
typedef struct {
    void   *OSMsg;                         /* 消息指针                                         */
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; /* 等待消息的任务表                                 */
    INT8U   OSEventGrp;                    /* 等待消息的任务表                                 */
} OS_MBOX_DATA;
#endif

/*
************************************************************************************************
*                                     内存分区
************************************************************************************************
*/

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
typedef struct {                       /* 内存控制块                                           */
    void   *OSMemAddr;                 /* 指向内存分区起始地址的指针                           */
    void   *OSMemFreeList;             /* 指向下一个空余内存控制块或者下一个空余内存块         */
    INT32U  OSMemBlkSize;              /* 内存块的大小                                         */
    INT32U  OSMemNBlks;                /* 内存块数目                                           */
    INT32U  OSMemNFree;                /* 空余内存块数目                                       */
} OS_MEM;


typedef struct {
    void   *OSAddr;                    /* 指向内存分区首地址的指针                             */
    void   *OSFreeList;                /* 指向空余内存块链表首地址的指针                       */
    INT32U  OSBlkSize;                 /* 每个内存块所含的字节数                               */
    INT32U  OSNBlks;                   /* 内存分区总的内存块的数目                             */
    INT32U  OSNFree;                   /* 空余内存块总数                                       */
    INT32U  OSNUsed;                   /* 正在使用的内存块总数                                 */
} OS_MEM_DATA;
#endif
/*
************************************************************************************************
*                                    互斥型信号量
************************************************************************************************
*/

#if OS_MUTEX_EN > 0
typedef struct {
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE];  /* 等待事件发生的任务列表                          */
    INT8U   OSEventGrp;                     /* 等待事件发生的任务列表                          */
    INT8U   OSValue;                        /* 信号量值(0 =无效, 1 = 有效)                     */
    INT8U   OSOwnerPrio;                    /* 拥有信号量任务优先级或0xFF                      */
    INT8U   OSMutexPIP;                     /* 优先级继承优先级或者0xFF                        */
} OS_MUTEX_DATA;
#endif

/*
************************************************************************************************
*                                          消息队列
************************************************************************************************
*/

#if OS_Q_EN > 0
typedef struct os_q {                   /* 队列控制块                                                            */
    struct os_q   *OSQPtr;              /* 在空闲队列控制块中,连接所有的队列控制块 一旦建立的消息该值不再有用    */
    void         **OSQStart;            /* 指向消息队列的指针数组的起始地址的指针                                 */
    void         **OSQEnd;              /* 指向消息队列结束单元的下一个地址的指针                                 */
    void         **OSQIn;               /* 指向消息队列中插入下一条消息的位置的指针                               */
    void         **OSQOut;              /* 指向消息队列中下一个取出消息的位置的指针                               */
    INT16U         OSQSize;             /* 消息队列中可容纳总的消息数                                             */
    INT16U         OSQEntries;          /* 消息队列中当前的消息数                                                 */
} OS_Q;


typedef struct {
    void          *OSMsg;               /* 如果消息队列中有消息那么包含指针.OSQOut所指向的内容 否则为NULL         */
    INT16U         OSNMsgs;             /* 消息队列中消息数目                                                     */
    INT16U         OSQSize;             /* 消息队列总容量                                                         */
    INT8U          OSEventTbl[OS_EVENT_TBL_SIZE];  /* 等待事件发生的任务列表                                      */
    INT8U          OSEventGrp;          /* 等待事件发生的任务列表                                                 */
} OS_Q_DATA;
#endif

/*
*************************************************************************************************
*                                           信号量
*************************************************************************************************
*/

#if OS_SEM_EN > 0
typedef struct {
    INT16U  OSCnt;                          /* 信号量值                                        */
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE];  /* 等待事件发生的任务列表                          */
    INT8U   OSEventGrp;                     /* 等待事件发生的任务列表                          */
} OS_SEM_DATA;
#endif

/*
************************************************************************************************
*                                            任务堆栈
************************************************************************************************
*/

#if OS_TASK_CREATE_EXT_EN > 0
typedef struct {
    INT32U  OSFree;                    /* 剩余字节数                                           */
    INT32U  OSUsed;                    /* 已使用的字节数                                       */
} OS_STK_DATA;
#endif

/*
************************************************************************************************
*                                          任务控制块
************************************************************************************************
*/

typedef struct os_tcb {
    OS_STK        *OSTCBStkPtr;        /* 指向任务堆栈栈顶的指针                               */

#if OS_TASK_CREATE_EXT_EN > 0
    void          *OSTCBExtPtr;        /* 指向用户定义的任务控制块扩展                         */
    OS_STK        *OSTCBStkBottom;     /* 指向任务堆栈栈底的指针                               */
    INT32U         OSTCBStkSize;       /* 堆栈中可容纳的指针元数目,而不是用字节表示容量       */
    INT16U         OSTCBOpt;           /* 把选择项传递给 "OSTaskCreateExt()"                   */
    INT16U         OSTCBId;            /* 任务ID 暂时没有使用,保留扩展使用                    */
#endif

    struct os_tcb *OSTCBNext;          /* 用于任务控制块双向链表的链接                         */
    struct os_tcb *OSTCBPrev;          /* 用于任务控制块双向链表的链接                         */

#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
    OS_EVENT      *OSTCBEventPtr;      /* 指向事件控制块的指针                                 */
#endif

#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
    void          *OSTCBMsg;           /* 指向传递给任务的指针                                 */
#endif

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
#if OS_TASK_DEL_EN > 0
    OS_FLAG_NODE  *OSTCBFlagNode;      /* 指向事件标志节点的指针                               */
#endif    
    OS_FLAGS       OSTCBFlagsRdy;      /* 当任务等待时间标志组时,使任务进入就绪态的事件标志   */
#endif

    INT16U         OSTCBDly;           /* 延时时间                                             */
    INT8U          OSTCBStat;          /* 任务状态                                             */
    INT8U          OSTCBPrio;          /* 任务优先级                                           */

    INT8U          OSTCBX;             /* 加速任务进入就绪态或进入等待事件发生状态的过程       */
    INT8U          OSTCBY;             /* 加速任务进入就绪态或进入等待事件发生状态的过程       */
    INT8U          OSTCBBitX;          /* 加速任务进入就绪态或进入等待事件发生状态的过程       */
    INT8U          OSTCBBitY;          /* 加速任务进入就绪态或进入等待事件发生状态的过程       */

#if OS_TASK_DEL_EN > 0
    BOOLEAN        OSTCBDelReq;        /* 表示该任务是否需要删除自己                           */
#endif
} OS_TCB;

/*
*************************************************************************************************
*                                            全局变量
*************************************************************************************************
*/

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

#if (OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)
OS_EXT  OS_EVENT         *OSEventFreeList;          /* 指向空事件控制块的指针                  */
OS_EXT  OS_EVENT          OSEventTbl[OS_MAX_EVENTS];/* 事件控制块数组                          */
#endif

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
OS_EXT  OS_FLAG_GRP       OSFlagTbl[OS_MAX_FLAGS];  /* 事件标志组数组                          */
OS_EXT  OS_FLAG_GRP      *OSFlagFreeList;           /* 指向空时间标志组的指针                  */
#endif

#if OS_TASK_STAT_EN > 0
OS_EXT  INT8S             OSCPUUsage;               /* CPU使用率                               */
OS_EXT  INT32U            OSIdleCtrMax;             /* 1秒内空闲任务运行次数最大值             */
OS_EXT  INT32U            OSIdleCtrRun;             /* 1秒内空闲任务运行次数                   */
OS_EXT  BOOLEAN           OSStatRdy;                /* 统计任务处于就绪态                      */
OS_EXT  OS_STK            OSTaskStatStk[OS_TASK_STAT_STK_SIZE];      /* 统计任务堆栈           */
#endif

OS_EXT  INT8U             OSIntNesting;             /* 中断嵌套层数                            */
OS_EXT  INT8U             OSIntExitY;

OS_EXT  INT8U             OSLockNesting;            /* 禁止调度锁层数                          */

OS_EXT  INT8U             OSPrioCur;                /* 当前运行任务优先级                      */
OS_EXT  INT8U             OSPrioHighRdy;            /* 优先级最高的就绪任务优先级              */

OS_EXT  INT8U             OSRdyGrp;                        /* 任务就绪表                       */
OS_EXT  INT8U             OSRdyTbl[OS_RDY_TBL_SIZE];       /* 任务就绪表                       */

OS_EXT  BOOLEAN           OSRunning;                       /* 标志系统是否运行                 */

OS_EXT  INT8U             OSTaskCtr;                       /* 任务数                           */

OS_EXT  volatile  INT32U  OSIdleCtr;                                 /* 空闲任务运行计数器     */

OS_EXT  OS_STK            OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE];      /* 空闲任务堆栈           */


OS_EXT  OS_TCB           *OSTCBCur;                        /* 指向当前任务控制块的指针         */
OS_EXT  OS_TCB           *OSTCBFreeList;                   /* 指向空任务控制块的指针           */
OS_EXT  OS_TCB           *OSTCBHighRdy;                    /* 指针最高优先级就绪任务的任务控制块的指针 */
OS_EXT  OS_TCB           *OSTCBList;                       /* 指向以创建任务的任务空间块的指针 */
OS_EXT  OS_TCB           *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];/* 指向每个任任务的任务控制块       */
OS_EXT  OS_TCB            OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];   /* 任务控制块数组         */

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
OS_EXT  OS_MEM           *OSMemFreeList;            /* 指向空内存分区的指针                    */
OS_EXT  OS_MEM            OSMemTbl[OS_MAX_MEM_PART];/* 内存分区数组                            */
#endif

#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
OS_EXT  OS_Q             *OSQFreeList;              /* 指向空队列控制块的指针                  */
OS_EXT  OS_Q              OSQTbl[OS_MAX_QS];        /* 队列控制块数组                          */
#endif

#if OS_TIME_GET_SET_EN > 0   
OS_EXT  volatile  INT32U  OSTime;                   /* 系统当前时间                            */
#endif

extern  INT8U  const      OSMapTbl[];               /* 优先级查询表                            */
extern  INT8U  const      OSUnMapTbl[];             /* 优先级查询表                            */

/*
************************************************************************************************
*                                          函数申明
************************************************************************************************
*/

/*
************************************************************************************************
*                                         事件标志组管理
************************************************************************************************
*/

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)

#if OS_FLAG_ACCEPT_EN > 0
OS_FLAGS      OSFlagAccept(OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *err);
#endif

OS_FLAG_GRP  *OSFlagCreate(OS_FLAGS flags, INT8U *err);

#if OS_FLAG_DEL_EN > 0
OS_FLAG_GRP  *OSFlagDel(OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err);
#endif

OS_FLAGS      OSFlagPend(OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err);
OS_FLAGS      OSFlagPost(OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U operation, INT8U *err);

#if OS_FLAG_QUERY_EN > 0
OS_FLAGS      OSFlagQuery(OS_FLAG_GRP *pgrp, INT8U *err);
#endif
#endif

/*
***********************************************************************************************
*                                        消息邮箱管理
***********************************************************************************************
*/

#if OS_MBOX_EN > 0

#if OS_MBOX_ACCEPT_EN > 0
void         *OSMboxAccept(OS_EVENT *pevent);
#endif

OS_EVENT     *OSMboxCreate(void *msg);

#if OS_MBOX_DEL_EN > 0
OS_EVENT     *OSMboxDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
#endif

void         *OSMboxPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);

#if OS_MBOX_POST_EN > 0
INT8U         OSMboxPost(OS_EVENT *pevent, void *msg);
#endif

#if OS_MBOX_POST_OPT_EN > 0
INT8U         OSMboxPostOpt(OS_EVENT *pevent, void *msg, INT8U opt);
#endif

#if OS_MBOX_QUERY_EN > 0
INT8U         OSMboxQuery(OS_EVENT *pevent, OS_MBOX_DATA *pdata);
#endif
#endif

/*
**********************************************************************************************
*                                           内存管理
**********************************************************************************************
*/

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)

OS_MEM       *OSMemCreate(void *addr, INT32U nblks, INT32U blksize, INT8U *err);
void         *OSMemGet(OS_MEM *pmem, INT8U *err);
INT8U         OSMemPut(OS_MEM *pmem, void *pblk);

#if OS_MEM_QUERY_EN > 0
INT8U         OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);
#endif

#endif

/*
**********************************************************************************************
*                                互斥型信号量
**********************************************************************************************
*/

#if OS_MUTEX_EN > 0

#if OS_MUTEX_ACCEPT_EN > 0
INT8U         OSMutexAccept(OS_EVENT *pevent, INT8U *err);
#endif

OS_EVENT     *OSMutexCreate(INT8U prio, INT8U *err);

#if OS_MUTEX_DEL_EN > 0
OS_EVENT     *OSMutexDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
#endif

void          OSMutexPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
INT8U         OSMutexPost(OS_EVENT *pevent);

#if OS_MUTEX_QUERY_EN > 0
INT8U         OSMutexQuery(OS_EVENT *pevent, OS_MUTEX_DATA *pdata);
#endif

#endif

/*
*********************************************************************************************
*                                         消息队列管理
*********************************************************************************************
*/

#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)

#if OS_Q_ACCEPT_EN > 0
void         *OSQAccept(OS_EVENT *pevent);
#endif

OS_EVENT     *OSQCreate(void **start, INT16U size);

#if OS_Q_DEL_EN > 0
OS_EVENT     *OSQDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
#endif

#if OS_Q_FLUSH_EN > 0
INT8U         OSQFlush(OS_EVENT *pevent);
#endif

void         *OSQPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);

#if OS_Q_POST_EN > 0
INT8U         OSQPost(OS_EVENT *pevent, void *msg);
#endif

#if OS_Q_POST_FRONT_EN > 0
INT8U         OSQPostFront(OS_EVENT *pevent, void *msg);
#endif

#if OS_Q_POST_OPT_EN > 0
INT8U         OSQPostOpt(OS_EVENT *pevent, void *msg, INT8U opt);
#endif

#if OS_Q_QUERY_EN > 0
INT8U         OSQQuery(OS_EVENT *pevent, OS_Q_DATA *pdata);
#endif

#endif

/*
*********************************************************************************************
*                                          信号量
*********************************************************************************************
*/
#if OS_SEM_EN > 0

#if OS_SEM_ACCEPT_EN > 0
INT16U        OSSemAccept(OS_EVENT *pevent);
#endif

OS_EVENT     *OSSemCreate(INT16U cnt);

#if OS_SEM_DEL_EN > 0
OS_EVENT     *OSSemDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
#endif

void          OSSemPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
INT8U         OSSemPost(OS_EVENT *pevent);

#if OS_SEM_QUERY_EN > 0
INT8U         OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA *pdata);
#endif

#endif

/*
*********************************************************************************************
*                                            任务管理
*********************************************************************************************
*/
#if OS_TASK_CHANGE_PRIO_EN > 0
INT8U         OSTaskChangePrio(INT8U oldprio, INT8U newprio);
#endif

#if OS_TASK_CREATE_EN > 0
INT8U         OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);
#endif

#if OS_TASK_CREATE_EXT_EN > 0
INT8U         OSTaskCreateExt(void  (*task)(void *pd),
                              void   *pdata,
                              OS_STK *ptos,
                              INT8U   prio,
                              INT16U  id,
                              OS_STK *pbos,
                              INT32U  stk_size,
                              void   *pext,
                              INT16U  opt);
#endif

#if OS_TASK_DEL_EN > 0
INT8U         OSTaskDel(INT8U prio);
INT8U         OSTaskDelReq(INT8U prio);
#endif

#if OS_TASK_SUSPEND_EN > 0
INT8U         OSTaskResume(INT8U prio);
INT8U         OSTaskSuspend(INT8U prio);
#endif

#if OS_TASK_CREATE_EXT_EN > 0
INT8U         OSTaskStkChk(INT8U prio, OS_STK_DATA *pdata);
#endif

#if OS_TASK_QUERY_EN > 0
INT8U         OSTaskQuery(INT8U prio, OS_TCB *pdata);
#endif

/*$PAGE*/
/*
*********************************************************************************************
*                                            时间管理
*********************************************************************************************
*/

void          OSTimeDly(INT16U ticks);

#if OS_TIME_DLY_HMSM_EN > 0
INT8U         OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U milli);
#endif

#if OS_TIME_DLY_RESUME_EN > 0
INT8U         OSTimeDlyResume(INT8U prio);
#endif

#if OS_TIME_GET_SET_EN > 0
INT32U        OSTimeGet(void);
void          OSTimeSet(INT32U ticks);
#endif

void          OSTimeTick(void);

/*
********************************************************************************************
*                                            杂项
********************************************************************************************
*/

void          OSInit(void);

void          OSIntEnter(void);
void          OSIntExit(void);

#if OS_SCHED_LOCK_EN > 0
void          OSSchedLock(void);
void          OSSchedUnlock(void);
#endif

void          OSStart(void);

void          OSStatInit(void);

INT16U        OSVersion(void);

/*$PAGE*/
/*
*********************************************************************************************
*                                      内部函数声明
*                            (你的应用不应该调用下面这些函数)
*********************************************************************************************
*/

#if OS_TASK_DEL_EN > 0
void          OS_Dummy(void);
#endif

#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
INT8U         OS_EventTaskRdy(OS_EVENT *pevent, void *msg, INT8U msk);
void          OS_EventTaskWait(OS_EVENT *pevent);
void          OS_EventTO(OS_EVENT *pevent);
void          OS_EventWaitListInit(OS_EVENT *pevent);
#endif

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
void          OS_FlagInit(void);
void          OS_FlagUnlink(OS_FLAG_NODE *pnode);
#endif

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
void          OS_MemInit(void);
#endif

#if OS_Q_EN > 0
void          OS_QInit(void);
#endif

void          OS_Sched(void);

void          OS_TaskIdle(void *data);

#if OS_TASK_STAT_EN > 0
void          OS_TaskStat(void *data);
#endif

INT8U         OS_TCBInit(INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt);

/*$PAGE*/
/*
**********************************************************************************************
*                                          函数申明
**********************************************************************************************
*/

#if OS_VERSION >= 204
void          OSInitHookBegin(void);
void          OSInitHookEnd(void);
#endif

void          OSIntCtxSw(void);

void          OSStartHighRdy(void);

void          OSTaskCreateHook(OS_TCB *ptcb);
void          OSTaskDelHook(OS_TCB *ptcb);

#if OS_VERSION >= 251
void          OSTaskIdleHook(void);
#endif

void          OSTaskStatHook(void);
OS_STK       *OSTaskStkInit(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt);
void          OSTaskSwHook(void);

#if OS_VERSION >= 204
void          OSTCBInitHook(OS_TCB *ptcb);
#endif

void          OSTimeTickHook(void);

/*
***********************************************************************************************
*                                         函数声明
***********************************************************************************************
*/

#ifndef OS_ISR_PROTO_EXT
void          OSCtxSw(void);     /* 任务切换函数 汇编实现 */
void          OSTickISR(void);  /* 始终节拍中断服务函数 汇编实现 */
#endif

/*
***********************************************************************************************
*
* 这部分用于在编译时生成错误提示信息, 如果在OS_CFG.H中没有相关宏定义
* 可以根据提示信息快速找到错误位置
*
***********************************************************************************************
*/

/*
************************************************************************************************
*                                            事件标志组相关
************************************************************************************************
*/

#ifndef OS_FLAG_EN
#error  "OS_CFG.H, Missing OS_FLAG_EN: Enable (1) or Disable (0) code generation for Event Flags"
#else
    #ifndef OS_MAX_FLAGS
    #error  "OS_CFG.H, Missing OS_MAX_FLAGS: Max. number of Event Flag Groups in your application"
    #else
        #if     OS_MAX_FLAGS == 0
        #error  "OS_CFG.H, OS_MAX_FLAGS must be > 0"
        #endif
        #if     OS_MAX_FLAGS > 255
        #error  "OS_CFG.H, OS_MAX_FLAGS must be <= 255"
        #endif
    #endif

    #ifndef OS_FLAG_WAIT_CLR_EN
    #error  "OS_CFG.H, Missing OS_FLAG_WAIT_CLR_EN: Include code for Wait on Clear EVENT FLAGS"
    #endif

    #ifndef OS_FLAG_ACCEPT_EN
    #error  "OS_CFG.H, Missing OS_FLAG_ACCEPT_EN: Include code for OSFlagAccept()"
    #endif

    #ifndef OS_FLAG_DEL_EN
    #error  "OS_CFG.H, Missing OS_FLAG_DEL_EN: Include code for OSFlagDel()"
    #endif

    #ifndef OS_FLAG_QUERY_EN
    #error  "OS_CFG.H, Missing OS_FLAG_QUERY_EN: Include code for OSFlagQuery()"
    #endif
#endif

/*
************************************************************************************************
*                                           消息邮箱相关
************************************************************************************************
*/

#ifndef OS_MBOX_EN
#error  "OS_CFG.H, Missing OS_MBOX_EN: Enable (1) or Disable (0) code generation for MAILBOXES"
#else
    #ifndef OS_MBOX_ACCEPT_EN
    #error  "OS_CFG.H, Missing OS_MBOX_ACCEPT_EN: Include code for OSMboxAccept()"
    #endif

    #ifndef OS_MBOX_DEL_EN
    #error  "OS_CFG.H, Missing OS_MBOX_DEL_EN: Include code for OSMboxDel()"
    #endif

    #ifndef OS_MBOX_POST_EN
    #error  "OS_CFG.H, Missing OS_MBOX_POST_EN: Include code for OSMboxPost()"
    #endif

    #ifndef OS_MBOX_POST_OPT_EN
    #error  "OS_CFG.H, Missing OS_MBOX_POST_OPT_EN: Include code for OSMboxPostOpt()"
    #endif

    #ifndef OS_MBOX_QUERY_EN
    #error  "OS_CFG.H, Missing OS_MBOX_QUERY_EN: Include code for OSMboxQuery()"
    #endif
#endif

/*
************************************************************************************************
*                                           内存相关
************************************************************************************************
*/

#ifndef OS_MEM_EN
#error  "OS_CFG.H, Missing OS_MEM_EN: Enable (1) or Disable (0) code generation for MEMORY MANAGER"
#else
    #ifndef OS_MAX_MEM_PART
    #error  "OS_CFG.H, Missing OS_MAX_MEM_PART: Max. number of memory partitions"
    #else
        #if     OS_MAX_MEM_PART == 0
        #error  "OS_CFG.H, OS_MAX_MEM_PART must be > 0"
        #endif
        #if     OS_MAX_MEM_PART > 255
        #error  "OS_CFG.H, OS_MAX_MEM_PART must be <= 255"
        #endif
    #endif

    #ifndef OS_MEM_QUERY_EN
    #error  "OS_CFG.H, Missing OS_MEM_QUERY_EN: Include code for OSMemQuery()"
    #endif
#endif

/*
***********************************************************************************************
*                                       互斥型信号量
***********************************************************************************************
*/

#ifndef OS_MUTEX_EN
#error  "OS_CFG.H, Missing OS_MUTEX_EN: Enable (1) or Disable (0) code generation for MUTEX"
#else
    #ifndef OS_MUTEX_ACCEPT_EN
    #error  "OS_CFG.H, Missing OS_MUTEX_ACCEPT_EN: Include code for OSMutexAccept()"
    #endif

    #ifndef OS_MUTEX_DEL_EN
    #error  "OS_CFG.H, Missing OS_MUTEX_DEL_EN: Include code for OSMutexDel()"
    #endif

    #ifndef OS_MUTEX_QUERY_EN
    #error  "OS_CFG.H, Missing OS_MUTEX_QUERY_EN: Include code for OSMutexQuery()"
    #endif
#endif

/*
***************************************************************************************************
*                                              消息队列相关
***************************************************************************************************
*/

#ifndef OS_Q_EN
#error  "OS_CFG.H, Missing OS_Q_EN: Enable (1) or Disable (0) code generation for QUEUES"
#else
    #ifndef OS_MAX_QS
    #error  "OS_CFG.H, Missing OS_MAX_QS: Max. number of queue control blocks"
    #else
        #if     OS_MAX_QS == 0
        #error  "OS_CFG.H, OS_MAX_QS must be > 0"
        #endif
        #if     OS_MAX_QS > 255
        #error  "OS_CFG.H, OS_MAX_QS must be <= 255"
        #endif
    #endif

    #ifndef OS_Q_ACCEPT_EN
    #error  "OS_CFG.H, Missing OS_Q_ACCEPT_EN: Include code for OSQAccept()"
    #endif

    #ifndef OS_Q_DEL_EN
    #error  "OS_CFG.H, Missing OS_Q_DEL_EN: Include code for OSQDel()"
    #endif

    #ifndef OS_Q_FLUSH_EN
    #error  "OS_CFG.H, Missing OS_Q_FLUSH_EN: Include code for OSQFlush()"
    #endif

    #ifndef OS_Q_POST_EN
    #error  "OS_CFG.H, Missing OS_Q_POST_EN: Include code for OSQPost()"
    #endif

    #ifndef OS_Q_POST_FRONT_EN
    #error  "OS_CFG.H, Missing OS_Q_POST_FRONT_EN: Include code for OSQPostFront()"
    #endif

    #ifndef OS_Q_POST_OPT_EN
    #error  "OS_CFG.H, Missing OS_Q_POST_OPT_EN: Include code for OSQPostOpt()"
    #endif

    #ifndef OS_Q_QUERY_EN
    #error  "OS_CFG.H, Missing OS_Q_QUERY_EN: Include code for OSQQuery()"
    #endif
#endif

/*
************************************************************************************************
*                                              信号量相关
************************************************************************************************
*/

#ifndef OS_SEM_EN
#error  "OS_CFG.H, Missing OS_SEM_EN: Enable (1) or Disable (0) code generation for SEMAPHORES"
#else
    #ifndef OS_SEM_ACCEPT_EN
    #error  "OS_CFG.H, Missing OS_SEM_ACCEPT_EN: Include code for OSSemAccept()"
    #endif

    #ifndef OS_SEM_DEL_EN
    #error  "OS_CFG.H, Missing OS_SEM_DEL_EN: Include code for OSSemDel()"
    #endif

    #ifndef OS_SEM_QUERY_EN
    #error  "OS_CFG.H, Missing OS_SEM_QUERY_EN: Include code for OSSemQuery()"
    #endif
#endif

/*
************************************************************************************************
*                                             任务相关
************************************************************************************************
*/

#ifndef OS_MAX_TASKS
#error  "OS_CFG.H, Missing OS_MAX_TASKS: Max. number of tasks in your application"
#else
    #if     OS_MAX_TASKS == 0
    #error  "OS_CFG.H,         OS_MAX_TASKS must be >= 2"
    #endif
    #if     OS_MAX_TASKS > 63
    #error  "OS_CFG.H,         OS_MAX_TASKS must be <= 63"
    #endif
#endif

#ifndef OS_TASK_IDLE_STK_SIZE
#error  "OS_CFG.H, Missing OS_TASK_IDLE_STK_SIZE: Idle task stack size"
#endif

#ifndef OS_TASK_STAT_EN
#error  "OS_CFG.H, Missing OS_TASK_STAT_EN: Enable (1) or Disable(0) the statistics task"
#endif

#ifndef OS_TASK_STAT_STK_SIZE
#error  "OS_CFG.H, Missing OS_TASK_STAT_STK_SIZE: Statistics task stack size"
#endif

#ifndef OS_TASK_CHANGE_PRIO_EN
#error  "OS_CFG.H, Missing OS_TASK_CHANGE_PRIO_EN: Include code for OSTaskChangePrio()"
#endif

#ifndef OS_TASK_CREATE_EN
#error  "OS_CFG.H, Missing OS_TASK_CREATE_EN: Include code for OSTaskCreate()"
#endif

#ifndef OS_TASK_CREATE_EXT_EN
#error  "OS_CFG.H, Missing OS_TASK_CREATE_EXT_EN: Include code for OSTaskCreateExt()"
#endif

#ifndef OS_TASK_DEL_EN
#error  "OS_CFG.H, Missing OS_TASK_DEL_EN: Include code for OSTaskDel()"
#endif

#ifndef OS_TASK_SUSPEND_EN
#error  "OS_CFG.H, Missing OS_TASK_SUSPEND_EN: Include code for OSTaskSuspend() and OSTaskResume()"
#endif

#ifndef OS_TASK_QUERY_EN
#error  "OS_CFG.H, Missing OS_TASK_QUERY_EN: Include code for OSTaskQuery()"
#endif

/*
************************************************************************************************
*                                             时间相关
************************************************************************************************
*/

#ifndef OS_TICKS_PER_SEC
#error  "OS_CFG.H, Missing OS_TICKS_PER_SEC: Sets the number of ticks in one second"
#endif

#ifndef OS_TIME_DLY_HMSM_EN
#error  "OS_CFG.H, Missing OS_TIME_DLY_HMSM_EN: Include code for OSTimeDlyHMSM()"
#endif

#ifndef OS_TIME_DLY_RESUME_EN
#error  "OS_CFG.H, Missing OS_TIME_DLY_RESUME_EN: Include code for OSTimeDlyResume()"
#endif

#ifndef OS_TIME_GET_SET_EN
#error  "OS_CFG.H, Missing OS_TIME_GET_SET_EN: Include code for OSTimeGet() and OSTimeSet()"
#endif

/*
************************************************************************************************
*                                            杂项
************************************************************************************************
*/

#ifndef OS_MAX_EVENTS
#error  "OS_CFG.H, Missing OS_MAX_EVENTS: Max. number of event control blocks in your application"
#else
    #if     OS_MAX_EVENTS == 0
    #error  "OS_CFG.H, OS_MAX_EVENTS must be > 0"
    #endif
    #if     OS_MAX_EVENTS > 255
    #error  "OS_CFG.H, OS_MAX_EVENTS must be <= 255"
    #endif
#endif

#ifndef OS_LOWEST_PRIO
#error  "OS_CFG.H, Missing OS_LOWEST_PRIO: Defines the lowest priority that can be assigned"
#endif

#ifndef OS_ARG_CHK_EN
#error  "OS_CFG.H, Missing OS_ARG_CHK_EN: Enable (1) or Disable (0) argument checking"
#endif

#ifndef OS_CPU_HOOKS_EN
#error  "OS_CFG.H, Missing OS_CPU_HOOKS_EN: uC/OS-II hooks are found in the processor port files when 1"
#endif

#ifndef OS_SCHED_LOCK_EN
#error  "OS_CFG.H, Missing OS_SCHED_LOCK_EN: Include code for OSSchedLock() and OSSchedUnlock()"
#endif

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
\SOFTWARE The main directory from the root where all software-related files are placed. \SOFTWARE\BLOCKS The main directory where all ‘Building Blocks’ are located. With μC/OS-II, I included a ‘building block’ that handles DOS-type compatible functions that are used by the example code. \SOFTWARE\BLOCKS\TO This directory contains the files for the TO utility (see Appendix E, TO). The source file is TO.C and is found in the \SOFTWARE\TO\SOURCE directory. The DOS executable file (TO.EXE) is found in the \SOFTWARE\TO\EXE directory. Note that TO requires a file called TO.TBL which must reside on your root directory. An example of TO.TBL is also found in the \SOFTWARE\TO\EXE directory. You will need to move TO.TBL to the root directory if you are to use TO.EXE. \SOFTWARE\uCOS-II The main directory where all μC/OS-II files are located. \SOFTWARE\uCOS-II\EX1_x86L This directory contains the source code for EXAMPLE #1 (see section 1.07, Example #1) which is intended to run under DOS (or a DOS window under Windows 95). \SOFTWARE\uCOS-II\EX2_x86L This directory contains the source code for EXAMPLE #2 (see section 1.08, Example #2) which is intended to run under DOS (or a DOS window under Windows 95). \SOFTWARE\uCOS-II\EX3_x86L This directory contains the source code for EXAMPLE #3 (see section 1.09, Example #3) which is intended to run under DOS (or a DOS window under Windows 95). \SOFTWARE\uCOS-II\Ix86L This directory contains the source code for the processor dependent code (a.k.a. the port) of μC/OS-II for an 80x86 Real-Mode, Large Model processor. \SOFTWARE\uCOS-II\SOURCE This directory contains the source code for processor independent portion of μC/OS-II. This code is fully portable to other processor architectures.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值