📄 os_mutex.lst
字号:
385 4 }
386 3 }
387 2 OSTCBPrioTbl[pip] = (OS_TCB *)ptcb;
388 2 }
389 1 OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /* Mutex not available, pend current task */
390 1 OSTCBCur->OSTCBDly = timeout; /* Store timeout in current task's TCB */
391 1 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
392 1 OS_EXIT_CRITICAL();
393 1 OS_Sched(); /* Find next highest priority task ready */
394 1 OS_ENTER_CRITICAL();
395 1 if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) { /* Must have timed out if still waiting for event*/
396 2 OS_EventTO(pevent);
397 2 OS_EXIT_CRITICAL();
398 2 *err = OS_TIMEOUT; /* Indicate that we didn't get mutex within TO */
399 2 return;
400 2 }
401 1 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
402 1 OS_EXIT_CRITICAL();
403 1 *err = OS_NO_ERR;
404 1 }
405 /*$PAGE*/
406 /*
407 *********************************************************************************************************
408 * POST TO A MUTUAL EXCLUSION SEMAPHORE
409 *
410 * Description: This function signals a mutual exclusion semaphore
411 *
412 * Arguments : pevent is a pointer to the event control block associated with the desired
413 * mutex.
414 *
415 * Returns : OS_NO_ERR The call was successful and the mutex was signaled.
416 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a mutex
417 * OS_ERR_PEVENT_NULL 'pevent' is a NULL pointer
418 * OS_ERR_POST_ISR Attempted to post from an ISR (not valid for MUTEXes)
419 * OS_ERR_NOT_MUTEX_OWNER The task that did the post is NOT the owner of the MUTEX.
420 *********************************************************************************************************
421 */
422
423 INT8U OSMutexPost (OS_EVENT *pevent) reentrant //using 0
424 {
425 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
426 1 OS_CPU_SR cpu_sr;
C51 COMPILER V7.06 OS_MUTEX 07/18/2003 11:06:01 PAGE 8
427 1 #endif
428 1 INT8U pip; /* Priority inheritance priority */
429 1 INT8U prio;
430 1
431 1
432 1 if (OSIntNesting > 0) { /* See if called from ISR ... */
433 2 return (OS_ERR_POST_ISR); /* ... can't POST mutex from an ISR */
434 2 }
435 1 #if OS_ARG_CHK_EN > 0
436 1 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
437 2 return (OS_ERR_PEVENT_NULL);
438 2 }
439 1 #endif
440 1 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
441 2 return (OS_ERR_EVENT_TYPE);
442 2 }
443 1 OS_ENTER_CRITICAL();
444 1 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get priority inheritance priority of mutex */
445 1 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original priority */
446 1 if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr) { /* See if posting task owns the MUTEX */
447 2 OS_EXIT_CRITICAL();
448 2 return (OS_ERR_NOT_MUTEX_OWNER);
449 2 }
450 1 if (OSTCBCur->OSTCBPrio == pip) { /* Did we have to raise current task's priority? */
451 2 /* Yes, Return to original priority */
452 2 /* Remove owner from ready list at 'pip' */
453 2 if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
454 3 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
455 3 }
456 2 OSTCBCur->OSTCBPrio = prio;
457 2 OSTCBCur->OSTCBY = prio >> 3;
458 2 OSTCBCur->OSTCBBitY = OSMapTbl[OSTCBCur->OSTCBY];
459 2 OSTCBCur->OSTCBX = prio & 0x07;
460 2 OSTCBCur->OSTCBBitX = OSMapTbl[OSTCBCur->OSTCBX];
461 2 OSRdyGrp |= OSTCBCur->OSTCBBitY;
462 2 OSRdyTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
463 2 OSTCBPrioTbl[prio] = (OS_TCB *)OSTCBCur;
464 2 }
465 1 OSTCBPrioTbl[pip] = (OS_TCB *)1; /* Reserve table entry */
466 1 if (pevent->OSEventGrp != 0x00) { /* Any task waiting for the mutex? */
467 2 /* Yes, Make HPT waiting for mutex ready */
468 2 prio = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
469 2 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Save priority of mutex's new owner */
470 2 pevent->OSEventCnt |= prio;
471 2 pevent->OSEventPtr = OSTCBPrioTbl[prio]; /* Link to mutex owner's OS_TCB */
472 2 OS_EXIT_CRITICAL();
473 2 OS_Sched(); /* Find highest priority task ready to run */
474 2 return (OS_NO_ERR);
475 2 }
476 1 pevent->OSEventCnt |= OS_MUTEX_AVAILABLE; /* No, Mutex is now available */
477 1 pevent->OSEventPtr = (void *)0;
478 1 OS_EXIT_CRITICAL();
479 1 return (OS_NO_ERR);
480 1 }
481 /*$PAGE*/
482 /*
483 *********************************************************************************************************
484 * QUERY A MUTUAL EXCLUSION SEMAPHORE
485 *
486 * Description: This function obtains information about a mutex
487 *
488 * Arguments : pevent is a pointer to the event control block associated with the desired mutex
C51 COMPILER V7.06 OS_MUTEX 07/18/2003 11:06:01 PAGE 9
489 *
490 * pdata is a pointer to a structure that will contain information about the mutex
491 *
492 * Returns : OS_NO_ERR The call was successful and the message was sent
493 * OS_ERR_QUERY_ISR If you called this function from an ISR
494 * OS_ERR_PEVENT_NULL 'pevent' is a NULL pointer
495 * OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non mutex.
496 *********************************************************************************************************
497 */
498
499 #if OS_MUTEX_QUERY_EN > 0
500 INT8U OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *pndata) reentrant //using 0
501 {
502 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
503 1 OS_CPU_SR cpu_sr;
504 1 #endif
505 1 INT8U *psrc;
506 1 INT8U *pdest;
507 1
508 1
509 1 if (OSIntNesting > 0) { /* See if called from ISR ... */
510 2 return (OS_ERR_QUERY_ISR); /* ... can't QUERY mutex from an ISR */
511 2 }
512 1 #if OS_ARG_CHK_EN > 0
513 1 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
514 2 return (OS_ERR_PEVENT_NULL);
515 2 }
516 1 #endif
517 1 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
518 2 return (OS_ERR_EVENT_TYPE);
519 2 }
520 1 OS_ENTER_CRITICAL();
521 1 pndata->OSMutexPIP = (INT8U)(pevent->OSEventCnt >> 8);
522 1 pndata->OSOwnerPrio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);
523 1 if (pndata->OSOwnerPrio == 0xFF) {
524 2 pndata->OSValue = 1;
525 2 } else {
526 2 pndata->OSValue = 0;
527 2 }
528 1 pndata->OSEventGrp = pevent->OSEventGrp; /* Copy wait list */
529 1 psrc = &pevent->OSEventTbl[0];
530 1 pdest = &pndata->OSEventTbl[0];
531 1 #if OS_EVENT_TBL_SIZE > 0
532 1 *pdest++ = *psrc++;
533 1 #endif
534 1
535 1 #if OS_EVENT_TBL_SIZE > 1
536 1 *pdest++ = *psrc++;
537 1 #endif
538 1
539 1 #if OS_EVENT_TBL_SIZE > 2
540 1 *pdest++ = *psrc++;
541 1 #endif
542 1
543 1 #if OS_EVENT_TBL_SIZE > 3
544 1 *pdest++ = *psrc++;
545 1 #endif
546 1
547 1 #if OS_EVENT_TBL_SIZE > 4
548 1 *pdest++ = *psrc++;
549 1 #endif
550 1
C51 COMPILER V7.06 OS_MUTEX 07/18/2003 11:06:01 PAGE 10
551 1 #if OS_EVENT_TBL_SIZE > 5
552 1 *pdest++ = *psrc++;
553 1 #endif
554 1
555 1 #if OS_EVENT_TBL_SIZE > 6
556 1 *pdest++ = *psrc++;
557 1 #endif
558 1
559 1 #if OS_EVENT_TBL_SIZE > 7
560 1 *pdest = *psrc;
561 1 #endif
562 1 OS_EXIT_CRITICAL();
563 1 return (OS_NO_ERR);
564 1 }
565 #endif /* OS_MUTEX_QUERY_EN */
566 #endif /* OS_MUTEX_EN */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 4590 ----
CONSTANT SIZE = 2 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -