📄 os_mutex.lst
字号:
\ 00000114 2E23 MOVS R3,#+46
\ 00000116 4707 LSLS R7,R0,#+29
\ 00000118 7F0F LSRS R7,R7,#+29
\ 0000011A CF54 STRB R7,[R1, R3]
380 ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
\ 0000011C CF5C LDRB R7,[R1, R3]
\ 0000011E .... LDR R3,??DataTable50 ;; OSMapTbl
\ 00000120 DB5D LDRB R3,[R3, R7]
\ 00000122 3027 MOVS R7,#+48
\ 00000124 CB55 STRB R3,[R1, R7]
381 if (rdy == TRUE) { /* If task was ready at owner's priority ...*/
\ 00000126 012A CMP R2,#+1
\ 00000128 13D1 BNE ??OSMutexPend_10
382 OSRdyGrp |= ptcb->OSTCBBitY; /* ... make it ready at new priority. */
\ 0000012A .... LDR R2,??DataTable55 ;; OSRdyGrp
\ 0000012C .... LDR R3,??DataTable55 ;; OSRdyGrp
\ 0000012E 1B78 LDRB R3,[R3, #+0]
\ 00000130 3127 MOVS R7,#+49
\ 00000132 CF5D LDRB R7,[R1, R7]
\ 00000134 1F43 ORRS R7,R7,R3
\ 00000136 1770 STRB R7,[R2, #+0]
383 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
\ 00000138 2F22 MOVS R2,#+47
\ 0000013A 8A5C LDRB R2,[R1, R2]
\ 0000013C .... LDR R7,??DataTable58 ;; OSRdyTbl
\ 0000013E 9446 MOV R12,R2
\ 00000140 6346 MOV R3,R12
\ 00000142 .... LDR R2,??DataTable58 ;; OSRdyTbl
\ 00000144 D25C LDRB R2,[R2, R3]
\ 00000146 3023 MOVS R3,#+48
\ 00000148 CB5C LDRB R3,[R1, R3]
\ 0000014A 1343 ORRS R3,R3,R2
\ 0000014C 6246 MOV R2,R12
\ 0000014E BB54 STRB R3,[R7, R2]
\ 00000150 12E0 B ??OSMutexPend_11
384 } else {
385 pevent2 = ptcb->OSTCBEventPtr;
\ ??OSMutexPend_10:
\ 00000152 CA69 LDR R2,[R1, #+28]
386 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
\ 00000154 002A CMP R2,#+0
\ 00000156 0FD0 BEQ ??OSMutexPend_11
387 pevent2->OSEventGrp |= ptcb->OSTCBBitY;
\ 00000158 5378 LDRB R3,[R2, #+1]
\ 0000015A 3127 MOVS R7,#+49
\ 0000015C CF5D LDRB R7,[R1, R7]
\ 0000015E 1F43 ORRS R7,R7,R3
\ 00000160 5770 STRB R7,[R2, #+1]
388 pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
\ 00000162 2F23 MOVS R3,#+47
\ 00000164 CB5C LDRB R3,[R1, R3]
\ 00000166 D318 ADDS R3,R2,R3
\ 00000168 2F27 MOVS R7,#+47
\ 0000016A CF5D LDRB R7,[R1, R7]
\ 0000016C D219 ADDS R2,R2,R7
\ 0000016E 177A LDRB R7,[R2, #+8]
\ 00000170 3022 MOVS R2,#+48
\ 00000172 8A5C LDRB R2,[R1, R2]
\ 00000174 3A43 ORRS R2,R2,R7
\ 00000176 1A72 STRB R2,[R3, #+8]
389 }
390 }
391 OSTCBPrioTbl[pip] = (OS_TCB *)ptcb;
\ ??OSMutexPend_11:
\ 00000178 8000 LSLS R0,R0,#+2
\ 0000017A .... LDR R2,??DataTable63 ;; OSTCBPrioTbl
\ 0000017C 1150 STR R1,[R2, R0]
392 }
393 OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /* Mutex not available, pend current task */
\ ??OSMutexPend_5:
\ 0000017E .... LDR R0,??DataTable49 ;; OSTCBCur
\ 00000180 0068 LDR R0,[R0, #+0]
\ 00000182 2C30 ADDS R0,R0,#+44
\ 00000184 .... LDR R1,??DataTable49 ;; OSTCBCur
\ 00000186 0968 LDR R1,[R1, #+0]
\ 00000188 2C31 ADDS R1,R1,#+44
\ 0000018A 0978 LDRB R1,[R1, #+0]
\ 0000018C 1022 MOVS R2,#+16
\ 0000018E 0A43 ORRS R2,R2,R1
\ 00000190 0270 STRB R2,[R0, #+0]
394 OSTCBCur->OSTCBDly = timeout; /* Store timeout in current task's TCB */
\ 00000192 .... LDR R0,??DataTable49 ;; OSTCBCur
\ 00000194 0068 LDR R0,[R0, #+0]
\ 00000196 6946 MOV R1,SP
\ 00000198 8988 LDRH R1,[R1, #+4]
\ 0000019A 4185 STRH R1,[R0, #+42]
395 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
\ 0000019C 2000 MOVS R0,R4
\ 0000019E ........ _BLF OS_EventTaskWait,??OS_EventTaskWait??rT
396 OS_EXIT_CRITICAL();
\ 000001A2 3000 MOVS R0,R6
\ 000001A4 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
397 OS_Sched(); /* Find next highest priority task ready */
\ 000001A8 ........ _BLF OS_Sched,??OS_Sched??rT
398 OS_ENTER_CRITICAL();
\ 000001AC ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
\ 000001B0 0600 MOVS R6,R0
399 if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) { /* Must have timed out if still waiting for event*/
\ 000001B2 .... LDR R0,??DataTable49 ;; OSTCBCur
\ 000001B4 0068 LDR R0,[R0, #+0]
\ 000001B6 2C30 ADDS R0,R0,#+44
\ 000001B8 0078 LDRB R0,[R0, #+0]
\ 000001BA C006 LSLS R0,R0,#+27
\ 000001BC 07D5 BPL ??OSMutexPend_12
400 OS_EventTO(pevent);
\ 000001BE 2000 MOVS R0,R4
\ 000001C0 ........ _BLF OS_EventTO,??OS_EventTO??rT
401 OS_EXIT_CRITICAL();
\ 000001C4 3000 MOVS R0,R6
\ 000001C6 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
402 *err = OS_TIMEOUT; /* Indicate that we didn't get mutex within TO */
\ 000001CA 0A20 MOVS R0,#+10
\ 000001CC 07E0 B.N ??OSMutexPend_1
403 return;
404 }
405 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
\ ??OSMutexPend_12:
\ 000001CE .... LDR R0,??DataTable49 ;; OSTCBCur
\ 000001D0 0068 LDR R0,[R0, #+0]
\ 000001D2 0021 MOVS R1,#+0
\ 000001D4 C161 STR R1,[R0, #+28]
406 OS_EXIT_CRITICAL();
\ 000001D6 3000 MOVS R0,R6
\ 000001D8 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
407 *err = OS_NO_ERR;
\ 000001DC 0020 MOVS R0,#+0
\ ??OSMutexPend_1:
\ 000001DE 2870 STRB R0,[R5, #+0]
408 }
\ 000001E0 02B0 ADD SP,SP,#+8
\ 000001E2 F0BC POP {R4-R7}
\ 000001E4 01BC POP {R0}
\ 000001E6 0047 BX R0 ;; return
409 /*$PAGE*/
410 /*
411 *********************************************************************************************************
412 * POST TO A MUTUAL EXCLUSION SEMAPHORE
413 *
414 * Description: This function signals a mutual exclusion semaphore
415 *
416 * Arguments : pevent is a pointer to the event control block associated with the desired
417 * mutex.
418 *
419 * Returns : OS_NO_ERR The call was successful and the mutex was signaled.
420 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a mutex
421 * OS_ERR_PEVENT_NULL 'pevent' is a NULL pointer
422 * OS_ERR_POST_ISR Attempted to post from an ISR (not valid for MUTEXes)
423 * OS_ERR_NOT_MUTEX_OWNER The task that did the post is NOT the owner of the MUTEX.
424 *********************************************************************************************************
425 */
426
\ In segment CODE, align 4, keep-with-next
427 INT8U OSMutexPost (OS_EVENT *pevent)
428 {
\ OSMutexPost:
\ 00000000 F0B5 PUSH {R4-R7,LR}
\ 00000002 0400 MOVS R4,R0
429 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
430 OS_CPU_SR cpu_sr;
431 #endif
432 INT8U pip; /* Priority inheritance priority */
433 INT8U prio;
434 INT8U y;
435
436
437 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ 00000004 .... LDR R0,??DataTable64 ;; OSIntNesting
\ 00000006 0078 LDRB R0,[R0, #+0]
\ 00000008 0028 CMP R0,#+0
\ 0000000A 01D0 BEQ ??OSMutexPost_0
438 return (OS_ERR_POST_ISR); /* ... can't POST mutex from an ISR */
\ 0000000C 0520 MOVS R0,#+5
\ 0000000E 9FE0 B ??OSMutexPost_1
439 }
440 #if OS_ARG_CHK_EN > 0
441 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ ??OSMutexPost_0:
\ 00000010 002C CMP R4,#+0
\ 00000012 01D1 BNE ??OSMutexPost_2
442 return (OS_ERR_PEVENT_NULL);
\ 00000014 0420 MOVS R0,#+4
\ 00000016 9BE0 B ??OSMutexPost_1
443 }
444 #endif
445 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
\ ??OSMutexPost_2:
\ 00000018 2078 LDRB R0,[R4, #+0]
\ 0000001A 0428 CMP R0,#+4
\ 0000001C 01D0 BEQ ??OSMutexPost_3
446 return (OS_ERR_EVENT_TYPE);
\ 0000001E 0120 MOVS R0,#+1
\ 00000020 96E0 B ??OSMutexPost_1
447 }
448 OS_ENTER_CRITICAL();
\ ??OSMutexPost_3:
\ 00000022 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
\ 00000026 0500 MOVS R5,R0
449 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get priority inheritance priority of mutex */
\ 00000028 6088
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -