📄 os_sem.lst
字号:
209 #endif
210
211 /*********************************************************************************************************
212 ** 函数名称: OSSemAccept
213 ** 功能描述: 无等待请求信号量
214 ** 输 入: Index:信号量索引
215 ** 输 出: NOT_OK:参数错误
216 ** OS_SEM_OK:得到信号量
217 ** OS_SEM_TMO:超时到
218 ** OS_SEM_NOT_OK:没有得到信号量
219 ** 全局变量: 无
220 ** 调用模块: OS_TaskSuspend,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
221 **
222 ** 作 者: 陈明计
223 ** 日 期: 2002年9月1日
224 **-------------------------------------------------------------------------------------------------------
225 ** 修改人: 陈明计
226 ** 日 期: 2002年10月20日
227 ***-------------------------------------------------------------------------------------------------------
228 ** 修改人: 陈明计
229 ** 日 期: 2002年10月26日
230 **-------------------------------------------------------------------------------------------------------
231 ** 修改人:
232 ** 日 期:
233 **-------------------------------------------------------------------------------------------------------
234 ********************************************************************************************************/
235 #if EN_OS_SEM_ACCEPT > 0
uint8 OSSemAccept(uint8 Index)
{
#if EN_OS_SEM_CHK > 0
if (Index >= OS_MAX_SEMS)
{
return 0;
C51 COMPILER V7.10 OS_SEM 07/02/2005 23:47:37 PAGE 5
}
#endif
OS_ENTER_CRITICAL();
/* 判断信号量是否有效。有效,信号量计数器减一 */
#if OS_MAX_TASKS < 9
if (OsSemBuf[Index * 2] > 0)
{
OsSemBuf[Index * 2]--;
#else
if (OsSemBuf[Index * 3] > 0)
{
OsSemBuf[Index * 3]--;
#endif
OS_EXIT_CRITICAL();
return OS_SEM_OK;
}
else
{
/* 无信号返回信号无效 */
OS_EXIT_CRITICAL();
return OS_SEM_NOT_OK;
}
}
#endif
267
268
269 /*********************************************************************************************************
270 ** 函数名称: OSSemPost
271 ** 功能描述: 中断中发送一个信号量
272 ** 输 入: Index:信号量索引
273 ** 输 出: NOT_OK:参数错误
274 ** OS_SEM_OK:发送成功
275 ** 全局变量: 无
276 ** 调用模块: OSTaskResume,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
277 **
278 ** 作 者: 陈明计
279 ** 日 期: 2003年8月3日
280 **-------------------------------------------------------------------------------------------------------
281 ** 修改人: 陈明计
282 ** 日 期: 2002年10月26日
283 **-------------------------------------------------------------------------------------------------------
284 ** 修改人: 陈明计
285 ** 日 期: 2002年12月30日
286 **-------------------------------------------------------------------------------------------------------
287 ** 修改人:
288 ** 日 期:
289 **-------------------------------------------------------------------------------------------------------
290 ********************************************************************************************************/
291 #if EN_OS_SEM_POST > 0
292 uint8 OSSemPost(uint8 Index)
293 {
294 1 uint8 temp,i;
295 1
296 1 #if EN_OS_SEM_CHK > 0
if (Index >= OS_MAX_SEMS)
{
return NOT_OK;
}
#endif
302 1
303 1 OS_ENTER_CRITICAL();
C51 COMPILER V7.10 OS_SEM 07/02/2005 23:47:37 PAGE 6
304 1
305 1 #if OS_MAX_TASKS < 9
306 1 /* 信号量计数器加一 */
307 1 if (OsSemBuf[Index * 2] <255)
308 1 {
309 2 OsSemBuf[Index * 2]++;
310 2 }
311 1 /* 察看信号量的等待任务队列 */
312 1 temp = OsSemBuf[Index * 2 + 1];
313 1 for (i = 0; i < OS_MAX_TASKS; i++)
314 1 {
315 2 if ((temp & 0x01) != 0)
316 2 {
317 3 break;
318 3 }
319 2 temp = temp >> 1;
320 2 }
321 1 /* 有任务等待信号,使其中优先级最高的进入就绪状态,并将其从等待队列中清除 */
322 1 if (i < OS_MAX_TASKS)
323 1 {
324 2 OsSemBuf[Index * 2 + 1] &= ~OSMapTbl[i];
325 2 OSTaskResume(i);
326 2 }
327 1 #else
/* 信号量计数器加一 */
if (OsSemBuf[Index * 3] <255)
{
OsSemBuf[Index * 3]++;
}
temp = OsSemBuf[Index * 3 + 1];
for (i = 0; i < 8; i++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
if (i >= 8)
{
temp = OsSemBuf[Index * 3 + 2];
for ( ; i < OS_MAX_TASKS; i++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
}
/* 有任务等待信号,使其中优先级最高的进入就绪状态,并将其从等待队列中清除 */
if (i < OS_MAX_TASKS)
{
if (i < 8)
{
OsSemBuf[Index * 3 + 1] &= ~OSMapTbl[i];
}
else
{
OsSemBuf[Index * 3 + 2] &= ~OSMapTbl[i & 0x07];
}
C51 COMPILER V7.10 OS_SEM 07/02/2005 23:47:37 PAGE 7
OSTaskResume(i);
}
#endif
369 1 OS_EXIT_CRITICAL();
370 1 return OS_SEM_OK;
371 1 }
372 #endif
373 /*********************************************************************************************************
374 ** 函数名称: OSSemQuery
375 ** 功能描述: 查询信号量
376 ** 输 入: Index:信号量索引
377 ** 输 出: 信号量的值
378 ** 全局变量: 无
379 ** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
380 **
381 ** 作 者: 陈明计
382 ** 日 期: 2002年9月1日
383 **-------------------------------------------------------------------------------------------------------
384 ** 修改人: 陈明计
385 ** 日 期: 2002年10月26日
386 **-------------------------------------------------------------------------------------------------------
387 ** 修改人:
388 ** 日 期:
389 **-------------------------------------------------------------------------------------------------------
390 ********************************************************************************************************/
391 #if EN_OS_SEM_QUERY > 0
uint8 OSSemQuery(uint8 Index)
{
if (Index >= OS_MAX_SEMS)
{
return 0;
}
#if OS_MAX_TASKS < 9
return OsSemBuf[2*Index];
#else
return OsSemBuf[3*Index];
#endif
}
#endif
406
407 #endif
408 /*********************************************************************************************************
409 ** End Of File
410 ********************************************************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 224 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = 4 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -