📄 os_mutex.txt
字号:
;;;230 if (pevent->OSEventGrp != 0x00) { /* See if any tasks waiting on mutex */
;;;231 tasks_waiting = TRUE; /* Yes */
;;;232 } else {
;;;233 tasks_waiting = FALSE; /* No */
;;;234 }
;;;235 switch (opt) {
;;;236 case OS_DEL_NO_PEND: /* Delete mutex only if no task waiting */
;;;237 if (tasks_waiting == FALSE) {
;;;238 pip = (INT8U)(pevent->OSEventCnt >> 8);
;;;239 OSTCBPrioTbl[pip] = (OS_TCB *)0; /* Free up the PIP */
;;;240 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;241 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;242 OSEventFreeList = pevent;
;;;243 OS_EXIT_CRITICAL();
;;;244 *err = OS_NO_ERR;
;;;245 return ((OS_EVENT *)0); /* Mutex has been deleted */
;;;246 } else {
;;;247 OS_EXIT_CRITICAL();
;;;248 *err = OS_ERR_TASK_WAITING;
;;;249 return (pevent);
;;;250 }
;;;251
;;;252 case OS_DEL_ALWAYS: /* Always delete the mutex */
;;;253 while (pevent->OSEventGrp != 0x00) { /* Ready ALL tasks waiting for mutex */
;;;254 OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
;;;255 }
;;;256 pip = (INT8U)(pevent->OSEventCnt >> 8);
;;;257 OSTCBPrioTbl[pip] = (OS_TCB *)0; /* Free up the PIP */
;;;258 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;259 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;260 OSEventFreeList = pevent; /* Get next free event control block */
;;;261 OS_EXIT_CRITICAL();
;;;262 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
;;;263 OS_Sched(); /* Find highest priority task ready to run */
;;;264 }
;;;265 *err = OS_NO_ERR;
;;;266 return ((OS_EVENT *)0); /* Mutex has been deleted */
;;;267
;;;268 default:
;;;269 OS_EXIT_CRITICAL();
;;;270 *err = OS_ERR_INVALID_OPT;
;;;271 return (pevent);
;;;272 }
;;;273 }
|L1.484|
0001e4 e8bd81f0 POP {r4-r8,pc}
|L1.488|
0001e8 e3540000 CMP r4,#0 ;220
0001ec 1a000003 BNE |L1.512| ;220
0001f0 e3a00004 MOV r0,#4 ;221
0001f4 e5c60000 STRB r0,[r6,#0] ;221
0001f8 e3a00000 MOV r0,#0 ;222
0001fc eafffff8 B |L1.484| ;222
|L1.512|
000200 e5d40000 LDRB r0,[r4,#0] ;224
000204 e3500004 CMP r0,#4 ;224
000208 0a000003 BEQ |L1.540| ;224
00020c e3a00001 MOV r0,#1 ;225
000210 e5c60000 STRB r0,[r6,#0] ;225
000214 e1a00004 MOV r0,r4 ;226
000218 eafffff1 B |L1.484| ;226
|L1.540|
00021c ef000002 SVC 0x2 ; formerly SWI ;229
000220 e5d40001 LDRB r0,[r4,#1] ;230
000224 e3500000 CMP r0,#0 ;230
000228 0a000001 BEQ |L1.564| ;230
00022c e3a08001 MOV r8,#1 ;231
000230 ea000000 B |L1.568| ;231
|L1.564|
000234 e3a08000 MOV r8,#0 ;233
|L1.568|
000238 e3550000 CMP r5,#0 ;235
00023c 0a000002 BEQ |L1.588| ;235
000240 e3550001 CMP r5,#1 ;235
000244 1a000032 BNE |L1.788| ;235
000248 ea000016 B |L1.680| ;235
|L1.588|
00024c e1a00000 MOV r0,r0 ;236
000250 e3580000 CMP r8,#0 ;237
000254 1a00000e BNE |L1.660| ;237
000258 e1d400b2 LDRH r0,[r4,#2] ;238
00025c e1a07440 ASR r7,r0,#8 ;238
000260 e3a00000 MOV r0,#0 ;239
000264 e59f161c LDR r1,|L1.2184| ;239
000268 e7810107 STR r0,[r1,r7,LSL #2] ;239
00026c e5c40000 STRB r0,[r4,#0] ;240
000270 e59f0614 LDR r0,|L1.2188| ;241
000274 e5900000 LDR r0,[r0,#0] ;241 ; OSEventFreeList
000278 e5840004 STR r0,[r4,#4] ;241
00027c e59f0608 LDR r0,|L1.2188| ;242
000280 e5804000 STR r4,[r0,#0] ;242 ; OSEventFreeList
000284 ef000003 SVC 0x3 ; formerly SWI ;243
000288 e3a00000 MOV r0,#0 ;244
00028c e5c60000 STRB r0,[r6,#0] ;244
000290 eaffffd3 B |L1.484| ;245
|L1.660|
000294 ef000003 SVC 0x3 ; formerly SWI ;247
000298 e3a00008 MOV r0,#8 ;248
00029c e5c60000 STRB r0,[r6,#0] ;248
0002a0 e1a00004 MOV r0,r4 ;249
0002a4 eaffffce B |L1.484| ;249
|L1.680|
0002a8 e1a00000 MOV r0,r0 ;252
0002ac ea000003 B |L1.704| ;253
|L1.688|
0002b0 e3a02010 MOV r2,#0x10 ;254
0002b4 e3a01000 MOV r1,#0 ;254
0002b8 e1a00004 MOV r0,r4 ;254
0002bc ebfffffe BL OS_EventTaskRdy ;254
|L1.704|
0002c0 e5d40001 LDRB r0,[r4,#1] ;253
0002c4 e3500000 CMP r0,#0 ;253
0002c8 1afffff8 BNE |L1.688| ;253
0002cc e1d400b2 LDRH r0,[r4,#2] ;256
0002d0 e1a07440 ASR r7,r0,#8 ;256
0002d4 e3a00000 MOV r0,#0 ;257
0002d8 e59f15a8 LDR r1,|L1.2184| ;257
0002dc e7810107 STR r0,[r1,r7,LSL #2] ;257
0002e0 e5c40000 STRB r0,[r4,#0] ;258
0002e4 e59f05a0 LDR r0,|L1.2188| ;259
0002e8 e5900000 LDR r0,[r0,#0] ;259 ; OSEventFreeList
0002ec e5840004 STR r0,[r4,#4] ;259
0002f0 e59f0594 LDR r0,|L1.2188| ;260
0002f4 e5804000 STR r4,[r0,#0] ;260 ; OSEventFreeList
0002f8 ef000003 SVC 0x3 ; formerly SWI ;261
0002fc e3580001 CMP r8,#1 ;262
000300 1a000000 BNE |L1.776| ;262
000304 ebfffffe BL OS_Sched ;263
|L1.776|
000308 e3a00000 MOV r0,#0 ;265
00030c e5c60000 STRB r0,[r6,#0] ;265
000310 eaffffb3 B |L1.484| ;266
|L1.788|
000314 e1a00000 MOV r0,r0 ;268
000318 ef000003 SVC 0x3 ; formerly SWI ;269
00031c e3a00007 MOV r0,#7 ;270
000320 e5c60000 STRB r0,[r6,#0] ;270
000324 e1a00004 MOV r0,r4 ;271
000328 eaffffad B |L1.484| ;271
ENDP
OSMutexPend PROC
;;;306 void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;307 {
00032c e92d47f0 PUSH {r4-r10,lr}
000330 e1a04000 MOV r4,r0
000334 e1a05001 MOV r5,r1
000338 e1a06002 MOV r6,r2
;;;308 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;309 OS_CPU_SR cpu_sr;
;;;310 #endif
;;;311 INT8U pip; /* Priority Inheritance Priority (PIP) */
;;;312 INT8U mprio; /* Mutex owner priority */
;;;313 BOOLEAN rdy; /* Flag indicating task was ready */
;;;314 OS_TCB *ptcb;
;;;315
;;;316
;;;317 if (OSIntNesting > 0) { /* See if called from ISR ... */
00033c e59f053c LDR r0,|L1.2176|
000340 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000344 e3500000 CMP r0,#0
000348 da000002 BLE |L1.856|
;;;318 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
00034c e3a00002 MOV r0,#2
000350 e5c60000 STRB r0,[r6,#0]
;;;319 return;
;;;320 }
;;;321 #if OS_ARG_CHK_EN > 0
;;;322 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;323 *err = OS_ERR_PEVENT_NULL;
;;;324 return;
;;;325 }
;;;326 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
;;;327 *err = OS_ERR_EVENT_TYPE;
;;;328 return;
;;;329 }
;;;330 #endif
;;;331 OS_ENTER_CRITICAL(); /* Is Mutex available? */
;;;332 if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
;;;333 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
;;;334 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
;;;335 pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
;;;336 OS_EXIT_CRITICAL();
;;;337 *err = OS_NO_ERR;
;;;338 return;
;;;339 }
;;;340 pip = (INT8U)(pevent->OSEventCnt >> 8); /* No, Get PIP from mutex */
;;;341 mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get priority of mutex owner */
;;;342 ptcb = (OS_TCB *)(pevent->OSEventPtr); /* Point to TCB of mutex owner */
;;;343 if (ptcb->OSTCBPrio != pip && mprio > OSTCBCur->OSTCBPrio) { /* Need to promote prio of owner?*/
;;;344 if ((OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) != 0x00) { /* See if mutex owner is ready */
;;;345 /* Yes, Remove owner from Rdy ...*/
;;;346 /* ... list at current prio */
;;;347 if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) {
;;;348 OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;349 }
;;;350 rdy = TRUE;
;;;351 } else {
;;;352 rdy = FALSE; /* No */
;;;353 }
;;;354 ptcb->OSTCBPrio = pip; /* Change owner task prio to PIP */
;;;355 ptcb->OSTCBY = ptcb->OSTCBPrio >> 3;
;;;356 ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
;;;357 ptcb->OSTCBX = ptcb->OSTCBPrio & 0x07;
;;;358 ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
;;;359 if (rdy == TRUE) { /* If task was ready at owner's priority ...*/
;;;360 OSRdyGrp |= ptcb->OSTCBBitY; /* ... make it ready at new priority. */
;;;361 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;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 }
|L1.852|
000354 e8bd87f0 POP {r4-r10,pc}
|L1.856|
000358 e3540000 CMP r4,#0 ;322
00035c 1a000002 BNE |L1.876| ;322
000360 e3a00004 MOV r0,#4 ;323
000364 e5c60000 STRB r0,[r6,#0] ;323
000368 eafffff9 B |L1.852| ;324
|L1.876|
00036c e5d40000 LDRB r0,[r4,#0] ;326
000370 e3500004 CMP r0,#4 ;326
000374 0a000002 BEQ |L1.900| ;326
000378 e3a00001 MOV r0,#1 ;327
00037c e5c60000 STRB r0,[r6,#0] ;327
000380 eafffff3 B |L1.852| ;328
|L1.900|
000384 ef000002 SVC 0x2 ; formerly SWI ;331
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -