📄 os_mutex.txt
字号:
;;;362 }
;;;363 OSTCBPrioTbl[pip] = (OS_TCB *)ptcb;
;;;364 }
;;;365 OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /* Mutex not available, pend current task */
;;;366 OSTCBCur->OSTCBDly = timeout; /* Store timeout in current task's TCB */
;;;367 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;368 OS_EXIT_CRITICAL();
;;;369 OS_Sched(); /* Find next highest priority task ready */
;;;370 OS_ENTER_CRITICAL();
;;;371 if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) { /* Must have timed out if still waiting for event*/
;;;372 OS_EventTO(pevent);
;;;373 OS_EXIT_CRITICAL();
;;;374 *err = OS_TIMEOUT; /* Indicate that we didn't get mutex within TO */
;;;375 return;
;;;376 }
;;;377 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
;;;378 OS_EXIT_CRITICAL();
;;;379 *err = OS_NO_ERR;
;;;380 }
000314 e8bd5ff0 POP {r4-r12,lr}
000318 e12fff1e BX lr
|L1.796|
00031c e3540000 CMP r4,#0 ;322
000320 1a000002 BNE |L1.816|
000324 e3a00004 MOV r0,#4 ;323
000328 e5c50000 STRB r0,[r5,#0] ;323
00032c eafffff8 B |L1.788|
|L1.816|
000330 e5d40000 LDRB r0,[r4,#0] ;326
000334 e3500004 CMP r0,#4 ;326
000338 0a000002 BEQ |L1.840|
00033c e3a00001 MOV r0,#1 ;327
000340 e5c50000 STRB r0,[r5,#0] ;327
000344 eafffff2 B |L1.788|
|L1.840|
000348 ef000002 SVC #0x2 ;331
00034c e1d400b2 LDRH r0,[r4,#2] ;332
000350 e59f6390 LDR r6,|L1.1768|
000354 e3a07000 MOV r7,#0 ;332
000358 e1e01000 MVN r1,r0 ;332
00035c e31100ff TST r1,#0xff ;332
000360 1a00000a BNE |L1.912|
000364 e2000cff AND r0,r0,#0xff00 ;333
000368 e1c400b2 STRH r0,[r4,#2] ;333
00036c e5961000 LDR r1,[r6,#0] ;334 ; OSTCBCur
000370 e5d1102d LDRB r1,[r1,#0x2d] ;334
000374 e1800001 ORR r0,r0,r1 ;334
000378 e1c400b2 STRH r0,[r4,#2] ;334
00037c e5960000 LDR r0,[r6,#0] ;335 ; OSTCBCur
000380 e5840004 STR r0,[r4,#4] ;335
000384 ef000003 SVC #0x3 ;336
000388 e5c57000 STRB r7,[r5,#0] ;337
00038c eaffffe0 B |L1.788|
|L1.912|
000390 e1a01420 LSR r1,r0,#8 ;340
000394 e20020ff AND r2,r0,#0xff ;341
000398 e5940004 LDR r0,[r4,#4] ;342
00039c e5d0302d LDRB r3,[r0,#0x2d] ;343
0003a0 e1530001 CMP r3,r1 ;343
0003a4 0a00002c BEQ |L1.1116|
0003a8 e5963000 LDR r3,[r6,#0] ;343 ; OSTCBCur
0003ac e5d3302d LDRB r3,[r3,#0x2d] ;343
0003b0 e1530002 CMP r3,r2 ;343
0003b4 2a000028 BCS |L1.1116|
0003b8 e5d0c02f LDRB r12,[r0,#0x2f] ;344
0003bc e59fe330 LDR lr,|L1.1780|
0003c0 e5d03030 LDRB r3,[r0,#0x30] ;344
0003c4 e7de200c LDRB r2,[lr,r12] ;344
0003c8 e59f9328 LDR r9,|L1.1784|
0003cc e1120003 TST r2,r3 ;344
0003d0 0a000008 BEQ |L1.1016|
0003d4 e1d22003 BICS r2,r2,r3 ;347
0003d8 e7ce200c STRB r2,[lr,r12] ;347
0003dc 1a000003 BNE |L1.1008|
0003e0 e5d02031 LDRB r2,[r0,#0x31] ;348
0003e4 e5d93000 LDRB r3,[r9,#0] ;348 ; OSRdyGrp
0003e8 e1c32002 BIC r2,r3,r2 ;348
0003ec e5c92000 STRB r2,[r9,#0] ;348 ; OSRdyGrp
|L1.1008|
0003f0 e3a03001 MOV r3,#1 ;350
0003f4 ea000000 B |L1.1020|
|L1.1016|
0003f8 e3a03000 MOV r3,#0 ;352
|L1.1020|
0003fc e5c0102d STRB r1,[r0,#0x2d] ;354
000400 e5d0c02d LDRB r12,[r0,#0x2d] ;355
000404 e1a021ac LSR r2,r12,#3 ;355
000408 e5c0202f STRB r2,[r0,#0x2f] ;355
00040c e5d0202f LDRB r2,[r0,#0x2f] ;356
000410 e59fa2e4 LDR r10,|L1.1788|
000414 e7dab002 LDRB r11,[r10,r2] ;356
000418 e5c0b031 STRB r11,[r0,#0x31] ;356
00041c e20cc007 AND r12,r12,#7 ;357
000420 e5c0c02e STRB r12,[r0,#0x2e] ;357
000424 e7dac00c LDRB r12,[r10,r12] ;358
000428 e5c0c030 STRB r12,[r0,#0x30] ;358
00042c e3530001 CMP r3,#1 ;359
000430 1a000007 BNE |L1.1108|
000434 e5d03031 LDRB r3,[r0,#0x31] ;360
000438 e5d9c000 LDRB r12,[r9,#0] ;360 ; OSRdyGrp
00043c e183300c ORR r3,r3,r12 ;360
000440 e5c93000 STRB r3,[r9,#0] ;360 ; OSRdyGrp
000444 e7de3002 LDRB r3,[lr,r2] ;361
000448 e5d0c030 LDRB r12,[r0,#0x30] ;361
00044c e183300c ORR r3,r3,r12 ;361
000450 e7ce3002 STRB r3,[lr,r2] ;361
|L1.1108|
000454 e59f2290 LDR r2,|L1.1772|
000458 e7820101 STR r0,[r2,r1,LSL #2] ;363
|L1.1116|
00045c e5960000 LDR r0,[r6,#0] ;365 ; OSTCBCur
000460 e5d0102c LDRB r1,[r0,#0x2c] ;365
000464 e3811010 ORR r1,r1,#0x10 ;365
000468 e5c0102c STRB r1,[r0,#0x2c] ;365
00046c e1c082ba STRH r8,[r0,#0x2a] ;366
000470 e1a00004 MOV r0,r4 ;367
000474 ebfffffe BL OS_EventTaskWait
000478 ef000003 SVC #0x3 ;368
00047c ebfffffe BL OS_Sched
000480 ef000002 SVC #0x2 ;370
000484 e5960000 LDR r0,[r6,#0] ;371 ; OSTCBCur
000488 e5d0102c LDRB r1,[r0,#0x2c] ;371
00048c e3110010 TST r1,#0x10 ;371
000490 0a000005 BEQ |L1.1196|
000494 e1a00004 MOV r0,r4 ;372
000498 ebfffffe BL OS_EventTO
00049c ef000003 SVC #0x3 ;373
0004a0 e3a0000a MOV r0,#0xa ;374
0004a4 e5c50000 STRB r0,[r5,#0] ;374
0004a8 eaffff99 B |L1.788|
|L1.1196|
0004ac e580701c STR r7,[r0,#0x1c] ;377
0004b0 ef000003 SVC #0x3 ;378
0004b4 e5c57000 STRB r7,[r5,#0] ;379
0004b8 eaffff95 B |L1.788|
;;;381 /*$PAGE*/
ENDP
OSMutexPost PROC
;;;399 INT8U OSMutexPost (OS_EVENT *pevent)
;;;400 {
0004bc e92d41f0 PUSH {r4-r8,lr}
0004c0 e1a04000 MOV r4,r0
;;;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 ... */
0004c4 e59f0218 LDR r0,|L1.1764|
0004c8 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0004cc e3500000 CMP r0,#0
0004d0 0a000002 BEQ |L1.1248|
;;;409 return (OS_ERR_POST_ISR); /* ... can't POST mutex from an ISR */
0004d4 e3a00005 MOV r0,#5
|L1.1240|
0004d8 e8bd41f0 POP {r4-r8,lr}
;;;410 }
;;;411 #if OS_ARG_CHK_EN > 0
;;;412 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;413 return (OS_ERR_PEVENT_NULL);
;;;414 }
;;;415 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
;;;416 return (OS_ERR_EVENT_TYPE);
;;;417 }
;;;418 #endif
;;;419 OS_ENTER_CRITICAL();
;;;420 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get priority inheritance priority of mutex */
;;;421 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original priority */
;;;422 if (OSTCBCur->OSTCBPrio != pip &&
;;;423 OSTCBCur->OSTCBPrio != prio) { /* See if posting task owns the MUTEX */
;;;424 OS_EXIT_CRITICAL();
;;;425 return (OS_ERR_NOT_MUTEX_OWNER);
;;;426 }
;;;427 if (OSTCBCur->OSTCBPrio == pip) { /* Did we have to raise current task's priority? */
;;;428 /* Yes, Return to original priority */
;;;429 /* Remove owner from ready list at 'pip' */
;;;430 if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
;;;431 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
;;;432 }
;;;433 OSTCBCur->OSTCBPrio = prio;
;;;434 OSTCBCur->OSTCBY = prio >> 3;
;;;435 OSTCBCur->OSTCBBitY = OSMapTbl[OSTCBCur->OSTCBY];
;;;436 OSTCBCur->OSTCBX = prio & 0x07;
;;;437 OSTCBCur->OSTCBBitX = OSMapTbl[OSTCBCur->OSTCBX];
;;;438 OSRdyGrp |= OSTCBCur->OSTCBBitY;
;;;439 OSRdyTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
;;;440 OSTCBPrioTbl[prio] = (OS_TCB *)OSTCBCur;
;;;441 }
;;;442 OSTCBPrioTbl[pip] = (OS_TCB *)1; /* Reserve table entry */
;;;443 if (pevent->OSEventGrp != 0x00) { /* Any task waiting for the mutex? */
;;;444 /* Yes, Make HPT waiting for mutex ready */
;;;445 prio = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
;;;446 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Save priority of mutex's new owner */
;;;447 pevent->OSEventCnt |= prio;
;;;448 pevent->OSEventPtr = OSTCBPrioTbl[prio]; /* Link to mutex owner's OS_TCB */
;;;449 OS_EXIT_CRITICAL();
;;;450 OS_Sched(); /* Find highest priority task ready to run */
;;;451 return (OS_NO_ERR);
;;;452 }
;;;453 pevent->OSEventCnt |= OS_MUTEX_AVAILABLE; /* No, Mutex is now available */
;;;454 pevent->OSEventPtr = (void *)0;
;;;455 OS_EXIT_CRITICAL();
;;;456 return (OS_NO_ERR);
;;;457 }
0004dc e12fff1e BX lr
|L1.1248|
0004e0 e3540000 CMP r4,#0 ;412
0004e4 1a000001 BNE |L1.1264|
0004e8 e3a00004 MOV r0,#4 ;413
0004ec eafffff9 B |L1.1240|
|L1.1264|
0004f0 e5d40000 LDRB r0,[r4,#0] ;415
0004f4 e3500004 CMP r0,#4 ;415
0004f8 0a000001 BEQ |L1.1284|
0004fc e3a00001 MOV r0,#1 ;416
000500 eafffff4 B |L1.1240|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -