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

/*
** 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
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七七云享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值