📄 os_sem.lst
字号:
C51 COMPILER V7.10 OS_SEM 07/02/2005 23:47:37 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE OS_SEM
OBJECT MODULE PLACED IN .\OS_SEM.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ..\OS\OS_SEM.C BROWSE PRINT(.\OS_SEM.lst) OBJECT(.\OS_SEM.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.0
9 **
10 **
11 **--------------文件信息--------------------------------------------------------------------------------
12 **文 件 名: OS_Q.C
13 **创 建 人: 陈明计
14 **最后修改日期: 2003年8月3日
15 **描 述: Small RTOS(51)信号量代码
16 **
17 **--------------历史版本信息----------------------------------------------------------------------------
18 ** 创建人: 陈明计
19 ** 版 本: V1.10~V1.12.0
20 ** 日 期: 2002年9月1日~2002年12月30日
21 ** 描 述: 完善信号量代码
22 **
23 **------------------------------------------------------------------------------------------------------
24 ** 修改人: 陈明计
25 ** 版 本: V1.20.0
26 ** 日 期: 2003年8月3日
27 ** 描 述: 删除OSInt*函数,根据新版本要求改变一些代码
28 **
29 **--------------当前版本修订----------------------------------------------------------------------------
30 ** 修改人:
31 ** 日 期:
32 ** 描 述:
33 **
34 **------------------------------------------------------------------------------------------------------
35 ********************************************************************************************************/
36
37 #define IN_OS_SEM
38 #include "config.h"
39
40 /* 分配信号量存储空间 */
41 #if EN_OS_SEM > 0
42 #if OS_MAX_TASKS < 9
43 uint8 OS_SEM_MEM_SEL OsSemBuf[OS_MAX_SEMS * 2];
44 #else
uint8 OS_SEM_MEM_SEL OsSemBuf[OS_MAX_SEMS * 3];
#endif
47
48
49
50 /*********************************************************************************************************
51 ** 函数名称: OSSemCreate
52 ** 功能描述: 初始化消息队列
53 ** 输 入: Index:信号量索引
54 ** data:信号量初始值
55 ** 输 出: NOT_OK:没有这个信号量
C51 COMPILER V7.10 OS_SEM 07/02/2005 23:47:37 PAGE 2
56 ** OS_SEM_OK:成功
57 ** 全局变量: 无
58 ** 调用模块: 无
59 **
60 ** 作 者: 陈明计
61 ** 日 期: 2002年9月1日
62 **-------------------------------------------------------------------------------------------------------
63 ** 修改人:
64 ** 日 期:
65 **-------------------------------------------------------------------------------------------------------
66 ********************************************************************************************************/
67
68 uint8 OSSemCreate(uint8 Index,uint8 Data)
69 {
70 1 OS_ENTER_CRITICAL();
71 1 if (Index < OS_MAX_SEMS )
72 1 {
73 2 #if OS_MAX_TASKS < 9
74 2 OsSemBuf[2 * Index] = Data; /* 计数器置初值 */
75 2 OsSemBuf[2 * Index + 1] = 0; /* 清空等待队列 */
76 2 #else
OsSemBuf[3 * Index] = Data; /* 计数器置初值 */
/* 清空等待队列 */
OsSemBuf[3 * Index + 1] = 0;
OsSemBuf[3 * Index + 2] = 0;
#endif
82 2 OS_EXIT_CRITICAL();
83 2 return OS_SEM_OK;
84 2 }
85 1 OS_EXIT_CRITICAL();
86 1 return NOT_OK;
87 1 }
88
89 /*********************************************************************************************************
90 ** 函数名称: OSSemPend
91 ** 功能描述: 等待一个信号量
92 ** 输 入: Index:信号量索引
93 ** Tick:等待时间
94 ** 输 出: NOT_OK:参数错误
95 ** OS_SEM_OK:得到信号量
96 ** OS_SEM_TMO:超时到
97 ** OS_SEM_NOT_OK:没有得到信号量
98 ** 全局变量: 无
99 ** 调用模块: OSRunningTaskID,OS_TaskSuspend,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
100 **
101 ** 作 者: 陈明计
102 ** 日 期: 2002年9月1日
103 **-------------------------------------------------------------------------------------------------------
104 ** 修改人: 陈明计
105 ** 日 期: 2002年10月20日
106 **-------------------------------------------------------------------------------------------------------
107 ** 修改人: 陈明计
108 ** 日 期: 2002年10月26日
109 **-------------------------------------------------------------------------------------------------------
110 ** 修改人: 陈明计
111 ** 日 期: 2002年12月2日
112 **-------------------------------------------------------------------------------------------------------
113 ** 修改人: 陈明计
114 ** 日 期: 2002年12月30日
115 **-------------------------------------------------------------------------------------------------------
116 ** 修改人:
117 ** 日 期:
C51 COMPILER V7.10 OS_SEM 07/02/2005 23:47:37 PAGE 3
118 **-------------------------------------------------------------------------------------------------------
119 ********************************************************************************************************/
120 #if EN_OS_SEM_PENT > 0
121
122 uint8 OSSemPend(uint8 Index, uint8 Tick)
123 {
124 1 #if EN_OS_SEM_CHK > 0
if (Index >= OS_MAX_SEMS)
{
return 0;
}
#endif
130 1
131 1 OS_ENTER_CRITICAL();
132 1
133 1 OSWaitTick[OSRunningTaskID()] = Tick; /* 设置超时时间 */
134 1 /* 可以优化寄存器的使用 */
135 1 /* 把任务加入等待任务队列 */
136 1 #if OS_MAX_TASKS < 9
137 1 OsSemBuf[Index * 2 + 1] |= OSMapTbl[OSRunningTaskID()];
138 1 #else
if (OSRunningTaskID() < 8)
{
OsSemBuf[Index * 3 + 1] |= OSMapTbl[OSRunningTaskID()];
}
else
{
OsSemBuf[Index * 3 + 2] |= OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
148 1 /* 信号量是否有效 */
149 1 #if OS_MAX_TASKS < 9
150 1 while (OsSemBuf[Index * 2] == 0)
151 1 {
152 2 #else
while (OsSemBuf[Index * 3] == 0)
{
#endif
156 2 /* 使用堆栈是为了使函数具有重入性 */
157 2 #ifdef __C51__
158 2 SP++;
159 2 *((uint8 data *)SP) = Index;
160 2 #endif
161 2 /* 信号量无效 */
162 2 OS_TaskSuspend(OSRunningTaskID()); /* 任务进入等待状态 */
163 2 OSSched(); /* 运行下一个任务 */
164 2
165 2 #ifdef __C51__
166 2 Index = *((uint8 data *)SP);
167 2 SP--;
168 2 #endif
169 2 /* 任务再次运行,如果超时到,退出循环 */
170 2 if (OSWaitTick[OSRunningTaskID()] == 0)
171 2 {
172 3 break;
173 3 }
174 2 }
175 1
176 1 /* 将任务从等待队列中清除(可以删除) */
177 1 #if OS_MAX_TASKS < 9
178 1 OsSemBuf[Index * 2 + 1] &= ~OSMapTbl[OSRunningTaskID()];
179 1 #else
C51 COMPILER V7.10 OS_SEM 07/02/2005 23:47:37 PAGE 4
if (OSRunningTaskID() < 8)
{
OsSemBuf[Index * 3 + 1] &= ~OSMapTbl[OSRunningTaskID()];
}
else
{
OsSemBuf[Index * 3 + 2] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
189 1 /* 判断信号量是否有效。有效,信号量计数器减一 */
190 1 #if OS_MAX_TASKS < 9
191 1 if (OsSemBuf[Index * 2] > 0)
192 1 {
193 2 OsSemBuf[Index * 2]--;
194 2 #else
if (OsSemBuf[Index * 3] > 0)
{
OsSemBuf[Index * 3]--;
#endif
199 2 OS_EXIT_CRITICAL();
200 2 return OS_SEM_OK;
201 2 }
202 1 else
203 1 {
204 2 /* 无信号返回信号无效 */
205 2 OS_EXIT_CRITICAL();
206 2 return OS_SEM_TMO;
207 2 }
208 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -