📄 os_mutex.txt
字号:
000230 e1a00006 MOV r0,r6
000234 ebfffffe BL OS_EventWaitListInit
000238 e3a00000 MOV r0,#0
00023c e5c50000 STRB r0,[r5,#0]
000240 e1a00006 MOV r0,r6
000244 eaffffbb B |L1.312|
ENDP
OSMutex_RdyAtPrio PROC
;;;683 static void OSMutex_RdyAtPrio (OS_TCB *ptcb, INT8U prio)
;;;684 {
000248 e52de004 PUSH {lr}
;;;685 INT8U y;
;;;686
;;;687
;;;688 y = ptcb->OSTCBY; /* Remove owner from ready list at 'pip' */
00024c e5d02030 LDRB r2,[r0,#0x30]
;;;689 OSRdyTbl[y] &= ~ptcb->OSTCBBitX;
000250 e59f3930 LDR r3,|L1.2952|
000254 e7d33002 LDRB r3,[r3,r2]
000258 e5d0c031 LDRB r12,[r0,#0x31]
00025c e1c3300c BIC r3,r3,r12
000260 e59fc920 LDR r12,|L1.2952|
000264 e7cc3002 STRB r3,[r12,r2]
;;;690 if (OSRdyTbl[y] == 0) {
000268 e28c3000 ADD r3,r12,#0
00026c e7d33002 LDRB r3,[r3,r2]
000270 e3530000 CMP r3,#0
000274 1a000005 BNE |L1.656|
;;;691 OSRdyGrp &= ~ptcb->OSTCBBitY;
000278 e5d03032 LDRB r3,[r0,#0x32]
00027c e59fc908 LDR r12,|L1.2956|
000280 e5dcc000 LDRB r12,[r12,#0] ; OSRdyGrp
000284 e1cc3003 BIC r3,r12,r3
000288 e59fc8fc LDR r12,|L1.2956|
00028c e5cc3000 STRB r3,[r12,#0] ; OSRdyGrp
|L1.656|
;;;692 }
;;;693 ptcb->OSTCBPrio = prio;
000290 e5c0102e STRB r1,[r0,#0x2e]
;;;694 #if OS_LOWEST_PRIO <= 63
;;;695 ptcb->OSTCBY = (INT8U)((prio >> (INT8U)3) & (INT8U)0x07);
000294 e3a03007 MOV r3,#7
000298 e00331c1 AND r3,r3,r1,ASR #3
00029c e5c03030 STRB r3,[r0,#0x30]
;;;696 ptcb->OSTCBX = (INT8U) (prio & (INT8U)0x07);
0002a0 e2013007 AND r3,r1,#7
0002a4 e5c0302f STRB r3,[r0,#0x2f]
;;;697 ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
0002a8 e5d03030 LDRB r3,[r0,#0x30]
0002ac e3a0c001 MOV r12,#1
0002b0 e1a0331c LSL r3,r12,r3
0002b4 e5c03032 STRB r3,[r0,#0x32]
;;;698 ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
0002b8 e5d0302f LDRB r3,[r0,#0x2f]
0002bc e1a0331c LSL r3,r12,r3
0002c0 e5c03031 STRB r3,[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 */
0002c4 e5d03032 LDRB r3,[r0,#0x32]
0002c8 e59fc8bc LDR r12,|L1.2956|
0002cc e5dcc000 LDRB r12,[r12,#0] ; OSRdyGrp
0002d0 e183300c ORR r3,r3,r12
0002d4 e59fc8b0 LDR r12,|L1.2956|
0002d8 e5cc3000 STRB r3,[r12,#0] ; OSRdyGrp
;;;706 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0002dc e5d03030 LDRB r3,[r0,#0x30]
0002e0 e59fc8a0 LDR r12,|L1.2952|
0002e4 e7dc3003 LDRB r3,[r12,r3]
0002e8 e5d0c031 LDRB r12,[r0,#0x31]
0002ec e183300c ORR r3,r3,r12
0002f0 e5d0c030 LDRB r12,[r0,#0x30]
0002f4 e59fe88c LDR lr,|L1.2952|
0002f8 e7ce300c STRB r3,[lr,r12]
;;;707 OSTCBPrioTbl[prio] = ptcb;
0002fc e59f387c LDR r3,|L1.2944|
000300 e7830101 STR r0,[r3,r1,LSL #2]
;;;708 }
000304 e49de004 POP {lr}
000308 e12fff1e BX lr
ENDP
OSMutexDel PROC
;;;258 OS_EVENT *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;259 {
00030c e92d4ff8 PUSH {r3-r11,lr}
000310 e1a04000 MOV r4,r0
000314 e1a05001 MOV r5,r1
000318 e1a06002 MOV r6,r2
;;;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;
00031c e3a00000 MOV r0,#0
000320 e58d0000 STR r0,[sp,#0]
;;;267 #endif
;;;268
;;;269
;;;270
;;;271 #if OS_ARG_CHK_EN > 0
;;;272 if (err == (INT8U *)0) { /* Validate 'err' */
000324 e3560000 CMP r6,#0
000328 1a000002 BNE |L1.824|
;;;273 return (pevent);
00032c e1a00004 MOV r0,r4
|L1.816|
000330 e8bd4ff8 POP {r3-r11,lr}
;;;274 }
;;;275 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;276 *err = OS_ERR_PEVENT_NULL;
;;;277 return (pevent);
;;;278 }
;;;279 #endif
;;;280 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
;;;281 *err = OS_ERR_EVENT_TYPE;
;;;282 return (pevent);
;;;283 }
;;;284 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;285 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
;;;286 return (pevent);
;;;287 }
;;;288 OS_ENTER_CRITICAL();
;;;289 if (pevent->OSEventGrp != 0) { /* See if any tasks waiting on mutex */
;;;290 tasks_waiting = OS_TRUE; /* Yes */
;;;291 } else {
;;;292 tasks_waiting = OS_FALSE; /* No */
;;;293 }
;;;294 switch (opt) {
;;;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 *err = OS_ERR_NONE;
;;;309 pevent_return = (OS_EVENT *)0; /* Mutex has been deleted */
;;;310 } else {
;;;311 OS_EXIT_CRITICAL();
;;;312 *err = 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 */
;;;319 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original prio */
;;;320 ptcb = (OS_TCB *)pevent->OSEventPtr;
;;;321 if (ptcb != (OS_TCB *)0) { /* See if any task owns the mutex */
;;;322 if (ptcb->OSTCBPrio == pip) { /* See if original prio was changed */
;;;323 OSMutex_RdyAtPrio(ptcb, prio); /* Yes, Restore the task's original prio */
;;;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 *err = OS_ERR_NONE;
;;;344 pevent_return = (OS_EVENT *)0; /* Mutex has been deleted */
;;;345 break;
;;;346
;;;347 default:
;;;348 OS_EXIT_CRITICAL();
;;;349 *err = OS_ERR_INVALID_OPT;
;;;350 pevent_return = pevent;
;;;351 break;
;;;352 }
;;;353 return (pevent_return);
;;;354 }
000334 e12fff1e BX lr
|L1.824|
000338 e3540000 CMP r4,#0
00033c 1a000003 BNE |L1.848|
000340 e3a00004 MOV r0,#4
000344 e5c60000 STRB r0,[r6,#0]
000348 e1a00004 MOV r0,r4
00034c eafffff7 B |L1.816|
|L1.848|
000350 e5d40000 LDRB r0,[r4,#0]
000354 e3500004 CMP r0,#4
000358 0a000003 BEQ |L1.876|
00035c e3a00001 MOV r0,#1
000360 e5c60000 STRB r0,[r6,#0]
000364 e1a00004 MOV r0,r4
000368 eafffff0 B |L1.816|
|L1.876|
00036c e59f0804 LDR r0,|L1.2936|
000370 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000374 e3500000 CMP r0,#0
000378 da000003 BLE |L1.908|
00037c e3a0000f MOV r0,#0xf
000380 e5c60000 STRB r0,[r6,#0]
000384 e1a00004 MOV r0,r4
000388 eaffffe8 B |L1.816|
|L1.908|
00038c ebfffffe BL OS_CPU_SR_Save
000390 e58d0000 STR r0,[sp,#0]
000394 e5d4000a LDRB r0,[r4,#0xa]
000398 e3500000 CMP r0,#0
00039c 0a000001 BEQ |L1.936|
0003a0 e3a07001 MOV r7,#1
0003a4 ea000000 B |L1.940|
|L1.936|
0003a8 e3a07000 MOV r7,#0
|L1.940|
0003ac e3550000 CMP r5,#0
0003b0 0a000002 BEQ |L1.960|
0003b4 e3550001 CMP r5,#1
0003b8 1a000051 BNE |L1.1284|
0003bc ea00001f B |L1.1088|
|L1.960|
0003c0 e1a00000 MOV r0,r0
0003c4 e3570000 CMP r7,#0
0003c8 1a000016 BNE |L1.1064|
0003cc e3a0003f MOV r0,#0x3f
0003d0 e5c4000f STRB r0,[r4,#0xf]
0003d4 e3a00000 MOV r0,#0
0003d8 e5c40010 STRB r0,[r4,#0x10]
0003dc e1d400b8 LDRH r0,[r4,#8]
0003e0 e1a09440 ASR r9,r0,#8
0003e4 e3a00000 MOV r0,#0
0003e8 e59f1790 LDR r1,|L1.2944|
0003ec e7810109 STR r0,[r1,r9,LSL #2]
0003f0 e5c40000 STRB r0,[r4,#0]
0003f4 e59f0788 LDR r0,|L1.2948|
0003f8 e5900000 LDR r0,[r0,#0] ; OSEventFreeList
0003fc e5840004 STR r0,[r4,#4]
000400 e3a00000 MOV r0,#0
000404 e1c400b8 STRH r0,[r4,#8]
000408 e59f0774 LDR r0,|L1.2948|
00040c e5804000 STR r4,[r0,#0] ; OSEventFreeList
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -