📄 ucos_ii.h
字号:
/*
*********************************************************************************************************
* 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 + -