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 系列源码译文
早一日与我们分享,祝愿大家能够早日实现自己的梦想。
钟常慰 zhongcw1002@126.com
1 H:\SOURCE中文源代码\uCOS_II.C
1 /*
2 *************************************************************************************************
3 * uC/OS-II实时控制内核
4 * 主要的包含文件
5 *
6 *
7 * 文 件: uCOS_II.C 包含主要uC/OS-II构造文件
8 * 作 者: Jean J. Labrosse
9 * 中文注解: 钟常慰 zhongcw @ 126.com 译注版本:1.0 请尊重原版内容
10 *************************************************************************************************
11 */
12
13 #define OS_GLOBALS //定义全程变量 OS_GLOBALS
14 #include "includes.h" //包含"includes.h"文件,部分C语言头文件的汇总打包文件
15
16 /********************************包含主要uC/OS-II文件*******************************************/
17 //主要设定的地址,不能有错,可设定相对和绝对地址,否则编译连接出错
18
19 #define OS_MASTER_FILE //定义主要文件,防止是从includes.h中跟随文件
20 #include "\software\ucos-ii\source\os_core.c" //包含内核结构管理文件
21 #include "\software\ucos-ii\source\os_flag.c" //包含时间标志组管理文件
22 #include "\software\ucos-ii\source\os_mbox.c" //包含消息邮箱管理文件
23 #include "\software\ucos-ii\source\os_mem.c" //包含内存管理文件
24 #include "\software\ucos-ii\source\os_mutex.c" //包含互斥型信号管理文件
25 #include "\software\ucos-ii\source\os_q.c" //包含消息队列管理文件
26 #include "\software\ucos-ii\source\os_sem.c" //包含信号量管理文件
27 #include "\software\ucos-ii\source\os_task.c" //包含任务管理文件
28 #include "\software\ucos-ii\source\os_time.c" //包含时间管理文件
29
30 /***************************************结束****************************************************/
31
2008.07.29
钟常慰
1 H:\SOURCE中文源代码\uCOS_II.H
1 /*
2 *************************************************************************************************
3 * uC/OS-II实时控制内核
4 * 主要的包含文件
5 * 文 件: uCOS_II.H ucos内部函数参数设定
6 * 作 者: Jean J. Labrosse
7 * 中文注解: 钟常慰 zhongcw @ 126.com 译注版本:1.0 请尊重原版内容
8 *************************************************************************************************
9 */
10
11 /*
12 *************************************************************************************************
13 * 混杂的设定
14 *************************************************************************************************
15 */
16
17 #define OS_VERSION 251 // 定义uC/OS-II版本号
18
19 #ifdef OS_GLOBALS //如果 OS_GLOBALS 已被声明定义, 紧随代码将会被编译
20 #define OS_EXT //则定义 OS_EXT
21 #else
22 #define OS_EXT extern //否则,定义 OS_EXT 为 extern
23 #endif
24
25 #ifndef FALSE //是否未定义 FALSE
26 #define FALSE 0 //如果是则定义 FALSE 为 0
27 #endif
28
29 #ifndef TRUE //是否未定义 TRUE
30 #define TRUE 1 //如果是则定义 TRUE 为 1
31 #endif
32
33 #define OS_PRIO_SELF 0xFF //定义 OS_PRIO_SELF 为 0xFF
34 #if OS_TASK_STAT_EN > 0
35 #define OS_N_SYS_TASKS 2 //任务体系号码
36 #else
37 #define OS_N_SYS_TASKS 1
38 #endif
39
40 #define OS_STAT_PRIO (OS_LOWEST_PRIO - 1) //统计任务优先级
41 #define OS_IDLE_PRIO (OS_LOWEST_PRIO) //空闲任务优先级
42
43 #define OS_EVENT_TBL_SIZE ((OS_LOWEST_PRIO) / 8 + 1) //事件列表字节
44 #define OS_RDY_TBL_SIZE ((OS_LOWEST_PRIO) / 8 + 1) //就绪列表字节
45
46 #define OS_TASK_IDLE_ID 65535 /* I.D. numbers for Idle and Stat tasks */
47 #define OS_TASK_STAT_ID 65534
48
49 #define OS_EVENT_EN (((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) ||
(OS_MUTEX_EN > 0))
50
51 /*$PAGE*/
52 /*
53 *********************************************************************************************************
54 * 任务状态字 TASK STATUS (字节定义在 OSTCBStat中)
55 *********************************************************************************************************
56 */
57 #define OS_STAT_RDY 0x00 // (将任务的状态字)处于完毕状态
58 #define OS_STAT_SEM 0x01 // (将任务的状态字)处于SEM状态
59 #define OS_STAT_MBOX 0x02 // (将任务的状态字)处于MBOX状态
60 #define OS_STAT_Q 0x04 // (将任务的状态字)处于Q状态
61 #define OS_STAT_SUSPEND 0x08 // 表示任务被挂起
62 #define OS_STAT_MUTEX 0x10 // (将任务的状态字)处于MUTEX状态
63 #define OS_STAT_FLAG 0x20 // (将任务的状态字)处于FLAG状态
64
65 /*
66 *********************************************************************************************************
67 * 事件类型(OS_EVENT types)
68 *********************************************************************************************************
69 */
70 #define OS_EVENT_TYPE_UNUSED 0 // 定义事件类型的种类(无事件类型------------0)
71 #define OS_EVENT_TYPE_MBOX 1 // 定义事件类型的种类(邮箱为数字序列--------1)
72 #define OS_EVENT_TYPE_Q 2 // 定义事件类型的种类(消息队列为数字序列----2)
73 #define OS_EVENT_TYPE_SEM 3 // 定义事件类型的种类(信号量为数字序列------3)
74 #define OS_EVENT_TYPE_MUTEX 4 // 定义事件类型的种类(互斥型信号量为数字序列4)
75 #define OS_EVENT_TYPE_FLAG 5 // 定义事件类型的种类(事件标志组为数字序列--5)
2008.07.29
钟常慰
2 H:\SOURCE中文源代码\uCOS_II.H
76
77 /*
78 *********************************************************************************************************
79 * 事件标志(EVENT FLAGS)
80 *********************************************************************************************************
81 */
82 #define OS_FLAG_WAIT_CLR_ALL 0 // 定义所有指定事件标志位清0 ------ 0
83 #define OS_FLAG_WAIT_CLR_AND 0 // 同上一样
84
85 #define OS_FLAG_WAIT_CLR_ANY 1 // 定义任意指定事件标志位清0 ------ 1
86 #define OS_FLAG_WAIT_CLR_OR 1 // 同上一样
87
88 #define OS_FLAG_WAIT_SET_ALL 2 // 定义所有指定事件标志位置1 ------ 2
89 #define OS_FLAG_WAIT_SET_AND 2 // 同上一样
90
91 #define OS_FLAG_WAIT_SET_ANY 3 // 定义任意指定事件标志位置1 ------ 3
92 #define OS_FLAG_WAIT_SET_OR 3 // 同上一样
93
94 // 如果需要在得到期望标志后,恢复该事件标志,加入此常量
95
96 #define OS_FLAG_CONSUME 0x80 // 定义常量OS_FLAG_CONSUME为0x80
97
98 #define OS_FLAG_CLR 0 // 定义 OS_FLAG_CLR 为清0
99 #define OS_FLAG_SET 1 // 定义 OS_FLAG_SET 为置1
100
101 /*
102 *********************************************************************************************************
103 * 设置字在'opt'中,适用于 OSSemDel(), OSMboxDel(), OSQDel() 和 OSMutexDel()函数
104 *********************************************************************************************************
105 */
106 #define OS_DEL_NO_PEND 0 // 可以选择只能在已经没有任何任务在等待该信号量时,才能删除该信号
量
107 #define OS_DEL_ALWAYS 1 // 不管有没有任务在等待该信号量,立即删除该信号量
108
109 /*
110 *********************************************************************************************************
111 * OS???PostOpt() OPTIONS(设置)
112 *
113 * 这个设置适用用 OSMboxPostOpt() 和 OSQPostOpt()两个函数.
114 *********************************************************************************************************
115 */
116 #define OS_POST_OPT_NONE 0x00 // 发送一个消息(或邮箱)给一个等待消息的任务
117 #define OS_POST_OPT_BROADCAST 0x01 // 发送消息给所有等待队列消息的任务*/
118 #define OS_POST_OPT_FRONT 0x02 // 以后进先出方式发消息(仿真OSQPostFront())
119
120 /*
121 *********************************************************************************************************
122 * 任务设置 TASK OPTIONS (查看OSTaskCreateExt())
123 *********************************************************************************************************
124 */
125 #define OS_TASK_OPT_STK_CHK 0x0001 // 决定是否进行任务堆栈检查
126 #define OS_TASK_OPT_STK_CLR 0x0002 // 决定是否清空堆栈
127 #define OS_TASK_OPT_SAVE_FP 0x0004 // 决定是否保存浮点寄存器的数值。此项操作仅当处理器有浮点硬-
128 // 件时有效。保存操作由硬件相关的代码完成
129 /*
130 *********************************************************************************************************
131 * 错误代码 ERROR CODES
132 *********************************************************************************************************
133 */
134 #define OS_NO_ERR 0 // 函数返回成功;
135
136 #define OS_ERR_EVENT_TYPE 1 // 不是指向事件(相关)类型的指针;
137 #define OS_ERR_PEND_ISR 2 // 在中断服务子程序中调用 OS各种信号类Accept()函数.
138 #define OS_ERR_POST_NULL_PTR 3 // 用户发出空指针。根据规则,这里不支持空指针;
139 #define OS_ERR_PEVENT_NULL 4 // 'pevent'是指空指针;
140 #define OS_ERR_POST_ISR 5 // 试图在中断服务子程序中调用OSMutexPost()函数[释放一个mutex];
141 #define OS_ERR_QUERY_ISR 6 // 试图在中断子程序中调用OSMutexQuery()[得到mutex当前状态信息]
142 #define OS_ERR_INVALID_OPT 7 // 定义的opt参数无效;
143 #define OS_ERR_TASK_WAITING 8 // 有一个或一个以上的任务在等待消息队列中的消息;
144
145 #define OS_TIMEOUT 10 // 消息没有在指定的周期数内送到;
146 #define OS_TASK_NOT_EXIST 11 // 指定的任务不存;
147
148 #define OS_MBOX_FULL 20 // 消息邮箱已经包含了其他消息,不空;
149
150 #define OS_Q_FULL 30 // 消息队列中已经存满;
2008.07.29
钟常慰
3 H:\SOURCE中文源代码\uCOS_II.H
151
152 #define OS_PRIO_EXIST 40 // 优先级为PIP的任务已经存在;
153 #define OS_PRIO_ERR 41 // 参数中的任务原先优先级不存在;
154 #define OS_PRIO_INVALID 42 // 参数指定的优先级大于OS_LOWEST_PRIO;
155
156 #define OS_SEM_OVF 50 // 信号量的值溢出;
157
158 #define OS_TASK_DEL_ERR 60 // 指定要删除的任务不存在
159 #define OS_TASK_DEL_IDLE 61 // 错误操作,试图删除空闲任务(Idle task);
160 #define OS_TASK_DEL_REQ 62 // 当前任务收到来自其他任务的删除请求;
161 #define OS_TASK_DEL_ISR 63 // 错误操作,试图在中断处理程序中删除任务;
162
163 #define OS_NO_MORE_TCB 70 // 系统中没有OS_TCB可以分配给任务了;
164
165 #define OS_TIME_NOT_DLY 80 // 要唤醒的任务不在延时状态;
166 #define OS_TIME_INVALID_MINUTES 81 // 参数错误,分钟数大于59;
167 #define OS_TIME_INVALID_SECONDS 82 // 参数错误,秒数大于59
168 #define OS_TIME_INVALID_MILLI 83 // 则返回参数错误,毫秒数大于999;
169 #define OS_TIME_ZERO_DLY 84 // 四个参数全为0
170
171 #define OS_TASK_SUSPEND_PRIO 90 // 要挂起的任务不存在
172 #define OS_TASK_SUSPEND_IDLE 91 // 试图挂起uC/OS-II中的空闲任务(Idle task)
173
174 #define OS_TASK_RESUME_PRIO 100 // 要唤醒的任务不存在;
175 #define OS_TASK_NOT_SUSPENDED 101 // 要唤醒的任务不在挂起状态
176
177 #define OS_MEM_INVALID_PART 110 // 没有空闲的内存区;
178 #define OS_MEM_INVALID_BLKS 111 // 没有为每一个内存区建立至少2个内存块;
179 #define OS_MEM_INVALID_SIZE 112 // 内存块大小不足以容纳一个指针变量;
180 #define OS_MEM_NO_FREE_BLKS 113 // 内存区已经没有空间分配给内存块;
181 #define OS_MEM_FULL 114 // 内存区已经不能再接受更多释放的内存块。这种情况说明用户程序出
现;
182 #define OS_MEM_INVALID_PBLK 115 //
183 #define OS_MEM_INVALID_PMEM 116 // 'pmem'是空指针;
184 #define OS_MEM_INVALID_PDATA 117 // pdata是空指针;
185 #define OS_MEM_INVALID_ADDR 118 // 非法地址,即地址为空指针;
186
187 #define OS_ERR_NOT_MUTEX_OWNER 120 // 发出mutex的任务实际上并不占用mutex;
188
189 #define OS_TASK_OPT_ERR 130 // 任务用OSTaskCreateExt()函数建立的时候没有指定
OS_TASK_OPT_STK_CHK-
190 // -操作,或者任务是用OSTaskCreate()函数建立的。
191
192 #define OS_ERR_DEL_ISR 140 // 试图在中断服务子程序中删除(消息、邮箱、信号量、消息对列、互
斥型信号量)
193 #define OS_ERR_CREATE_ISR 141 // 试图在中断服务子程序中建立(事件标志组、互斥型信号量);
194
195 #define OS_FLAG_INVALID_PGRP 150 // pgrp是一个空指针;
196 #define OS_FLAG_ERR_WAIT_TYPE 151 // 'wait_type'不是指定的参数之一;
197 #define OS_FLAG_ERR_NOT_RDY 152 // 指定的事件标志没有发生;
198 #define OS_FLAG_INVALID_OPT 153 // opt不是指定的参数之一;
199 #define OS_FLAG_GRP_DEPLETED 154 // 系统没有剩余的空闲事件标志组,需要更改OS_CFG.H中的事件标志组
数目配置
200
201 /*$PAGE*/
202 /*
203 *********************************************************************************************************
204 * 事件控制块(EVENT CONTROL BLOCK)
205 *********************************************************************************************************
206 */
207
208 #if (OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)
209 typedef struct { // 定义一个时间控制块结构(OS_EVENT)
210 INT8U OSEventType; // 事件类型
211 INT8U OSEventGrp; // 等待任务所在的组
212 INT16U OSEventCnt; // 计数器(当事件是信号量时)
213 void *OSEventPtr; // 指向消息或者消息队列的指针
214 INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; // 等待任务列表
215 } OS_EVENT;
216 #endif
217
218
219 /*
220 *********************************************************************************************************
221 * 事件标志控制块 (EVENT FLAGS CONTROL BLOCK)
222 *********************************************************************************************************
2008.07.29
钟常慰