⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucos_ii.h

📁 c代码的操作系统 已经移植使用到产品上的内核
💻 H
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
*                                           All Rights Reserved
*
*                                                  V2.00
*
* File : uCOS_II.H
* 修改者:梁安韬
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                             MISCELLANEOUS
*********************************************************************************************************
*/

#ifndef _UCOS_II_H_
#define _UCOS_II_H_

#define  OS_VERSION              200   //uCOS_II操作系统的版本号为2.00

#ifdef   OS_GLOBALS		      //若定义了操作系统的全军变量					
#define  OS_EXT			     //定义变量的类型为空
#else
#define  OS_EXT  extern		    //否则定义的变量类型为外部的变量类型
#endif

#define  OS_PRIO_SELF           255   //正在运行的操作系统任务的优先级为 255

#if      OS_TASK_STAT_EN		//若允许操作系统创建静态任务
#define  OS_N_SYS_TASKS            2	//定义系统任务的个数为 2 个系统任务
#else
#define  OS_N_SYS_TASKS            1	//否则定义操作系统的任务个数 为 1个任务
#endif

#define  OS_STAT_PRIO       (OS_LOWEST_PRIO - 1)   //定义静态任务的优先级为 11
#define  OS_IDLE_PRIO       (OS_LOWEST_PRIO)       //定义空闲任务的优先级别为 12

#define  OS_EVENT_TBL_SIZE ((OS_LOWEST_PRIO) / 8 + 1)  //定义事件表的大小为 2个字节 因为12个优先级占用2个字节
#define  OS_RDY_TBL_SIZE   ((OS_LOWEST_PRIO) / 8 + 1)  //定义就绪的任务表为2个字节 因为12个优先级占用2个字节

#define  OS_TASK_IDLE_ID       65535    	//定义空闲任务的ID号为65535
#define  OS_TASK_STAT_ID       65534		//定义静态任务的ID号为65534

                                       
#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_EVENT_TYPE_MBOX        1	//操作系统事件类型为邮箱方式
#define  OS_EVENT_TYPE_Q           2	//操作系统事件类型为队列方式
#define  OS_EVENT_TYPE_SEM         3	//操作系统事件类型为信号方式

                                       
#define  OS_TASK_OPT_STK_CHK  0x0001   //允许堆栈的校验对于正在操作的任务中
#define  OS_TASK_OPT_STK_CLR  0x0002   //任务创建时可以清除堆栈
#define  OS_TASK_OPT_SAVE_FP  0x0004  //保存上下文的浮点寄存器方式


#ifndef  FALSE			 	//若没有定义FALSE
#define  FALSE                     0	//定义FALSE为0
#endif

#ifndef  TRUE				//若没有定义TRUE
#define  TRUE                      1	//定义TRUE为1
#endif

/*
*********************************************************************************************************
*                                              ERROR CODES
*********************************************************************************************************
*/

#define OS_NO_ERR                 0		//定义操作系统没有错误
#define OS_ERR_EVENT_TYPE         1		//操作系统错误的事件类型
#define OS_ERR_PEND_ISR           2		//操作系统错误的未决定的中断方式

#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		//定义信号超出

#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		//内存有效的块
#define OS_MEM_INVALID_SIZE     112		//内存有效的大小
#define OS_MEM_NO_FREE_BLKS     113		//内存块没有释放
#define OS_MEM_FULL             114		//内存已经满

#define OS_TASK_OPT_ERR         130		//任务操作错误


/*
*********************************************************************************************************
*                                          EVENT CONTROL BLOCK
*********************************************************************************************************
*/

#if (OS_MAX_EVENTS >= 2)		//若事件块大于 或者等于2
typedef struct {
    void   *OSEventPtr;                    //事件块的指针
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; //事件表
    INT16U  OSEventCnt;                 //已经使用的事件个数
    INT8U   OSEventType;               //事件类型
    INT8U   OSEventGrp;                //事件所属的组号
} OS_EVENT;
#endif


/*
*********************************************************************************************************
*                                          MESSAGE MAILBOX DATA
*********************************************************************************************************
*/

#if OS_MBOX_EN				//若允许使用邮箱方式
typedef struct {
    void   *OSMsg;                       //消息指针
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; //所属事件表
    INT8U   OSEventGrp;                   //所属事件的组号
} OS_MBOX_DATA;
#endif

/*
*********************************************************************************************************
*                                     MEMORY PARTITION DATA STRUCTURES
*********************************************************************************************************
*/

#if OS_MEM_EN && (OS_MAX_MEM_PART >= 2)//若允许使用内存方式 并且 内存块大于等于 2个
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


/*
*********************************************************************************************************
*                                          MESSAGE QUEUE DATA
*********************************************************************************************************
*/

#if OS_Q_EN				//若允许队列创建
typedef struct {
    void   *OSMsg;                      //队列的起始地址
    INT16U  OSNMsgs;                    //有多少消息在队列中
    INT16U  OSQSize;                    //消息队列的大小
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE];//所属事件表
    INT8U   OSEventGrp;                   //所属事件表的组号
} OS_Q_DATA;
#endif

/*
*********************************************************************************************************
*                                           SEMAPHORE DATA
*********************************************************************************************************
*/

#if OS_SEM_EN					//若允许使用信号内容
typedef struct {
    INT16U  OSCnt;                          //旗语个数
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; //事件表
    INT8U   OSEventGrp;                    //所属事件组号
} OS_SEM_DATA;
#endif

/*
*********************************************************************************************************
*                                            TASK STACK DATA
*********************************************************************************************************
*/

#if OS_TASK_CREATE_EXT_EN		//若允许创建扩展的任务
typedef struct {
    INT32U  OSFree;                   //有多少个字节在堆栈上被释放
    INT32U  OSUsed;                   //有多少个字节在堆栈上被使用
} OS_STK_DATA;
#endif

/*$PAGE*/
/*
*********************************************************************************************************
*                                          TASK CONTROL BLOCK
*********************************************************************************************************
*/

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

#if OS_TASK_CREATE_EXT_EN    	    //若允许创建扩展的任务功能
    void          *OSTCBExtPtr;    //指向扩展的任务指针
    OS_STK        *OSTCBStkBottom;  //指向任务堆栈的底
    INT32U         OSTCBStkSize;    //任务堆栈的大小
    INT16U         OSTCBOpt;       //保存任务控制快的选项
    INT16U         OSTCBId;        //任务控制块的ID
#endif

    struct os_tcb *OSTCBNext;     //指向下一个任务控制块的指针
    struct os_tcb *OSTCBPrev;     //指向前一个任务控制快的指针

#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
    //(若允许使用队列 并且队列个数要大于等于2 )  或者允许使用邮箱 或者允许使用信号
    OS_EVENT      *OSTCBEventPtr;     //指向任务事件的指针
#endif

#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
//若允许使用队列 并且最大队列大于2 或者允许使用邮箱
    void          *OSTCBMsg;       //任务控制块消息
    
#endif    

    INT16U         OSTCBDly;        //	任务控制延时
    INT8U          OSTCBStat;       //任务状态
    INT8U          OSTCBPrio;      //任务优先级 0最高  63最低
    									

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -