Ucos_II2.52源码中文译注
Ucos_II2.52是一份非常完美的嵌入式开发系统,在学习ARM的基础上,嵌入ucos系统并增加自己的源码是一件不错的选择,目前在市面上已经有了大量的ucos嵌入案例,特别是在arm和dsp的应用当中,已经成为一种主流,虽然和其它的嵌入式系统相比,ucos不是很完善,如没有内存分配、任务级别不多;但却是一个代码简短、条理清晰、实时性及安全性能很高的嵌入式操作系统。
Ucos_II2.52对比2.8版的256个任务而言,任务数量相比过少,但却是目前应用量最大的一个版本,相对而言,能够满足我们的基本要求,而且增加了很多消息处理,特别是在优先级别方面,具有不可比拟的优势;我曾试图阅读ecos的源码,但还是失败了,还有挑战linux0.01版源码的想法,最终我不能不被屈服;对于Ucos而言,很多入门者是一个福音,因为它的代码非常的少,而且能够对应贝贝老师的书本直接参考,他的书本对结构方面讲解的极为xian详细。
在学习Ucos的整个过程中,E文的理解是一个致命的打击,原因是我的E文水平很差,不过Ucos还是给了我尝试的动力,在作者的原基础上增加中文译码,也许是一件非常不错的选择,相信在中国和我这种水平的人多不胜数,中文的注解对源码而言,能够具有极高的理解价值,可以在极短的时间内,能够充分了解ucos的真正含义。整个翻译过程历时4个月,每每在寒冬腊月坐在计算机前面,不断的查阅贝贝老师的书来对整个Ucos进行理解,对每个源码进行逐条翻译,也是一件非常需要勇气的事情,但E文的翻译过程中很多变量是不能完全理解的,所以在翻译过程中不乏错误译文很多,于此带来的错误还请读者纠正,相信克服种种困难一定会有所了解的。
对于经济窘迫的我来说,曾试图希望卖一点资料来养家糊口,但这种做法根本不现实,很多的读者可能和我一样,习惯了拿不收费的资料,并对变相收费有一种深恶痛绝的感觉;想了很多决定还是把它贡献出来,让更多的人来(更容易)了解ucos,贡献自己的一点力量。
希望更多的人能加入这种高尚的学习氛围当中来,共同的来把一套完整的U系列源码译文早一日与我们分享,祝愿大家能够早日实现自己的梦想。
/*
*************************************************************************************************
* uC/OS-II实时控制内核
* 主要的包含文件
* 文 件: uCOS_II.H ucos内部函数参数设定
* 作 者: Jean J. Labrosse
* 中文注解: 钟常慰 zhongcw @ 126.com 译注版本:1.0 请尊重原版内容
*************************************************************************************************
*//*
*************************************************************************************************
* 混杂的设定
*************************************************************************************************
*/#define OS_VERSION 251 // 定义uC/OS-II版本号
#ifdef OS_GLOBALS //如果 OS_GLOBALS 已被声明定义, 紧随代码将会被编译
#define OS_EXT //则定义 OS_EXT
#else
#define OS_EXT extern //否则,定义 OS_EXT 为 extern
#endif #ifndef FALSE //是否未定义 FALSE
#define FALSE 0 //如果是则定义 FALSE 为 0
#endif#ifndef TRUE //是否未定义 TRUE
#define TRUE 1 //如果是则定义 TRUE 为 1
#endif#define OS_PRIO_SELF 0xFF //定义 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) //统计任务优先级
#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 /* I.D. numbers for Idle and Stat tasks */
#define OS_TASK_STAT_ID 65534#define OS_EVENT_EN (((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0))/*$PAGE*/
/*
*********************************************************************************************************
* 任务状态字 TASK STATUS (字节定义在 OSTCBStat中)
*********************************************************************************************************
*/
#define OS_STAT_RDY 0x00 // (将任务的状态字)处于完毕状态
#define OS_STAT_SEM 0x01 // (将任务的状态字)处于SEM状态
#define OS_STAT_MBOX 0x02 // (将任务的状态字)处于MBOX状态
#define OS_STAT_Q 0x04 // (将任务的状态字)处于Q状态
#define OS_STAT_SUSPEND 0x08 // 表示任务被挂起
#define OS_STAT_MUTEX 0x10 // (将任务的状态字)处于MUTEX状态
#define OS_STAT_FLAG 0x20 // (将任务的状态字)处于FLAG状态/*
*********************************************************************************************************
* 事件类型(OS_EVENT types)
*********************************************************************************************************
*/
#define OS_EVENT_TYPE_UNUSED 0 // 定义事件类型的种类(无事件类型------------0)
#define OS_EVENT_TYPE_MBOX 1 // 定义事件类型的种类(邮箱为数字序列--------1)
#define OS_EVENT_TYPE_Q 2 // 定义事件类型的种类(消息队列为数字序列----2)
#define OS_EVENT_TYPE_SEM 3 // 定义事件类型的种类(信号量为数字序列------3)
#define OS_EVENT_TYPE_MUTEX 4 // 定义事件类型的种类(互斥型信号量为数字序列4)
#define OS_EVENT_TYPE_FLAG 5 // 定义事件类型的种类(事件标志组为数字序列--5)/*
*********************************************************************************************************
* 事件标志(EVENT FLAGS)
*********************************************************************************************************
*/
#define OS_FLAG_WAIT_CLR_ALL 0 // 定义所有指定事件标志位清0 ------ 0
#define OS_FLAG_WAIT_CLR_AND 0 // 同上一样#define OS_FLAG_WAIT_CLR_ANY 1 // 定义任意指定事件标志位清0 ------ 1
#define OS_FLAG_WAIT_CLR_OR 1 // 同上一样#define OS_FLAG_WAIT_SET_ALL 2 // 定义所有指定事件标志位置1 ------ 2
#define OS_FLAG_WAIT_SET_AND 2 // 同上一样#define OS_FLAG_WAIT_SET_ANY 3 // 定义任意指定事件标志位置1 ------ 3
#define OS_FLAG_WAIT_SET_OR 3 // 同上一样// 如果需要在得到期望标志后,恢复该事件标志,加入此常量#define OS_FLAG_CONSUME 0x80 // 定义常量OS_FLAG_CONSUME为0x80#define OS_FLAG_CLR 0 // 定义 OS_FLAG_CLR 为清0
#define OS_FLAG_SET 1 // 定义 OS_FLAG_SET 为置1/*
*********************************************************************************************************
* 设置字在'opt'中,适用于 OSSemDel(), OSMboxDel(), OSQDel() 和 OSMutexDel()函数
*********************************************************************************************************
*/
#define OS_DEL_NO_PEND 0 // 可以选择只能在已经没有任何任务在等待该信号量时,才能删除该信号量
#define OS_DEL_ALWAYS 1 // 不管有没有任务在等待该信号量,立即删除该信号量/*
*********************************************************************************************************
* OS???PostOpt() OPTIONS(设置)
*
* 这个设置适用用 OSMboxPostOpt() 和 OSQPostOpt()两个函数.
*********************************************************************************************************
*/
#define OS_POST_OPT_NONE 0x00 // 发送一个消息(或邮箱)给一个等待消息的任务
#define OS_POST_OPT_BROADCAST 0x01 // 发送消息给所有等待队列消息的任务*/
#define OS_POST_OPT_FRONT 0x02 // 以后进先出方式发消息(仿真OSQPostFront())/*
*********************************************************************************************************
* 任务设置 TASK OPTIONS (查看OSTaskCreateExt())
*********************************************************************************************************
*/
#define OS_TASK_OPT_STK_CHK 0x0001 // 决定是否进行任务堆栈检查
#define OS_TASK_OPT_STK_CLR 0x0002 // 决定是否清空堆栈
#define OS_TASK_OPT_SAVE_FP 0x0004 // 决定是否保存浮点寄存器的数值。此项操作仅当处理器有浮点硬-
// 件时有效。保存操作由硬件相关的代码完成
/*
*********************************************************************************************************
* 错误代码 ERROR CODES
*********************************************************************************************************
*/
#define OS_NO_ERR 0 // 函数返回成功;#define OS_ERR_EVENT_TYPE 1 // 不是指向事件(相关)类型的指针;
#define OS_ERR_PEND_ISR 2 // 在中断服务子程序中调用 OS各种信号类Accept()函数.
#define OS_ERR_POST_NULL_PTR 3 // 用户发出空指针。根据规则,这里不支持空指针;
#define OS_ERR_PEVENT_NULL 4 // 'pevent'是指空指针;
#define OS_ERR_POST_ISR 5 // 试图在中断服务子程序中调用OSMutexPost()函数[释放一个mutex];
#define OS_ERR_QUERY_ISR 6 // 试图在中断子程序中调用OSMutexQuery()[得到mutex当前状态信息]
#define OS_ERR_INVALID_OPT 7 // 定义的opt参数无效;