📄 os_q.lst
字号:
C51 COMPILER V7.06 OS_Q 06/06/2005 16:32:36 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE OS_Q
OBJECT MODULE PLACED IN .\output\Os_q.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\OS\Os_q.c OPTIMIZE(6,SPEED) BROWSE ORDER DEBUG OBJECTEXTEND PRINT(.\outp
-ut\Os_q.lst) OBJECT(.\output\Os_q.obj)
stmt level source
1 /*********************************************************************************************************
2 ** Small RTOS(51)
3 ** The Real-Time Kernel(For Keil c51)
4 **
5 ** (c) Copyright 2002-2003, chenmingji
6 ** All Rights Reserved
7 **
8 ** V1.12.0
9 **
10 **
11 **--------------文件信息--------------------------------------------------------------------------------
12 **文 件 名: OS_Q.C
13 **创 建 人: 陈明计
14 **最后修改日期: 2002年12月2日
15 **描 述: Small RTOS(51)消息队列代码
16 **
17 **--------------历史版本信息----------------------------------------------------------------------------
18 ** 创建人: 陈明计
19 ** 版 本: V1.10
20 ** 日 期: 2002年6月20日
21 ** 描 述: 原始版本
22 **
23 **------------------------------------------------------------------------------------------------------
24 ** 修改人: 陈明计
25 ** 版 本: V1.10.2
26 ** 日 期: 2002年9月9日
27 ** 描 述: 修改OSQIntPost()的Keil C51特殊代码,它编译没有问题,但会造成阅读
28 ** 障碍。这部分代码仅在使用Keil C51时出现。
29 **------------------------------------------------------------------------------------------------------
30 ** 修改人: 陈明计
31 ** 版 本: V1.10.5
32 ** 日 期: 2002年10月26日
33 ** 描 述: 修改OSQFlush()使其不再清除等待队列,修改OSQCreate()代码避免重入,修改OSQIntPost()
34 ** 和OSQIntPost()时其效率更高
35 **
36 **------------------------------------------------------------------------------------------------------
37 ** 修改人: 陈明计
38 ** 版 本: V1.11.0
39 ** 日 期: 2002年12月2日
40 ** 描 述: 根据新版本需求更改开、关中断代码,增加注释,简化
41 **
42 **------------------------------------------------------------------------------------------------------
43 ** 修改人: 陈明计
44 ** 版 本: V1.12.0
45 ** 日 期: 2002年12月30日
46 ** 描 述: 没有变化
47 **
48 **--------------当前版本修订-----------------------------------------------------------------------------
49 ** 修改人:
50 ** 日 期:
51 ** 描 述:
52 **
53 **------------------------------------------------------------------------------------------------------
54 ********************************************************************************************************/
C51 COMPILER V7.06 OS_Q 06/06/2005 16:32:36 PAGE 2
55
56 #define IN_OS_Q
57 #include "config.h"
58
59 #if EN_OS_Q > 0
60 /*********************************************************************************************************
61 ** 函数名称: OSQCreate
62 ** 功能描述: 初始化消息队列
63 ** 输 入: Buf:为队列分配的存储空间地址
64 ** SizeOfBuf:为队列分配的存储空间大小
65 ** 输 出: NOT_OK:参数错误
66 ** OS_Q_OK:成功
67 ** 全局变量: 无
68 ** 调用模块: 无
69 **
70 ** 作 者: 陈明计
71 ** 日 期: 2002年9月1日
72 **-------------------------------------------------------------------------------------------------------
73 ** 修改人: 陈明计
74 ** 日 期: 2002年10月27日
75 **-------------------------------------------------------------------------------------------------------
76 ** 修改人:
77 ** 日 期:
78 **-------------------------------------------------------------------------------------------------------
79 ********************************************************************************************************/
80
81 uint8 OSQCreate(uint8 OS_Q_MEM_SEL *Buf, uint8 SizeOfBuf)
82 //Buf[0]:队列中字节数,Buf[1]:Buf总长度,Buf[2]:出对端,Buf[3](,Buf[4]):等待队列任务列表
83 {
84 1 OS_ENTER_CRITICAL();
85 1
86 1 if ((SizeOfBuf >= 5) && (Buf != NULL))
87 1 {
88 2 Buf[0] = 0; /* 队列中消息数目 */
89 2 Buf[1] = SizeOfBuf; /* 消息队列占用内存字节数 */
90 2 #if OS_MAX_TASKS < 9
91 2 Buf[2] = 4; /* 将要出队的消息所在位置 */
92 2 #else
Buf[2] = 5; /* 将要出队的消息所在位置 */
#endif
95 2 Buf[3] = 0; /* 消息队列的等待任务列表 */
96 2 Buf[4] = 0; /* 任务数大于等于8时为等待任务列表的一部分, */
97 2 /* 否则为消息缓冲区 */
98 2
99 2 OS_EXIT_CRITICAL();
100 2 return OS_Q_OK;
101 2 }
102 1 else
103 1 {
104 2 OS_EXIT_CRITICAL();
105 2 return NOT_OK;
106 2 }
107 1
108 1 }
109
110 /*********************************************************************************************************
111 ** 函数名称: OSQPend
112 ** 功能描述: 等待消息队列中的消息
113 ** 输 入: Ret:返回的消息
114 ** Buf:指向队列的指针
115 ** Tick:等待时间
116 ** 输 出: NOT_OK:参数错误
C51 COMPILER V7.06 OS_Q 06/06/2005 16:32:36 PAGE 3
117 ** OS_Q_OK:收到消息
118 ** OS_Q_TMO:超时到
119 ** OS_Q_NOT_OK:无消息
120 ** 全局变量: 无
121 ** 调用模块: OSRunningTaskID,OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
122 **
123 ** 作 者: 陈明计
124 ** 日 期: 2002年9月1日
125 **-------------------------------------------------------------------------------------------------------
126 ** 修改人: 陈明计
127 ** 日 期: 2002年10月9日
128 **------------------------------------------------------------------------------------------------------
129 ** 修改人: 陈明计
130 ** 日 期: 2002年12月2日
131 **-------------------------------------------------------------------------------------------------------
132 ** 修改人:
133 ** 日 期:
134 **-------------------------------------------------------------------------------------------------------
135 ********************************************************************************************************/
136 #if EN_OS_Q_PENT > 0
137
138 uint8 OSQPend(uint8 data *Ret, uint8 OS_Q_MEM_SEL *Buf, uint8 Tick)
139 {
140 1 #ifdef __C51__
141 1 uint8 data *cp;
142 1 #endif
143 1
144 1 #if EN_OS_Q_CHK > 0
145 1 if (Buf == NULL)
146 1 {
147 2 return NOT_OK;
148 2 }
149 1 #endif
150 1
151 1 OS_ENTER_CRITICAL();
152 1
153 1 OSWaitTick[OSRunningTaskID()] = Tick; /* 设置超时时间 */
154 1 /* 可以优化寄存器的使用 */
155 1
156 1 /* 使用堆栈是为了使函数具有重入性 */
157 1 #ifdef __C51__
158 1 SP++;
159 1 *((uint8 data * data *)SP) = Ret;
160 1 #endif
161 1
162 1 /* 把任务加入等待任务队列 */
163 1 #if OS_MAX_TASKS < 9
164 1 Buf[3] |= OSMapTbl[OSRunningTaskID()];
165 1 #else
if (OSRunningTaskID() < 8)
{
Buf[3] |= OSMapTbl[OSRunningTaskID()];
}
else
{
Buf[4] |= OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
175 1
176 1 while (Buf[0] == 0) /* 消息队列中是否有消息 */
177 1 {
178 2 /* 无消息 */
C51 COMPILER V7.06 OS_Q 06/06/2005 16:32:36 PAGE 4
179 2 #ifdef __C51__
180 2 SP = SP + sizeof(Buf);
181 2 *((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf))) = Buf;
182 2 #endif
183 2
184 2 OSClearSignal(OSRunningTaskID()); /* 任务进入等待状态 */
185 2 OSSched(); /* 运行下一个任务 */
186 2
187 2 #ifdef __C51__
188 2 Buf = *((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf)));
189 2 SP = SP - sizeof(Buf);
190 2 #endif
191 2 /* 任务再次运行,如果超时到,退出循环 */
192 2 if (OSWaitTick[OSRunningTaskID()] == 0)
193 2 {
194 3 break;
195 3 }
196 2 }
197 1
198 1 /* 将任务从等待队列中清除(可以删除) */
199 1 #if OS_MAX_TASKS < 9
200 1 Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
201 1 #else
if (OSRunningTaskID() < 8)
{
Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
}
else
{
Buf[4] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
211 1 /* 判断消息队列中是否有消息 */
212 1 if (Buf[0] > 0)
213 1 {
214 2 /* 有,消息出队 */
215 2 Buf[0]--; /* 队列的消息数目减一 */
216 2 /* 指向下一个出队位置 */
217 2 Buf[2]++;
218 2 if (Buf[2] >= Buf[1] )
219 2 {
220 3 #if OS_MAX_TASKS < 9
221 3 Buf[2] = 4;
222 3 #else
Buf[2] = 5;
#endif
225 3 }
226 2 #ifdef __C51__
227 2 cp = (uint8 data *)(*((uint8 data *)SP));
228 2 SP--;
229 2 *cp = Buf[Buf[2]];
230 2 #else
*Ret = Buf[Buf[2]];
#endif
233 2 OS_EXIT_CRITICAL();
234 2 return OS_Q_OK;
235 2 }
236 1 else
237 1 {
238 2 /* 无,返回错误码 */
239 2 #ifdef __C51__
240 2 SP--;
C51 COMPILER V7.06 OS_Q 06/06/2005 16:32:36 PAGE 5
241 2 #endif
242 2
243 2 OS_EXIT_CRITICAL();
244 2 return OS_Q_TMO;
245 2 }
246 1 }
247 #endif
248
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -