os_mutex.txt
来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 1,096 行 · 第 1/5 页
TXT
1,096 行
000104 203f MOVS r0,#0x3f ;208
000106 73e0 STRB r0,[r4,#0xf] ;208
000108 7427 STRB r7,[r4,#0x10] ;209
00010a 4620 MOV r0,r4 ;211
00010c f7fffffe BL OS_EventWaitListInit
000110 702f STRB r7,[r5,#0] ;212
000112 4620 MOV r0,r4 ;213
000114 e8bd81f0 POP {r4-r8,pc}
;;;215
ENDP
OSMutex_RdyAtPrio PROC
;;;683 static void OSMutex_RdyAtPrio (OS_TCB *ptcb, INT8U prio)
;;;684 {
000118 b470 PUSH {r4-r6}
;;;685 INT8U y;
;;;686
;;;687
;;;688 y = ptcb->OSTCBY; /* Remove owner from ready list at 'pip' */
00011a f8902030 LDRB r2,[r0,#0x30]
;;;689 OSRdyTbl[y] &= ~ptcb->OSTCBBitX;
00011e 4cbe LDR r4,|L1.1048|
000120 f890c031 LDRB r12,[r0,#0x31]
000124 5ca3 LDRB r3,[r4,r2]
000126 ea23030c BIC r3,r3,r12
00012a 54a3 STRB r3,[r4,r2]
;;;690 if (OSRdyTbl[y] == 0) {
00012c 5ca2 LDRB r2,[r4,r2]
00012e 4dbb LDR r5,|L1.1052|
000130 b92a CBNZ r2,|L1.318|
;;;691 OSRdyGrp &= ~ptcb->OSTCBBitY;
000132 f8902032 LDRB r2,[r0,#0x32]
000136 782b LDRB r3,[r5,#0] ; OSRdyGrp
000138 ea230202 BIC r2,r3,r2
00013c 702a STRB r2,[r5,#0] ; OSRdyGrp
|L1.318|
;;;692 }
;;;693 ptcb->OSTCBPrio = prio;
00013e f880102e STRB r1,[r0,#0x2e]
;;;694 #if OS_LOWEST_PRIO <= 63
;;;695 ptcb->OSTCBY = (INT8U)((prio >> (INT8U)3) & (INT8U)0x07);
000142 f3c102c2 UBFX r2,r1,#3,#3
000146 f8802030 STRB r2,[r0,#0x30]
;;;696 ptcb->OSTCBX = (INT8U) (prio & (INT8U)0x07);
00014a f0010307 AND r3,r1,#7
00014e f880302f STRB r3,[r0,#0x2f]
;;;697 ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
000152 f8902030 LDRB r2,[r0,#0x30]
000156 2601 MOVS r6,#1
000158 fa06fc02 LSL r12,r6,r2
00015c f880c032 STRB r12,[r0,#0x32]
;;;698 ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
000160 fa06f303 LSL r3,r6,r3
000164 f8803031 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 */
000168 782e LDRB r6,[r5,#0] ; OSRdyGrp
00016a ea4c0c06 ORR r12,r12,r6
00016e f885c000 STRB r12,[r5,#0] ; OSRdyGrp
;;;706 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000172 f814c002 LDRB r12,[r4,r2]
000176 ea4c0303 ORR r3,r12,r3
00017a 54a3 STRB r3,[r4,r2]
;;;707 OSTCBPrioTbl[prio] = ptcb;
00017c 4aa4 LDR r2,|L1.1040|
00017e f8420021 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 e92d5ff0 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
;;;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 */
;;;281 *perr = OS_ERR_EVENT_TYPE;
;;;282 return (pevent);
;;;283 }
;;;284 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;285 *perr = 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 *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 */
;;;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 *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;
;;;350 pevent_return = pevent;
;;;351 break;
;;;352 }
;;;353 return (pevent_return);
;;;354 }
000194 e8bd9ff0 POP {r4-r12,pc}
|L1.408|
000198 b924 CBNZ r4,|L1.420|
00019a 2004 MOVS r0,#4 ;276
00019c 7028 STRB r0,[r5,#0] ;276
00019e 4620 MOV r0,r4 ;277
0001a0 e8bd9ff0 POP {r4-r12,pc}
|L1.420|
0001a4 7820 LDRB r0,[r4,#0] ;280
0001a6 2804 CMP r0,#4 ;280
0001a8 d004 BEQ |L1.436|
0001aa 2001 MOVS r0,#1 ;281
0001ac 7028 STRB r0,[r5,#0] ;281
0001ae 4620 MOV r0,r4 ;282
0001b0 e8bd9ff0 POP {r4-r12,pc}
|L1.436|
0001b4 4894 LDR r0,|L1.1032|
0001b6 7800 LDRB r0,[r0,#0] ;284 ; OSIntNesting
0001b8 b120 CBZ r0,|L1.452|
0001ba 200f MOVS r0,#0xf ;285
0001bc 7028 STRB r0,[r5,#0] ;285
0001be 4620 MOV r0,r4 ;286
0001c0 e8bd9ff0 POP {r4-r12,pc}
|L1.452|
0001c4 f7fffffe BL OS_CPU_SR_Save
0001c8 4683 MOV r11,r0 ;288
0001ca 7aa0 LDRB r0,[r4,#0xa] ;289
0001cc b108 CBZ r0,|L1.466|
0001ce 2601 MOVS r6,#1 ;290
0001d0 e000 B |L1.468|
|L1.466|
0001d2 2600 MOVS r6,#0 ;292
|L1.468|
0001d4 0038 MOVS r0,r7 ;294
0001d6 f8df8238 LDR r8,|L1.1040|
0001da f8df9238 LDR r9,|L1.1044|
0001de f04f073f MOV r7,#0x3f ;294
0001e2 f04f0a00 MOV r10,#0 ;294
0001e6 d010 BEQ |L1.522|
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?