📄 os_sem.lst
字号:
C51 COMPILER V7.06 OS_SEM 06/20/2005 15:36:06 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE OS_SEM
OBJECT MODULE PLACED IN .\out\Os_sem.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\OS\Os_sem.c OPTIMIZE(6,SIZE) DEBUG OBJECTEXTEND PRINT(.\out\Os_sem.lst)
-OBJECT(.\out\Os_sem.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年9月1日
21 ** 描 述: 原始版本
22 **
23 **------------------------------------------------------------------------------------------------------
24 ** 修改人: 陈明计
25 ** 版 本: V1.10.5
26 ** 日 期: 2002年10月26日
27 ** 描 述: 更正笔误和统一格式
28 ** 更正检查信号量的错误,改善OSSemIntPost()的执行性能,更正
29 ** OSSemAccept()在信号量无效时的Bug,减少OSSemQuery()对中断延迟
30 ** 的影响,更正OSSemPend()在超时时的Bug
31 **------------------------------------------------------------------------------------------------------
32 ** 修改人: 陈明计
33 ** 版 本: V1.11.0
34 ** 日 期: 2002年12月2日
35 ** 描 述: 根据新版本需求更改开、关中断代码,增加注释
36 **
37 **------------------------------------------------------------------------------------------------------
38 ** 修改人: 陈明计
39 ** 版 本: V1.12.0
40 ** 日 期: 2002年12月30日
41 ** 描 述: 根据新版本需求更改部分代码
42 **
43 **--------------当前版本修订----------------------------------------------------------------------------
44 ** 修改人:
45 ** 日 期:
46 ** 描 述:
47 **
48 **------------------------------------------------------------------------------------------------------
49 ********************************************************************************************************/
50
51 #define IN_OS_SEM
52 #include "config.h"
53
54 /* 分配信号量存储空间 */
C51 COMPILER V7.06 OS_SEM 06/20/2005 15:36:06 PAGE 2
55 #if EN_OS_SEM > 0
56 #if OS_MAX_TASKS < 9
57 uint8 OS_SEM_MEM_SEL OsSemBuf[OS_MAX_SEMS * 2];
58 #else
uint8 OS_SEM_MEM_SEL OsSemBuf[OS_MAX_SEMS * 3];
#endif
61
62
63
64 /*********************************************************************************************************
65 ** 函数名称: OSSemCreate
66 ** 功能描述: 初始化消息队列
67 ** 输 入: Index:信号量索引
68 ** data:信号量初始值
69 ** 输 出: NOT_OK:没有这个信号量
70 ** OS_SEM_OK:成功
71 ** 全局变量: 无
72 ** 调用模块: 无
73 **
74 ** 作 者: 陈明计
75 ** 日 期: 2002年9月1日
76 **-------------------------------------------------------------------------------------------------------
77 ** 修改人:
78 ** 日 期:
79 **-------------------------------------------------------------------------------------------------------
80 ********************************************************************************************************/
81
82 uint8 OSSemCreate(uint8 Index,uint8 Data)
83 {
84 1 OS_ENTER_CRITICAL();
85 1 if (Index < OS_MAX_SEMS )
86 1 {
87 2 #if OS_MAX_TASKS < 9
88 2 OsSemBuf[2 * Index] = Data; /* 计数器置初值 */
89 2 OsSemBuf[2 * Index + 1] = 0; /* 清空等待队列 */
90 2 #else
OsSemBuf[3 * Index] = Data; /* 计数器置初值 */
/* 清空等待队列 */
OsSemBuf[3 * Index + 1] = 0;
OsSemBuf[3 * Index + 2] = 0;
#endif
96 2 OS_EXIT_CRITICAL();
97 2 return OS_SEM_OK;
98 2 }
99 1 OS_EXIT_CRITICAL();
100 1 return NOT_OK;
101 1 }
102
103 /*********************************************************************************************************
104 ** 函数名称: OSSemPend
105 ** 功能描述: 等待一个信号量
106 ** 输 入: Index:信号量索引
107 ** Tick:等待时间
108 ** 输 出: NOT_OK:参数错误
109 ** OS_SEM_OK:得到信号量
110 ** OS_SEM_TMO:超时到
111 ** OS_SEM_NOT_OK:没有得到信号量
112 ** 全局变量: 无
113 ** 调用模块: OSRunningTaskID,OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
114 **
115 ** 作 者: 陈明计
116 ** 日 期: 2002年9月1日
C51 COMPILER V7.06 OS_SEM 06/20/2005 15:36:06 PAGE 3
117 **-------------------------------------------------------------------------------------------------------
118 ** 修改人: 陈明计
119 ** 日 期: 2002年10月20日
120 **-------------------------------------------------------------------------------------------------------
121 ** 修改人: 陈明计
122 ** 日 期: 2002年10月26日
123 **-------------------------------------------------------------------------------------------------------
124 ** 修改人: 陈明计
125 ** 日 期: 2002年12月2日
126 **-------------------------------------------------------------------------------------------------------
127 ** 修改人: 陈明计
128 ** 日 期: 2002年12月30日
129 **-------------------------------------------------------------------------------------------------------
130 ** 修改人:
131 ** 日 期:
132 **-------------------------------------------------------------------------------------------------------
133 ********************************************************************************************************/
134 #if EN_OS_SEM_PENT > 0
135
136 uint8 OSSemPend(uint8 Index, uint8 Tick)
137 {
138 1 #if EN_OS_SEM_CHK > 0
139 1 if (Index >= OS_MAX_SEMS)
140 1 {
141 2 return 0;
142 2 }
143 1 #endif
144 1
145 1 OS_ENTER_CRITICAL();
146 1
147 1 OSWaitTick[OSRunningTaskID()] = Tick; /* 设置超时时间 */
148 1 /* 可以优化寄存器的使用 */
149 1 /* 把任务加入等待任务队列 */
150 1 #if OS_MAX_TASKS < 9
151 1 OsSemBuf[Index * 2 + 1] |= OSMapTbl[OSRunningTaskID()];
152 1 #else
if (OSRunningTaskID() < 8)
{
OsSemBuf[Index * 3 + 1] |= OSMapTbl[OSRunningTaskID()];
}
else
{
OsSemBuf[Index * 3 + 2] |= OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
162 1 /* 信号量是否有效 */
163 1 #if OS_MAX_TASKS < 9
164 1 while (OsSemBuf[Index * 2] == 0)
165 1 {
166 2 #else
while (OsSemBuf[Index * 3] == 0)
{
#endif
170 2 /* 使用堆栈是为了使函数具有重入性 */
171 2 #ifdef __C51__
172 2 SP++;
173 2 *((uint8 data *)SP) = Index;
174 2 #endif
175 2 /* 信号量无效 */
176 2 OSClearSignal(OSRunningTaskID()); /* 任务进入等待状态 */
177 2 OSSched(); /* 运行下一个任务 */
178 2
C51 COMPILER V7.06 OS_SEM 06/20/2005 15:36:06 PAGE 4
179 2 #ifdef __C51__
180 2 Index = *((uint8 data *)SP);
181 2 SP--;
182 2 #endif
183 2 /* 任务再次运行,如果超时到,退出循环 */
184 2 if (OSWaitTick[OSRunningTaskID()] == 0)
185 2 {
186 3 break;
187 3 }
188 2 }
189 1
190 1 /* 将任务从等待队列中清除(可以删除) */
191 1 #if OS_MAX_TASKS < 9
192 1 OsSemBuf[Index * 2 + 1] &= ~OSMapTbl[OSRunningTaskID()];
193 1 #else
if (OSRunningTaskID() < 8)
{
OsSemBuf[Index * 3 + 1] &= ~OSMapTbl[OSRunningTaskID()];
}
else
{
OsSemBuf[Index * 3 + 2] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
203 1 /* 判断信号量是否有效。有效,信号量计数器减一 */
204 1 #if OS_MAX_TASKS < 9
205 1 if (OsSemBuf[Index * 2] > 0)
206 1 {
207 2 OsSemBuf[Index * 2]--;
208 2 #else
if (OsSemBuf[Index * 3] > 0)
{
OsSemBuf[Index * 3]--;
#endif
213 2 OS_EXIT_CRITICAL();
214 2 return OS_SEM_OK;
215 2 }
216 1 else
217 1 {
218 2 /* 无信号返回信号无效 */
219 2 OS_EXIT_CRITICAL();
220 2 return OS_SEM_TMO;
221 2 }
222 1 }
223 #endif
224
225 /*********************************************************************************************************
226 ** 函数名称: OSSemAccept
227 ** 功能描述: 无等待请求信号量
228 ** 输 入: Index:信号量索引
229 ** 输 出: NOT_OK:参数错误
230 ** OS_SEM_OK:得到信号量
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -