📄 os_mutex.txt
字号:
0001c4 e20220ff AND r2,r2,#0xff
0001c8 e5c0c02f STRB r12,[r0,#0x2f] ;696
0001cc e1a03215 LSL r3,r5,r2
;;;698 ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
0001d0 e1a0cc15 LSL r12,r5,r12
0001d4 e5c03032 STRB r3,[r0,#0x32] ;697
0001d8 e5c0c031 STRB r12,[r0,#0x31]
;;;699 #else
;;;700 ptcb->OSTCBY = (INT8U)((prio >> (INT8U)4) & (INT8U)0x0F);
;;;701 ptcb->OSTCBX = (INT8U) (prio & (INT8U)0x0F);
;;;702 ptcb->OSTCBBitY = (INT16U)(1 << ptcb->OSTCBY);
;;;703 ptcb->OSTCBBitX = (INT16U)(1 << ptcb->OSTCBX);
;;;704 #endif
;;;705 OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready at original priority */
0001dc e5d45000 LDRB r5,[r4,#0] ; OSRdyGrp
0001e0 e1833005 ORR r3,r3,r5
0001e4 e5c43000 STRB r3,[r4,#0] ; OSRdyGrp
;;;706 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0001e8 e7de3002 LDRB r3,[lr,r2]
0001ec e183300c ORR r3,r3,r12
0001f0 e7ce3002 STRB r3,[lr,r2]
;;;707 OSTCBPrioTbl[prio] = ptcb;
0001f4 e59f2550 LDR r2,|L1.1868|
0001f8 e7820101 STR r0,[r2,r1,LSL #2]
;;;708 }
0001fc e8bd4030 POP {r4,r5,lr}
000200 e12fff1e BX lr
;;;709
ENDP
OSMutexDel PROC
;;;258 OS_EVENT *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;259 {
000204 e92d5ff0 PUSH {r4-r12,lr}
000208 e1a04000 MOV r4,r0
;;;260 BOOLEAN tasks_waiting;
;;;261 OS_EVENT *pevent_return;
;;;262 INT8U pip; /* Priority inheritance priority */
;;;263 INT8U prio;
;;;264 OS_TCB *ptcb;
;;;265 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;266 OS_CPU_SR cpu_sr = 0;
;;;267 #endif
;;;268
;;;269
;;;270
;;;271 #if OS_ARG_CHK_EN > 0
;;;272 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;273 return (pevent);
;;;274 }
;;;275 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;276 *perr = OS_ERR_PEVENT_NULL;
;;;277 return (pevent);
;;;278 }
;;;279 #endif
;;;280 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
00020c e5d00000 LDRB r0,[r0,#0]
000210 e1a08001 MOV r8,r1 ;259
000214 e1a05002 MOV r5,r2 ;259
000218 e3500004 CMP r0,#4
;;;281 *perr = OS_ERR_EVENT_TYPE;
00021c 13a00001 MOVNE r0,#1
;;;282 return (pevent);
000220 1a00002d BNE |L1.732|
;;;283 }
;;;284 if (OSIntNesting > 0) { /* See if called from ISR ... */
000224 e59f0518 LDR r0,|L1.1860|
000228 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00022c e3500000 CMP r0,#0
;;;285 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
000230 13a0000f MOVNE r0,#0xf
;;;286 return (pevent);
000234 1a000028 BNE |L1.732|
;;;287 }
;;;288 OS_ENTER_CRITICAL();
000238 ebfffffe BL OS_CPU_SR_Save
00023c e1a07000 MOV r7,r0
;;;289 if (pevent->OSEventGrp != 0) { /* See if any tasks waiting on mutex */
000240 e5d4000a LDRB r0,[r4,#0xa]
;;;290 tasks_waiting = OS_TRUE; /* Yes */
;;;291 } else {
;;;292 tasks_waiting = OS_FALSE; /* No */
;;;293 }
;;;294 switch (opt) {
000244 e59f9500 LDR r9,|L1.1868|
000248 e59fa500 LDR r10,|L1.1872|
00024c e2906000 ADDS r6,r0,#0 ;289
000250 13a06001 MOVNE r6,#1 ;290
000254 e1b00008 MOVS r0,r8
000258 e3a0803f MOV r8,#0x3f
00025c e3a0b000 MOV r11,#0
000260 0a00000b BEQ |L1.660|
000264 e3500001 CMP r0,#1
000268 1a000038 BNE |L1.848|
;;;295 case OS_DEL_NO_PEND: /* DELETE MUTEX ONLY IF NO TASK WAITING --- */
;;;296 if (tasks_waiting == OS_FALSE) {
;;;297 #if OS_EVENT_NAME_SIZE > 1
;;;298 pevent->OSEventName[0] = '?'; /* Unknown name */
;;;299 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;300 #endif
;;;301 pip = (INT8U)(pevent->OSEventCnt >> 8);
;;;302 OSTCBPrioTbl[pip] = (OS_TCB *)0; /* Free up the PIP */
;;;303 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;304 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;305 pevent->OSEventCnt = 0;
;;;306 OSEventFreeList = pevent;
;;;307 OS_EXIT_CRITICAL();
;;;308 *perr = OS_ERR_NONE;
;;;309 pevent_return = (OS_EVENT *)0; /* Mutex has been deleted */
;;;310 } else {
;;;311 OS_EXIT_CRITICAL();
;;;312 *perr = OS_ERR_TASK_WAITING;
;;;313 pevent_return = pevent;
;;;314 }
;;;315 break;
;;;316
;;;317 case OS_DEL_ALWAYS: /* ALWAYS DELETE THE MUTEX ---------------- */
;;;318 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get PIP of mutex */
00026c e1d400b8 LDRH r0,[r4,#8]
000270 e1a02420 LSR r2,r0,#8
;;;319 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original prio */
000274 e20010ff AND r1,r0,#0xff
;;;320 ptcb = (OS_TCB *)pevent->OSEventPtr;
000278 e5940004 LDR r0,[r4,#4]
;;;321 if (ptcb != (OS_TCB *)0) { /* See if any task owns the mutex */
00027c e3500000 CMP r0,#0
000280 0a00001e BEQ |L1.768|
;;;322 if (ptcb->OSTCBPrio == pip) { /* See if original prio was changed */
000284 e5d0302e LDRB r3,[r0,#0x2e]
000288 e1530002 CMP r3,r2
;;;323 OSMutex_RdyAtPrio(ptcb, prio); /* Yes, Restore the task's original prio */
00028c 0bfffffe BLEQ OSMutex_RdyAtPrio
000290 ea00001a B |L1.768|
|L1.660|
000294 e3560000 CMP r6,#0 ;296
000298 1a00000c BNE |L1.720|
00029c e5c4800f STRB r8,[r4,#0xf] ;298
0002a0 e5c4b010 STRB r11,[r4,#0x10] ;299
0002a4 e1d400b8 LDRH r0,[r4,#8] ;301
0002a8 e1a00420 LSR r0,r0,#8 ;301
0002ac e789b100 STR r11,[r9,r0,LSL #2] ;302
0002b0 e5c4b000 STRB r11,[r4,#0] ;303
0002b4 e59a0000 LDR r0,[r10,#0] ;304 ; OSEventFreeList
0002b8 e5840004 STR r0,[r4,#4] ;304
0002bc e1c4b0b8 STRH r11,[r4,#8] ;305
0002c0 e1a00007 MOV r0,r7 ;307
0002c4 e58a4000 STR r4,[r10,#0] ;307 ; OSEventFreeList
0002c8 ebfffffe BL OS_CPU_SR_Restore
0002cc ea00001c B |L1.836|
|L1.720|
0002d0 e1a00007 MOV r0,r7 ;311
0002d4 ebfffffe BL OS_CPU_SR_Restore
0002d8 e3a00049 MOV r0,#0x49 ;312
|L1.732|
;;;324 }
;;;325 }
;;;326 while (pevent->OSEventGrp != 0) { /* Ready ALL tasks waiting for mutex */
;;;327 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX, OS_STAT_PEND_OK);
;;;328 }
;;;329 #if OS_EVENT_NAME_SIZE > 1
;;;330 pevent->OSEventName[0] = '?'; /* Unknown name */
;;;331 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;332 #endif
;;;333 pip = (INT8U)(pevent->OSEventCnt >> 8);
;;;334 OSTCBPrioTbl[pip] = (OS_TCB *)0; /* Free up the PIP */
;;;335 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;336 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;337 pevent->OSEventCnt = 0;
;;;338 OSEventFreeList = pevent; /* Get next free event control block */
;;;339 OS_EXIT_CRITICAL();
;;;340 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
;;;341 OS_Sched(); /* Find highest priority task ready to run */
;;;342 }
;;;343 *perr = OS_ERR_NONE;
;;;344 pevent_return = (OS_EVENT *)0; /* Mutex has been deleted */
;;;345 break;
;;;346
;;;347 default:
;;;348 OS_EXIT_CRITICAL();
;;;349 *perr = OS_ERR_INVALID_OPT;
0002dc e5c50000 STRB r0,[r5,#0]
;;;350 pevent_return = pevent;
0002e0 e1a00004 MOV r0,r4
|L1.740|
0002e4 e8bd5ff0 POP {r4-r12,lr}
;;;351 break;
;;;352 }
;;;353 return (pevent_return);
;;;354 }
0002e8 e12fff1e BX lr
|L1.748|
0002ec e3a03000 MOV r3,#0 ;327
0002f0 e3a02010 MOV r2,#0x10 ;327
0002f4 e1a01003 MOV r1,r3 ;327
0002f8 e1a00004 MOV r0,r4 ;327
0002fc ebfffffe BL OS_EventTaskRdy
|L1.768|
000300 e5d4000a LDRB r0,[r4,#0xa] ;326
000304 e3500000 CMP r0,#0 ;326
000308 1afffff7 BNE |L1.748|
00030c e5c4800f STRB r8,[r4,#0xf] ;330
000310 e5c4b010 STRB r11,[r4,#0x10] ;331
000314 e1d400b8 LDRH r0,[r4,#8] ;333
000318 e1a00420 LSR r0,r0,#8 ;333
00031c e789b100 STR r11,[r9,r0,LSL #2] ;334
000320 e5c4b000 STRB r11,[r4,#0] ;335
000324 e59a0000 LDR r0,[r10,#0] ;336 ; OSEventFreeList
000328 e5840004 STR r0,[r4,#4] ;336
00032c e1c4b0b8 STRH r11,[r4,#8] ;337
000330 e1a00007 MOV r0,r7 ;339
000334 e58a4000 STR r4,[r10,#0] ;339 ; OSEventFreeList
000338 ebfffffe BL OS_CPU_SR_Restore
00033c e3560001 CMP r6,#1 ;340
000340 0bfffffe BLEQ OS_Sched
|L1.836|
000344 e3a00000 MOV r0,#0 ;344
000348 e5c5b000 STRB r11,[r5,#0] ;343
00034c eaffffe4 B |L1.740|
|L1.848|
000350 e1a00007 MOV r0,r7 ;348
000354 ebfffffe BL OS_CPU_SR_Restore
000358 e3a00007 MOV r0,#7 ;349
00035c eaffffde B |L1.732|
;;;355 #endif
ENDP
OSMutexPend PROC
;;;397 void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;398 {
000360 e92d4ff7 PUSH {r0-r2,r4-r11,lr}
000364 e1a05000 MOV r5,r0
;;;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' */
;;;414 return;
;;;415 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -