DSP

Ucos_II2.52源码中文译注

2019-07-13 18:00发布

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参数无效;