📄 os_sem.lst
字号:
231 ** OS_SEM_TMO:超时到
232 ** OS_SEM_NOT_OK:没有得到信号量
233 ** 全局变量: 无
234 ** 调用模块: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
235 **
236 ** 作 者: 陈明计
237 ** 日 期: 2002年9月1日
238 **-------------------------------------------------------------------------------------------------------
239 ** 修改人: 陈明计
240 ** 日 期: 2002年10月20日
C51 COMPILER V7.06 OS_SEM 12/21/2004 15:11:26 PAGE 5
241 ***-------------------------------------------------------------------------------------------------------
242 ** 修改人: 陈明计
243 ** 日 期: 2002年10月26日
244 **-------------------------------------------------------------------------------------------------------
245 ** 修改人:
246 ** 日 期:
247 **-------------------------------------------------------------------------------------------------------
248 ********************************************************************************************************/
249 #if EN_OS_SEM_ACCEPT > 0
250 uint8 OSSemAccept(uint8 Index)
251 {
252 1 #if EN_OS_SEM_CHK > 0
253 1 if (Index >= OS_MAX_SEMS)
254 1 {
255 2 return 0;
256 2 }
257 1 #endif
258 1
259 1 OS_ENTER_CRITICAL();
260 1 /* 判断信号量是否有效。有效,信号量计数器减一 */
261 1 #if OS_MAX_TASKS < 9
262 1 if (OsSemBuf[Index * 2] > 0)
263 1 {
264 2 OsSemBuf[Index * 2]--;
265 2 #else
if (OsSemBuf[Index * 3] > 0)
{
OsSemBuf[Index * 3]--;
#endif
270 2 OS_EXIT_CRITICAL();
271 2 return OS_SEM_OK;
272 2 }
273 1 else
274 1 {
275 2 /* 无信号返回信号无效 */
276 2 OS_EXIT_CRITICAL();
277 2 return OS_SEM_NOT_OK;
278 2 }
279 1 }
280 #endif
281
282
283 /*********************************************************************************************************
284 ** 函数名称: OSSemIntPost
285 ** 功能描述: 中断中发送一个信号量
286 ** 输 入: Index:信号量索引
287 ** 输 出: NOT_OK:参数错误
288 ** OS_SEM_OK:发送成功
289 ** 全局变量: 无
290 ** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
291 **
292 ** 作 者: 陈明计
293 ** 日 期: 2002年9月1日
294 **-------------------------------------------------------------------------------------------------------
295 ** 修改人: 陈明计
296 ** 日 期: 2002年10月26日
297 **-------------------------------------------------------------------------------------------------------
298 ** 修改人: 陈明计
299 ** 日 期: 2002年12月30日
300 **-------------------------------------------------------------------------------------------------------
301 ** 修改人:
302 ** 日 期:
C51 COMPILER V7.06 OS_SEM 12/21/2004 15:11:26 PAGE 6
303 **-------------------------------------------------------------------------------------------------------
304 ********************************************************************************************************/
305 #if EN_OS_SEM_INT_POST > 0 || EN_OS_SEM_POST > 0
306 uint8 OSSemIntPost(uint8 Index)
307 {
308 1 uint8 temp,i;
309 1
310 1 #if EN_OS_SEM_CHK > 0
311 1 if (Index >= OS_MAX_SEMS)
312 1 {
313 2 return NOT_OK;
314 2 }
315 1 #endif
316 1
317 1 OS_ENTER_CRITICAL();
318 1
319 1 #if OS_MAX_TASKS < 9
320 1 /* 信号量计数器加一 */
321 1 if (OsSemBuf[Index * 2] <255)
322 1 {
323 2 OsSemBuf[Index * 2]++;
324 2 }
325 1 /* 察看信号量的等待任务队列 */
326 1 temp = OsSemBuf[Index * 2 + 1];
327 1 for (i = 0; i < OS_MAX_TASKS; i++)
328 1 {
329 2 if ((temp & 0x01) != 0)
330 2 {
331 3 break;
332 3 }
333 2 temp = temp >> 1;
334 2 }
335 1 /* 有任务等待信号,使其中优先级最高的进入就绪状态,并将其从等待队列中清除 */
336 1 if (i < OS_MAX_TASKS)
337 1 {
338 2 OsSemBuf[Index * 2 + 1] &= ~OSMapTbl[i];
339 2 OSIntSendSignal(i);
340 2 }
341 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;
C51 COMPILER V7.06 OS_SEM 12/21/2004 15:11:26 PAGE 7
}
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];
}
OSIntSendSignal(i);
}
#endif
383 1 OS_EXIT_CRITICAL();
384 1 return OS_SEM_OK;
385 1 }
386 #endif
387
388 /*********************************************************************************************************
389 ** 函数名称: OSSemPost
390 ** 功能描述: 发送一个信号量
391 ** 输 入: Index:信号量索引
392 ** 输 出: NOT_OK:参数错误
393 ** OS_SEM_OK:发送成功
394 ** 全局变量: 无
395 ** 调用模块: OSSemIntPost,OSSched
396 **
397 ** 作 者: 陈明计
398 ** 日 期: 2002年9月1日
399 **-------------------------------------------------------------------------------------------------------
400 ** 修改人:
401 ** 日 期:
402 **-------------------------------------------------------------------------------------------------------
403 ********************************************************************************************************/
404 #if EN_OS_SEM_POST > 0
405 uint8 OSSemPost(uint8 Index)
406 {
407 1 if (OSSemIntPost(Index) == OS_SEM_OK)
408 1 {
409 2 OSSched();
410 2 return OS_SEM_OK;
411 2 }
412 1 else
413 1 {
414 2 return NOT_OK;
415 2 }
416 1 }
417 #endif
418
419 /*********************************************************************************************************
420 ** 函数名称: OSSemQuery
421 ** 功能描述: 查询信号量
422 ** 输 入: Index:信号量索引
423 ** 输 出: 信号量的值
424 ** 全局变量: 无
425 ** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
426 **
C51 COMPILER V7.06 OS_SEM 12/21/2004 15:11:26 PAGE 8
427 ** 作 者: 陈明计
428 ** 日 期: 2002年9月1日
429 **-------------------------------------------------------------------------------------------------------
430 ** 修改人: 陈明计
431 ** 日 期: 2002年10月26日
432 **-------------------------------------------------------------------------------------------------------
433 ** 修改人:
434 ** 日 期:
435 **-------------------------------------------------------------------------------------------------------
436 ********************************************************************************************************/
437 #if EN_OS_SEM_QUERY > 0
438 uint8 OSSemQuery(uint8 Index)
439 {
440 1 if (Index >= OS_MAX_SEMS)
441 1 {
442 2 return 0;
443 2 }
444 1
445 1 #if OS_MAX_TASKS < 9
446 1 return OsSemBuf[2*Index];
447 1 #else
return OsSemBuf[3*Index];
#endif
450 1 }
451 #endif
452
453 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 474 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 20 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 1
IDATA SIZE = ---- ----
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 + -