os_mutex.txt
来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 1,096 行 · 第 1/5 页
TXT
1,096 行
0001e8 2801 CMP r0,#1 ;294
0001ea d154 BNE |L1.662|
0001ec 8920 LDRH r0,[r4,#8] ;318
0001ee 0a02 LSRS r2,r0,#8 ;318
0001f0 b2c1 UXTB r1,r0 ;319
0001f2 6860 LDR r0,[r4,#4] ;320
0001f4 b128 CBZ r0,|L1.514|
0001f6 f890302e LDRB r3,[r0,#0x2e] ;322
0001fa 4293 CMP r3,r2 ;322
0001fc d101 BNE |L1.514|
0001fe f7fffffe BL OSMutex_RdyAtPrio
|L1.514|
000202 7aa0 LDRB r0,[r4,#0xa] ;326
000204 2800 CMP r0,#0 ;326
000206 d02a BEQ |L1.606|
000208 e020 B |L1.588|
|L1.522|
00020a b9be CBNZ r6,|L1.572|
00020c 73e7 STRB r7,[r4,#0xf] ;298
00020e f884a010 STRB r10,[r4,#0x10] ;299
000212 8920 LDRH r0,[r4,#8] ;301
000214 0a00 LSRS r0,r0,#8 ;301
000216 f848a020 STR r10,[r8,r0,LSL #2] ;302
00021a f884a000 STRB r10,[r4,#0] ;303
00021e f8d90000 LDR r0,[r9,#0] ;304 ; OSEventFreeList
000222 6060 STR r0,[r4,#4] ;304
000224 f8a4a008 STRH r10,[r4,#8] ;305
000228 f8c94000 STR r4,[r9,#0] ;306 ; OSEventFreeList
00022c 4658 MOV r0,r11 ;307
00022e f7fffffe BL OS_CPU_SR_Restore
000232 f885a000 STRB r10,[r5,#0] ;308
000236 2000 MOVS r0,#0 ;309
000238 e8bd9ff0 POP {r4-r12,pc}
|L1.572|
00023c 4658 MOV r0,r11 ;311
00023e f7fffffe BL OS_CPU_SR_Restore
000242 2049 MOVS r0,#0x49 ;312
000244 7028 STRB r0,[r5,#0] ;312
000246 4620 MOV r0,r4 ;313
000248 e8bd9ff0 POP {r4-r12,pc}
|L1.588|
00024c 2300 MOVS r3,#0 ;327
00024e 2210 MOVS r2,#0x10 ;327
000250 4619 MOV r1,r3 ;327
000252 4620 MOV r0,r4 ;327
000254 f7fffffe BL OS_EventTaskRdy
000258 7aa0 LDRB r0,[r4,#0xa] ;326
00025a 2800 CMP r0,#0 ;326
00025c d1f6 BNE |L1.588|
|L1.606|
00025e 73e7 STRB r7,[r4,#0xf] ;330
000260 f884a010 STRB r10,[r4,#0x10] ;331
000264 8920 LDRH r0,[r4,#8] ;333
000266 0a00 LSRS r0,r0,#8 ;333
000268 f848a020 STR r10,[r8,r0,LSL #2] ;334
00026c f884a000 STRB r10,[r4,#0] ;335
000270 f8d90000 LDR r0,[r9,#0] ;336 ; OSEventFreeList
000274 6060 STR r0,[r4,#4] ;336
000276 f8a4a008 STRH r10,[r4,#8] ;337
00027a f8c94000 STR r4,[r9,#0] ;338 ; OSEventFreeList
00027e 4658 MOV r0,r11 ;339
000280 f7fffffe BL OS_CPU_SR_Restore
000284 2e01 CMP r6,#1 ;340
000286 d101 BNE |L1.652|
000288 f7fffffe BL OS_Sched
|L1.652|
00028c f885a000 STRB r10,[r5,#0] ;343
000290 2000 MOVS r0,#0 ;344
000292 e8bd9ff0 POP {r4-r12,pc}
|L1.662|
000296 4658 MOV r0,r11 ;348
000298 f7fffffe BL OS_CPU_SR_Restore
00029c 2007 MOVS r0,#7 ;349
00029e 7028 STRB r0,[r5,#0] ;349
0002a0 4620 MOV r0,r4 ;350
0002a2 e8bd9ff0 POP {r4-r12,pc}
;;;355 #endif
ENDP
OSMutexPend PROC
;;;397 void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;398 {
0002a6 e92d4ff7 PUSH {r0-r2,r4-r11,lr}
0002aa b082 SUB sp,sp,#8
0002ac 4605 MOV r5,r0
0002ae 4614 MOV r4,r2
;;;399 INT8U pip; /* Priority Inheritance Priority (PIP) */
;;;400 INT8U mprio; /* Mutex owner priority */
;;;401 BOOLEAN rdy; /* Flag indicating task was ready */
;;;402 OS_TCB *ptcb;
;;;403 OS_EVENT *pevent2;
;;;404 INT8U y;
;;;405 INT8U pend_stat;
;;;406 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;407 OS_CPU_SR cpu_sr = 0;
;;;408 #endif
;;;409
;;;410
;;;411
;;;412 #if OS_ARG_CHK_EN > 0
;;;413 if (perr == (INT8U *)0) { /* Validate 'perr' */
0002b0 2c00 CMP r4,#0
0002b2 d002 BEQ |L1.698|
;;;414 return;
;;;415 }
;;;416 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0002b4 b925 CBNZ r5,|L1.704|
;;;417 *perr = OS_ERR_PEVENT_NULL;
0002b6 2004 MOVS r0,#4
0002b8 7020 STRB r0,[r4,#0]
|L1.698|
;;;418 return;
;;;419 }
;;;420 #endif
;;;421 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
;;;422 *perr = OS_ERR_EVENT_TYPE;
;;;423 return;
;;;424 }
;;;425 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;426 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
;;;427 return;
;;;428 }
;;;429 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;430 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;431 return;
;;;432 }
;;;433 OS_ENTER_CRITICAL();
;;;434 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get PIP from mutex */
;;;435 /* Is Mutex available? */
;;;436 if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
;;;437 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
;;;438 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
;;;439 pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
;;;440 if (OSTCBCur->OSTCBPrio <= pip) { /* PIP 'must' have a SMALLER prio ... */
;;;441 OS_EXIT_CRITICAL(); /* ... than current task! */
;;;442 *perr = OS_ERR_PIP_LOWER;
;;;443 } else {
;;;444 OS_EXIT_CRITICAL();
;;;445 *perr = OS_ERR_NONE;
;;;446 }
;;;447 return;
;;;448 }
;;;449 mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* No, Get priority of mutex owner */
;;;450 ptcb = (OS_TCB *)(pevent->OSEventPtr); /* Point to TCB of mutex owner */
;;;451 if (ptcb->OSTCBPrio > pip) { /* Need to promote prio of owner?*/
;;;452 if (mprio > OSTCBCur->OSTCBPrio) {
;;;453 y = ptcb->OSTCBY;
;;;454 if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0) { /* See if mutex owner is ready */
;;;455 OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
;;;456 if (OSRdyTbl[y] == 0) { /* ... list at current prio */
;;;457 OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;458 }
;;;459 rdy = OS_TRUE;
;;;460 } else {
;;;461 pevent2 = ptcb->OSTCBEventPtr;
;;;462 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
;;;463 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
;;;464 pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
;;;465 }
;;;466 }
;;;467 rdy = OS_FALSE; /* No */
;;;468 }
;;;469 ptcb->OSTCBPrio = pip; /* Change owner task prio to PIP */
;;;470 #if OS_LOWEST_PRIO <= 63
;;;471 ptcb->OSTCBY = (INT8U)( ptcb->OSTCBPrio >> 3);
;;;472 ptcb->OSTCBX = (INT8U)( ptcb->OSTCBPrio & 0x07);
;;;473 ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
;;;474 ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
;;;475 #else
;;;476 ptcb->OSTCBY = (INT8U)((ptcb->OSTCBPrio >> 4) & 0xFF);
;;;477 ptcb->OSTCBX = (INT8U)( ptcb->OSTCBPrio & 0x0F);
;;;478 ptcb->OSTCBBitY = (INT16U)(1 << ptcb->OSTCBY);
;;;479 ptcb->OSTCBBitX = (INT16U)(1 << ptcb->OSTCBX);
;;;480 #endif
;;;481 if (rdy == OS_TRUE) { /* If task was ready at owner's priority ...*/
;;;482 OSRdyGrp |= ptcb->OSTCBBitY; /* ... make it ready at new priority. */
;;;483 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;484 } else {
;;;485 pevent2 = ptcb->OSTCBEventPtr;
;;;486 if (pevent2 != (OS_EVENT *)0) { /* Add to event wait list */
;;;487 pevent2->OSEventGrp |= ptcb->OSTCBBitY;
;;;488 pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;489 }
;;;490 }
;;;491 OSTCBPrioTbl[pip] = ptcb;
;;;492 }
;;;493 }
;;;494 OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /* Mutex not available, pend current task */
;;;495 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
;;;496 OSTCBCur->OSTCBDly = timeout; /* Store timeout in current task's TCB */
;;;497 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;498 OS_EXIT_CRITICAL();
;;;499 OS_Sched(); /* Find next highest priority task ready */
;;;500 OS_ENTER_CRITICAL();
;;;501 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed out during the pend */
;;;502 pend_stat = OSTCBCur->OSTCBStatPend;
;;;503 OS_EventTOAbort(pevent);
;;;504 OS_EXIT_CRITICAL();
;;;505 switch (pend_stat) {
;;;506 case OS_STAT_PEND_TO:
;;;507 default:
;;;508 *perr = OS_ERR_TIMEOUT; /* Indicate that we didn't get mutex within TO */
;;;509 break;
;;;510
;;;511 case OS_STAT_PEND_ABORT:
;;;512 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted getting mutex */
;;;513 break;
;;;514 }
;;;515 return;
;;;516 }
;;;517 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
;;;518 OS_EXIT_CRITICAL();
;;;519 *perr = OS_ERR_NONE;
;;;520 }
0002ba b005 ADD sp,sp,#0x14
0002bc e8bd8ff0 POP {r4-r11,pc}
|L1.704|
0002c0 7828 LDRB r0,[r5,#0] ;421
0002c2 f04f0801 MOV r8,#1 ;421
0002c6 2804 CMP r0,#4 ;421
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?