📄 os_mutex.s43
字号:
; 371. if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) { /* Must have timed out if still waiting for event*/
MOV &OSTCBCur,R12
BIT.B #16,28(R12)
JEQ (?0115)
; 372. OS_EventTO(pevent);
MOV R10,R12
CALL #OS_EventTO
; 373. OS_EXIT_CRITICAL();
EINT
; 374. *err = OS_TIMEOUT; /* Indicate that we didn't get mutex within TO */
MOV.B #10,0(R11)
; 375. return;
; 376. }
JMP (?0116)
?0115:
; 377. OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
MOV &OSTCBCur,R12
MOV #0,18(R12)
; 378. OS_EXIT_CRITICAL();
EINT
; 379. *err = OS_NO_ERR;
MOV.B #0,0(R11)
; 380. }
?0116:
POP R8
POP R11
POP R10
RET
OSMutexPost:
; 381. /*$PAGE*/
; 382. /*
; 383. *********************************************************************************************************
; 384. * POST TO A MUTUAL EXCLUSION SEMAPHORE
; 385. *
; 386. * Description: This function signals a mutual exclusion semaphore
; 387. *
; 388. * Arguments : pevent is a pointer to the event control block associated with the desired
; 389. * mutex.
; 390. *
; 391. * Returns : OS_NO_ERR The call was successful and the mutex was signaled.
; 392. * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a mutex
; 393. * OS_ERR_PEVENT_NULL 'pevent' is a NULL pointer
; 394. * OS_ERR_POST_ISR Attempted to post from an ISR (not valid for MUTEXes)
; 395. * OS_ERR_NOT_MUTEX_OWNER The task that did the post is NOT the owner of the MUTEX.
; 396. *********************************************************************************************************
; 397. */
; 398.
; 399. INT8U OSMutexPost (OS_EVENT *pevent)
; 400. {
PUSH R10
MOV R12,R10
; 401. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; 402. OS_CPU_SR cpu_sr;
; 403. #endif
; 404. INT8U pip; /* Priority inheritance priority */
; 405. INT8U prio;
; 406.
; 407.
; 408. if (OSIntNesting > 0) { /* See if called from ISR ... */
CMP.B #0,&OSIntNesting
JEQ (?0118)
; 409. return (OS_ERR_POST_ISR); /* ... can't POST mutex from an ISR */
MOV.B #5,R12
; 410. }
JMP (?0133)
?0118:
; 411. #if OS_ARG_CHK_EN > 0
; 412. if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
CMP #0,R10
MOV.B #4,R12
JEQ (?0133)
; 413. return (OS_ERR_PEVENT_NULL);
; 414. }
; 415. if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
CMP.B @R10,R12
JEQ (?0122)
; 416. return (OS_ERR_EVENT_TYPE);
MOV.B #1,R12
; 417. }
JMP (?0133)
?0122:
; 418. #endif
; 419. OS_ENTER_CRITICAL();
DINT
; 420. pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get priority inheritance priority of mutex */
MOV 2(R10),R13
SWPB R13
AND.B #-1,R13
; 421. prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original priority */
MOV 2(R10),R12
AND.B #255,R12
; 422. if (OSTCBCur->OSTCBPrio != pip &&
; 423. OSTCBCur->OSTCBPrio != prio) { /* See if posting task owns the MUTEX */
MOV &OSTCBCur,R14
CMP.B 29(R14),R13
JEQ (?0124)
MOV &OSTCBCur,R14
CMP.B 29(R14),R12
JEQ (?0124)
; 424. OS_EXIT_CRITICAL();
EINT
; 425. return (OS_ERR_NOT_MUTEX_OWNER);
MOV.B #120,R12
; 426. }
JMP (?0133)
?0124:
; 427. if (OSTCBCur->OSTCBPrio == pip) { /* Did we have to raise current task's priority? */
MOV &OSTCBCur,R14
CMP.B 29(R14),R13
JNE (?0128)
; 428. /* Yes, Return to original priority */
; 429. /* Remove owner from ready list at 'pip' */
; 430. if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
MOV &OSTCBCur,R14
MOV.B 31(R14),R14
MOV &OSTCBCur,R15
MOV.B 32(R15),R15
XOR.B #-1,R15
AND.B R15,OSRdyTbl(R14)
CMP.B #0,OSRdyTbl(R14)
JNE (?0130)
; 431. OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
MOV &OSTCBCur,R14
MOV.B 33(R14),R14
XOR.B #-1,R14
AND.B R14,&OSRdyGrp
?0130:
; 432. }
; 433. OSTCBCur->OSTCBPrio = prio;
MOV &OSTCBCur,R14
MOV.B R12,29(R14)
; 434. OSTCBCur->OSTCBY = prio >> 3;
MOV R12,R14
CLRC
RRC.B R14
RRA.B R14
RRA.B R14
MOV &OSTCBCur,R15
MOV.B R14,31(R15)
; 435. OSTCBCur->OSTCBBitY = OSMapTbl[OSTCBCur->OSTCBY];
MOV &OSTCBCur,R14
MOV.B 31(R14),R14
MOV &OSTCBCur,R15
MOV.B OSMapTbl(R14),33(R15)
; 436. OSTCBCur->OSTCBX = prio & 0x07;
MOV R12,R14
AND.B #7,R14
MOV &OSTCBCur,R15
MOV.B R14,30(R15)
; 437. OSTCBCur->OSTCBBitX = OSMapTbl[OSTCBCur->OSTCBX];
MOV &OSTCBCur,R14
MOV.B 30(R14),R14
MOV &OSTCBCur,R15
MOV.B OSMapTbl(R14),32(R15)
; 438. OSRdyGrp |= OSTCBCur->OSTCBBitY;
MOV &OSTCBCur,R14
BIS.B 33(R14),&OSRdyGrp
; 439. OSRdyTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
MOV &OSTCBCur,R14
MOV.B 31(R14),R14
MOV &OSTCBCur,R15
BIS.B 32(R15),OSRdyTbl(R14)
; 440. OSTCBPrioTbl[prio] = (OS_TCB *)OSTCBCur;
ADD R12,R12
MOV &OSTCBCur,OSTCBPrioTbl(R12)
?0128:
; 441. }
; 442. OSTCBPrioTbl[pip] = (OS_TCB *)1; /* Reserve table entry */
ADD R13,R13
MOV #1,OSTCBPrioTbl(R13)
; 443. if (pevent->OSEventGrp != 0x00) { /* Any task waiting for the mutex? */
CMP.B #0,1(R10)
JEQ (?0132)
; 444. /* Yes, Make HPT waiting for mutex ready */
; 445. prio = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
PUSH.B #16
MOV #0,R14
MOV R10,R12
CALL #OS_EventTaskRdy
ADD #2,SP
; 446. pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Save priority of mutex's new owner */
AND #65280,2(R10)
; 447. pevent->OSEventCnt |= prio;
MOV.B R12,R13
BIS R13,2(R10)
; 448. pevent->OSEventPtr = OSTCBPrioTbl[prio]; /* Link to mutex owner's OS_TCB */
AND.B #-1,R12
ADD R12,R12
MOV OSTCBPrioTbl(R12),4(R10)
; 449. OS_EXIT_CRITICAL();
EINT
; 450. OS_Sched(); /* Find highest priority task ready to run */
CALL #OS_Sched
; 451. return (OS_NO_ERR);
MOV.B #0,R12
; 452. }
JMP (?0133)
?0132:
; 453. pevent->OSEventCnt |= OS_MUTEX_AVAILABLE; /* No, Mutex is now available */
BIS #255,2(R10)
; 454. pevent->OSEventPtr = (void *)0;
MOV #0,4(R10)
; 455. OS_EXIT_CRITICAL();
EINT
; 456. return (OS_NO_ERR);
MOV.B #0,R12
; 457. }
?0133:
POP R10
RET
OSMutexQuery:
; 458. /*$PAGE*/
; 459. /*
; 460. *********************************************************************************************************
; 461. * QUERY A MUTUAL EXCLUSION SEMAPHORE
; 462. *
; 463. * Description: This function obtains information about a mutex
; 464. *
; 465. * Arguments : pevent is a pointer to the event control block associated with the desired mutex
; 466. *
; 467. * pdata is a pointer to a structure that will contain information about the mutex
; 468. *
; 469. * Returns : OS_NO_ERR The call was successful and the message was sent
; 470. * OS_ERR_QUERY_ISR If you called this function from an ISR
; 471. * OS_ERR_PEVENT_NULL 'pevent' is a NULL pointer
; 472. * OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non mutex.
; 473. *********************************************************************************************************
; 474. */
; 475.
; 476. #if OS_MUTEX_QUERY_EN > 0
; 477. INT8U OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *pdata)
; 478. {
; 479. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; 480. OS_CPU_SR cpu_sr;
; 481. #endif
; 482. INT8U *psrc;
; 483. INT8U *pdest;
; 484.
; 485.
; 486. if (OSIntNesting > 0) { /* See if called from ISR ... */
CMP.B #0,&OSIntNesting
JEQ (?0135)
; 487. return (OS_ERR_QUERY_ISR); /* ... can't QUERY mutex from an ISR */
MOV.B #6,R12
; 488. }
RET
?0135:
; 489. #if OS_ARG_CHK_EN > 0
; 490. if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
CMP #0,R12
JNE (?0137)
; 491. return (OS_ERR_PEVENT_NULL);
MOV.B #4,R12
; 492. }
RET
?0137:
; 493. if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
MOV.B #4,R13
CMP.B @R12,R13
JEQ (?0139)
; 494. return (OS_ERR_EVENT_TYPE);
MOV.B #1,R12
; 495. }
RET
?0139:
; 496. #endif
; 497. OS_ENTER_CRITICAL();
DINT
; 498. pdata->OSMutexPIP = (INT8U)(pevent->OSEventCnt >> 8);
MOV 2(R12),R13
SWPB R13
AND.B #-1,R13
MOV.B R13,5(R14)
; 499. pdata->OSOwnerPrio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);
MOV 2(R12),R13
AND.B #255,R13
MOV.B R13,4(R14)
; 500. if (pdata->OSOwnerPrio == 0xFF) {
CMP.B #255,4(R14)
JNE (?0141)
; 501. pdata->OSValue = 1;
MOV.B #1,3(R14)
; 502. } else {
JMP (?0142)
?0141:
; 503. pdata->OSValue = 0;
MOV.B #0,3(R14)
?0142:
; 504. }
; 505. pdata->OSEventGrp = pevent->OSEventGrp; /* Copy wait list */
MOV.B 1(R12),2(R14)
; 506. psrc = &pevent->OSEventTbl[0];
ADD #6,R12
; 507. pdest = &pdata->OSEventTbl[0];
MOV R14,R13
; 508. #if OS_EVENT_TBL_SIZE > 0
; 509. *pdest++ = *psrc++;
MOV.B @R12+,0(R13)
ADD #1,R13
; 510. #endif
; 511.
; 512. #if OS_EVENT_TBL_SIZE > 1
; 513. *pdest++ = *psrc++;
MOV.B @R12+,0(R13)
; 514. #endif
; 515.
; 516. #if OS_EVENT_TBL_SIZE > 2
; 517. *pdest++ = *psrc++;
; 518. #endif
; 519.
; 520. #if OS_EVENT_TBL_SIZE > 3
; 521. *pdest++ = *psrc++;
; 522. #endif
; 523.
; 524. #if OS_EVENT_TBL_SIZE > 4
; 525. *pdest++ = *psrc++;
; 526. #endif
; 527.
; 528. #if OS_EVENT_TBL_SIZE > 5
; 529. *pdest++ = *psrc++;
; 530. #endif
; 531.
; 532. #if OS_EVENT_TBL_SIZE > 6
; 533. *pdest++ = *psrc++;
; 534. #endif
; 535.
; 536. #if OS_EVENT_TBL_SIZE > 7
; 537. *pdest = *psrc;
; 538. #endif
; 539. OS_EXIT_CRITICAL();
EINT
; 540. return (OS_NO_ERR);
MOV.B #0,R12
; 541. }
RET
; 542. #endif /* OS_MUTEX_QUERY_EN */
; 543. #endif /* OS_MUTEX_EN */
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -