📄 os_mutex.txt
字号:
;;;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 */
000168 782e LDRB r6,[r5,#0] ; OSRdyGrp
00016a ea4cea4c ORR r12,r12,r6
00016e f885f885 STRB r12,[r5,#0] ; OSRdyGrp
;;;706 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000172 f814f814 LDRB r12,[r4,r2]
000176 ea4cea4c ORR r3,r12,r3
00017a 54a3 STRB r3,[r4,r2]
;;;707 OSTCBPrioTbl[prio] = ptcb;
00017c 4aa4 LDR r2,|L1.1040|
00017e f842f842 STR r0,[r2,r1,LSL #2]
;;;708 }
000182 bc70 POP {r4-r6}
000184 4770 BX lr
;;;709
ENDP
OSMutexDel PROC
;;;258 OS_EVENT *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;259 {
000186 e92de92d PUSH {r4-r12,lr}
00018a 4604 MOV r4,r0
00018c 460f MOV r7,r1
00018e 4615 MOV r5,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;
;;;267 #endif
;;;268
;;;269
;;;270
;;;271 #if OS_ARG_CHK_EN > 0
;;;272 if (perr == (INT8U *)0) { /* Validate 'perr' */
000190 b915 CBNZ r5,|L1.408|
;;;273 return (pevent);
000192 4620 MOV r0,r4
000194 e8bde8bd POP {r4-r12,pc}
|L1.408|
;;;274 }
;;;275 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000198 b924 CBNZ r4,|L1.420|
;;;276 *perr = OS_ERR_PEVENT_NULL;
00019a 2004 MOVS r0,#4
00019c 7028 STRB r0,[r5,#0]
;;;277 return (pevent);
00019e 4620 MOV r0,r4
0001a0 e8bde8bd POP {r4-r12,pc}
|L1.420|
;;;278 }
;;;279 #endif
;;;280 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
0001a4 7820 LDRB r0,[r4,#0]
0001a6 2804 CMP r0,#4
0001a8 d004 BEQ |L1.436|
;;;281 *perr = OS_ERR_EVENT_TYPE;
0001aa 2001 MOVS r0,#1
0001ac 7028 STRB r0,[r5,#0]
;;;282 return (pevent);
0001ae 4620 MOV r0,r4
0001b0 e8bde8bd POP {r4-r12,pc}
|L1.436|
;;;283 }
;;;284 if (OSIntNesting > 0) { /* See if called from ISR ... */
0001b4 4894 LDR r0,|L1.1032|
0001b6 7800 LDRB r0,[r0,#0] ; OSIntNesting
0001b8 b120 CBZ r0,|L1.452|
;;;285 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
0001ba 200f MOVS r0,#0xf
0001bc 7028 STRB r0,[r5,#0]
;;;286 return (pevent);
0001be 4620 MOV r0,r4
0001c0 e8bde8bd POP {r4-r12,pc}
|L1.452|
;;;287 }
;;;288 OS_ENTER_CRITICAL();
0001c4 f7fff7ff BL OS_CPU_SR_Save
0001c8 4683 MOV r11,r0
;;;289 if (pevent->OSEventGrp != 0) { /* See if any tasks waiting on mutex */
0001ca 7aa0 LDRB r0,[r4,#0xa]
0001cc b108 CBZ r0,|L1.466|
;;;290 tasks_waiting = OS_TRUE; /* Yes */
0001ce 2601 MOVS r6,#1
0001d0 e000 B |L1.468|
|L1.466|
;;;291 } else {
;;;292 tasks_waiting = OS_FALSE; /* No */
0001d2 2600 MOVS r6,#0
|L1.468|
;;;293 }
;;;294 switch (opt) {
0001d4 0038 MOVS r0,r7
0001d6 f8dff8df LDR r8,|L1.1040|
0001da f8dff8df LDR r9,|L1.1044|
0001de f04ff04f MOV r7,#0x3f
0001e2 f04ff04f MOV r10,#0
0001e6 d010 BEQ |L1.522|
0001e8 2801 CMP r0,#1
0001ea d154 BNE |L1.662|
;;;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 */
0001ec 8920 LDRH r0,[r4,#8]
0001ee 0a02 LSRS r2,r0,#8
;;;319 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original prio */
0001f0 b2c1 UXTB r1,r0
;;;320 ptcb = (OS_TCB *)pevent->OSEventPtr;
0001f2 6860 LDR r0,[r4,#4]
;;;321 if (ptcb != (OS_TCB *)0) { /* See if any task owns the mutex */
0001f4 b128 CBZ r0,|L1.514|
0001f6 f890f890 LDRB r3,[r0,#0x2e]
0001fa 4293 CMP r3,r2
;;;322 if (ptcb->OSTCBPrio == pip) { /* See if original prio was changed */
0001fc d101 BNE |L1.514|
0001fe f7fff7ff BL OSMutex_RdyAtPrio
|L1.514|
000202 7aa0 LDRB r0,[r4,#0xa]
000204 2800 CMP r0,#0
000206 d02a BEQ |L1.606|
;;;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 */
000208 e020 B |L1.588|
|L1.522|
00020a b9be CBNZ r6,|L1.572|
00020c 73e7 STRB r7,[r4,#0xf]
00020e f884f884 STRB r10,[r4,#0x10]
000212 8920 LDRH r0,[r4,#8]
000214 0a00 LSRS r0,r0,#8
000216 f848f848 STR r10,[r8,r0,LSL #2]
00021a f884f884 STRB r10,[r4,#0]
00021e f8d9f8d9 LDR r0,[r9,#0] ; OSEventFreeList
000222 6060 STR r0,[r4,#4]
000224 f8a4f8a4 STRH r10,[r4,#8]
000228 f8c9f8c9 STR r4,[r9,#0] ; OSEventFreeList
00022c 4658 MOV r0,r11
00022e f7fff7ff BL OS_CPU_SR_Restore
000232 f885f885 STRB r10,[r5,#0]
000236 2000 MOVS r0,#0
000238 e8bde8bd POP {r4-r12,pc}
|L1.572|
00023c 4658 MOV r0,r11
00023e f7fff7ff BL OS_CPU_SR_Restore
000242 2049 MOVS r0,#0x49
000244 7028 STRB r0,[r5,#0]
000246 4620 MOV r0,r4
000248 e8bde8bd POP {r4-r12,pc}
|L1.588|
00024c 2300 MOVS r3,#0
00024e 2210 MOVS r2,#0x10
000250 4619 MOV r1,r3
000252 4620 MOV r0,r4
000254 f7fff7ff BL OS_EventTaskRdy
000258 7aa0 LDRB r0,[r4,#0xa]
00025a 2800 CMP r0,#0
00025c d1f6 BNE |L1.588|
|L1.606|
;;;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 */
00025e 73e7 STRB r7,[r4,#0xf]
;;;331 pevent->OSEventName[1] = OS_ASCII_NUL;
000260 f884f884 STRB r10,[r4,#0x10]
;;;332 #endif
;;;333 pip = (INT8U)(pevent->OSEventCnt >> 8);
000264 8920 LDRH r0,[r4,#8]
000266 0a00 LSRS r0,r0,#8
;;;334 OSTCBPrioTbl[pip] = (OS_TCB *)0; /* Free up the PIP */
000268 f848f848 STR r10,[r8,r0,LSL #2]
;;;335 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
00026c f884f884 STRB r10,[r4,#0]
;;;336 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
000270 f8d9f8d9 LDR r0,[r9,#0] ; OSEventFreeList
000274 6060 STR r0,[r4,#4]
;;;337 pevent->OSEventCnt = 0;
000276 f8a4f8a4 STRH r10,[r4,#8]
;;;338 OSEventFreeList = pevent; /* Get next free event control block */
00027a f8c9f8c9 STR r4,[r9,#0] ; OSEventFreeList
;;;339 OS_EXIT_CRITICAL();
00027e 4658 MOV r0,r11
000280 f7fff7ff BL OS_CPU_SR_Restore
;;;340 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
000284 2e01 CMP r6,#1
000286 d101 BNE |L1.652|
;;;341 OS_Sched(); /* Find highest priority task ready to run */
000288 f7fff7ff BL OS_Sched
|L1.652|
;;;342 }
;;;343 *perr = OS_ERR_NONE;
00028c f885f885 STRB r10,[r5,#0]
;;;344 pevent_return = (OS_EVENT *)0; /* Mutex has been deleted */
000290 2000 MOVS r0,#0
000292 e8bde8bd POP {r4-r12,pc}
|L1.662|
;;;345 break;
;;;346
;;;347 default:
;;;348 OS_EXIT_CRITICAL();
000296 4658 MOV r0,r11
000298 f7fff7ff BL OS_CPU_SR_Restore
;;;349 *perr = OS_ERR_INVALID_OPT;
00029c 2007 MOVS r0,#7
00029e 7028 STRB r0,[r5,#0]
;;;350 pevent_return = pevent;
0002a0 4620 MOV r0,r4
;;;351 break;
;;;352 }
;;;353 return (pevent_return);
;;;354 }
0002a2 e8bde8bd POP {r4-r12,pc}
;;;355 #endif
ENDP
OSMutexPend PROC
;;;397 void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;398 {
0002a6 e92de92d 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -