?? os_q.lst
字號(hào):
C51 COMPILER V8.05a OS_Q 03/10/2007 13:05:45 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE OS_Q
OBJECT MODULE PLACED IN .\Os_q.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\OS\Os_q.c ROM(SMALL) DEBUG OBJECTEXTEND PRINT(.\Os_q.lst) OBJECT(.\Os_q.
-obj)
line 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.20.3
9 **
10 **
11 **--------------文件信息--------------------------------------------------------------------------------
12 **文 件 名: OS_Q.C
13 **創(chuàng) 建 人: 陳明計(jì)
14 **最后修改日期: 2003年3月8日
15 **描 述: Small RTOS(51)消息隊(duì)列代碼
16 **
17 **--------------歷史版本信息----------------------------------------------------------------------------
18 ** 創(chuàng)建人: 陳明計(jì)
19 ** 版 本: V1.10~V1.12.0
20 ** 日 期: 2002年6月20日~2002年12月30日
21 ** 描 述: 完善消息隊(duì)列代碼
22 **
23 **------------------------------------------------------------------------------------------------------
24 ** 修改人: 陳明計(jì)
25 ** 版 本: V1.20.0
26 ** 日 期: 2003年8月3日
27 ** 描 述: 刪除OSInt*函數(shù),根據(jù)新版本要求改變一些代碼
28 **
29 **--------------當(dāng)前版本修訂-----------------------------------------------------------------------------
30 ** 修改人: 陳明計(jì)
31 ** 日 期: 2004年6月8日
32 ** 描 述: 更正計(jì)算溢出的錯(cuò)誤
33 **
34 **------------------------------------------------------------------------------------------------------
35 ********************************************************************************************************/
36
37 #define IN_OS_Q
38 #include "config.h"
39
40 #if EN_OS_Q > 0
41 /*********************************************************************************************************
42 ** 函數(shù)名稱: OSQCreate
43 ** 功能描述: 初始化消息隊(duì)列
44 ** 輸 入: Buf:為隊(duì)列分配的存儲(chǔ)空間地址
45 ** SizeOfBuf:為隊(duì)列分配的存儲(chǔ)空間大小
46 ** 輸 出: NOT_OK:參數(shù)錯(cuò)誤
47 ** OS_Q_OK:成功
48 ** 全局變量: 無
49 ** 調(diào)用模塊: 無
50 **
51 ** 作 者: 陳明計(jì)
52 ** 日 期: 2002年9月1日
53 **-------------------------------------------------------------------------------------------------------
54 ** 修改人: 陳明計(jì)
C51 COMPILER V8.05a OS_Q 03/10/2007 13:05:45 PAGE 2
55 ** 日 期: 2002年10月27日
56 **-------------------------------------------------------------------------------------------------------
57 ** 修改人:
58 ** 日 期:
59 **-------------------------------------------------------------------------------------------------------
60 ********************************************************************************************************/
61
62 uint8 OSQCreate(uint8 OS_Q_MEM_SEL *Buf, uint8 SizeOfBuf)
63 //Buf[0]:隊(duì)列中字節(jié)數(shù),Buf[1]:Buf總長度,Buf[2]:出對(duì)端,Buf[3](,Buf[4]):等待隊(duì)列任務(wù)列表
64 {
65 1 OS_ENTER_CRITICAL();
66 1
67 1 if ((SizeOfBuf >= 5) && (Buf != NULL))
68 1 {
69 2 Buf[0] = 0; /* 隊(duì)列中消息數(shù)目 */
70 2 Buf[1] = SizeOfBuf; /* 消息隊(duì)列占用內(nèi)存字節(jié)數(shù) */
71 2 #if OS_MAX_TASKS < 9
72 2 Buf[2] = 4; /* 將要出隊(duì)的消息所在位置 */
73 2 #else
Buf[2] = 5; /* 將要出隊(duì)的消息所在位置 */
#endif
76 2 Buf[3] = 0; /* 消息隊(duì)列的等待任務(wù)列表 */
77 2 Buf[4] = 0; /* 任務(wù)數(shù)大于等于8時(shí)為等待任務(wù)列表的一部分, */
78 2 /* 否則為消息緩沖區(qū) */
79 2
80 2 OS_EXIT_CRITICAL();
81 2 return OS_Q_OK;
82 2 }
83 1 else
84 1 {
85 2 OS_EXIT_CRITICAL();
86 2 return NOT_OK;
87 2 }
88 1
89 1 }
90
91 /*********************************************************************************************************
92 ** 函數(shù)名稱: OSQPend
93 ** 功能描述: 等待消息隊(duì)列中的消息
94 ** 輸 入: Ret:返回的消息
95 ** Buf:指向隊(duì)列的指針
96 ** Tick:等待時(shí)間
97 ** 輸 出: NOT_OK:參數(shù)錯(cuò)誤
98 ** OS_Q_OK:收到消息
99 ** OS_Q_TMO:超時(shí)到
100 ** OS_Q_NOT_OK:無消息
101 ** 全局變量: 無
102 ** 調(diào)用模塊: OSRunningTaskID,OS_TaskSuspend,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
103 **
104 ** 作 者: 陳明計(jì)
105 ** 日 期: 2002年9月1日
106 **-------------------------------------------------------------------------------------------------------
107 ** 修改人: 陳明計(jì)
108 ** 日 期: 2002年10月9日
109 **------------------------------------------------------------------------------------------------------
110 ** 修改人: 陳明計(jì)
111 ** 日 期: 2002年12月2日
112 **-------------------------------------------------------------------------------------------------------
113 ** 修改人:
114 ** 日 期:
115 **-------------------------------------------------------------------------------------------------------
116 ********************************************************************************************************/
C51 COMPILER V8.05a OS_Q 03/10/2007 13:05:45 PAGE 3
117 #if EN_OS_Q_PENT > 0
118
119 uint8 OSQPend(uint8 data *Ret, uint8 OS_Q_MEM_SEL *Buf, uint8 Tick)
120 {
121 1 #ifdef __C51__
122 1 uint8 data *cp;
123 1 #endif
124 1
125 1 #if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return NOT_OK;
}
#endif
131 1
132 1 OS_ENTER_CRITICAL();
133 1
134 1 OSWaitTick[OSRunningTaskID()] = Tick; /* 設(shè)置超時(shí)時(shí)間 */
135 1 /* 可以優(yōu)化寄存器的使用 */
136 1
137 1 /* 使用堆棧是為了使函數(shù)具有重入性 */
138 1 #ifdef __C51__
139 1 SP++;
140 1 *((uint8 data * data *)SP) = Ret;
141 1 #endif
142 1
143 1 /* 把任務(wù)加入等待任務(wù)隊(duì)列 */
144 1 #if OS_MAX_TASKS < 9
145 1 Buf[3] |= OSMapTbl[OSRunningTaskID()];
146 1 #else
if (OSRunningTaskID() < 8)
{
Buf[3] |= OSMapTbl[OSRunningTaskID()];
}
else
{
Buf[4] |= OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
156 1
157 1 while (Buf[0] == 0) /* 消息隊(duì)列中是否有消息 */
158 1 {
159 2 /* 無消息 */
160 2 #ifdef __C51__
161 2 SP = SP + sizeof(Buf);
162 2 *((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf))) = Buf;
163 2 #endif
164 2
165 2 OS_TaskSuspend(OSRunningTaskID()); /* 任務(wù)進(jìn)入等待狀態(tài) */
166 2 OSSched(); /* 運(yùn)行下一個(gè)任務(wù) */
167 2
168 2 #ifdef __C51__
169 2 Buf = *((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf)));
170 2 SP = SP - sizeof(Buf);
171 2 #endif
172 2 /* 任務(wù)再次運(yùn)行,如果超時(shí)到,退出循環(huán) */
173 2 if (OSWaitTick[OSRunningTaskID()] == 0)
174 2 {
175 3 break;
176 3 }
177 2 }
178 1
C51 COMPILER V8.05a OS_Q 03/10/2007 13:05:45 PAGE 4
179 1 /* 將任務(wù)從等待隊(duì)列中清除(可以刪除) */
180 1 #if OS_MAX_TASKS < 9
181 1 Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
182 1 #else
if (OSRunningTaskID() < 8)
{
Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
}
else
{
Buf[4] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
192 1 /* 判斷消息隊(duì)列中是否有消息 */
193 1 if (Buf[0] > 0)
194 1 {
195 2 /* 有,消息出隊(duì) */
196 2 Buf[0]--; /* 隊(duì)列的消息數(shù)目減一 */
197 2 /* 指向下一個(gè)出隊(duì)位置 */
198 2 Buf[2]++;
199 2 if (Buf[2] >= Buf[1] )
200 2 {
201 3 #if OS_MAX_TASKS < 9
202 3 Buf[2] = 4;
203 3 #else
Buf[2] = 5;
#endif
206 3 }
207 2 #ifdef __C51__
208 2 cp = (uint8 data *)(*((uint8 data *)SP));
209 2 SP--;
210 2 *cp = Buf[Buf[2]];
211 2 #else
*Ret = Buf[Buf[2]];
#endif
214 2 OS_EXIT_CRITICAL();
215 2 return OS_Q_OK;
216 2 }
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -