📄 os_mutex.txt
字号:
;;;228 #endif
;;;229 OS_ENTER_CRITICAL();
;;;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 }
0001f0 e12fff1e BX lr
|L1.500|
0001f4 e3540000 CMP r4,#0 ;220
0001f8 1a000003 BNE |L1.524| ;220
0001fc e3a00004 MOV r0,#4 ;221
000200 e5c60000 STRB r0,[r6,#0] ;221
000204 e3a00000 MOV r0,#0 ;222
000208 eafffff7 B |L1.492| ;222
|L1.524|
00020c e5d40000 LDRB r0,[r4,#0] ;224
000210 e3500004 CMP r0,#4 ;224
000214 0a000003 BEQ |L1.552| ;224
000218 e3a00001 MOV r0,#1 ;225
00021c e5c60000 STRB r0,[r6,#0] ;225
000220 e1a00004 MOV r0,r4 ;226
000224 eafffff0 B |L1.492| ;226
|L1.552|
000228 ef000002 SVC 0x2 ; formerly SWI ;229
00022c e5d40001 LDRB r0,[r4,#1] ;230
000230 e3500000 CMP r0,#0 ;230
000234 0a000001 BEQ |L1.576| ;230
000238 e3a08001 MOV r8,#1 ;231
00023c ea000000 B |L1.580| ;231
|L1.576|
000240 e3a08000 MOV r8,#0 ;233
|L1.580|
000244 e3550000 CMP r5,#0 ;235
000248 0a000002 BEQ |L1.600| ;235
00024c e3550001 CMP r5,#1 ;235
000250 1a000032 BNE |L1.800| ;235
000254 ea000016 B |L1.692| ;235
|L1.600|
000258 e1a00000 MOV r0,r0 ;236
00025c e3580000 CMP r8,#0 ;237
000260 1a00000e BNE |L1.672| ;237
000264 e1d400b2 LDRH r0,[r4,#2] ;238
000268 e1a07440 ASR r7,r0,#8 ;238
00026c e3a00000 MOV r0,#0 ;239
000270 e59f1628 LDR r1,|L1.2208| ;239
000274 e7810107 STR r0,[r1,r7,LSL #2] ;239
000278 e5c40000 STRB r0,[r4,#0] ;240
00027c e59f0620 LDR r0,|L1.2212| ;241
000280 e5900000 LDR r0,[r0,#0] ;241 ; OSEventFreeList
000284 e5840004 STR r0,[r4,#4] ;241
000288 e59f0614 LDR r0,|L1.2212| ;242
00028c e5804000 STR r4,[r0,#0] ;242 ; OSEventFreeList
000290 ef000003 SVC 0x3 ; formerly SWI ;243
000294 e3a00000 MOV r0,#0 ;244
000298 e5c60000 STRB r0,[r6,#0] ;244
00029c eaffffd2 B |L1.492| ;245
|L1.672|
0002a0 ef000003 SVC 0x3 ; formerly SWI ;247
0002a4 e3a00008 MOV r0,#8 ;248
0002a8 e5c60000 STRB r0,[r6,#0] ;248
0002ac e1a00004 MOV r0,r4 ;249
0002b0 eaffffcd B |L1.492| ;249
|L1.692|
0002b4 e1a00000 MOV r0,r0 ;252
0002b8 ea000003 B |L1.716| ;253
|L1.700|
0002bc e3a02010 MOV r2,#0x10 ;254
0002c0 e3a01000 MOV r1,#0 ;254
0002c4 e1a00004 MOV r0,r4 ;254
0002c8 ebfffffe BL OS_EventTaskRdy ;254
|L1.716|
0002cc e5d40001 LDRB r0,[r4,#1] ;253
0002d0 e3500000 CMP r0,#0 ;253
0002d4 1afffff8 BNE |L1.700| ;253
0002d8 e1d400b2 LDRH r0,[r4,#2] ;256
0002dc e1a07440 ASR r7,r0,#8 ;256
0002e0 e3a00000 MOV r0,#0 ;257
0002e4 e59f15b4 LDR r1,|L1.2208| ;257
0002e8 e7810107 STR r0,[r1,r7,LSL #2] ;257
0002ec e5c40000 STRB r0,[r4,#0] ;258
0002f0 e59f05ac LDR r0,|L1.2212| ;259
0002f4 e5900000 LDR r0,[r0,#0] ;259 ; OSEventFreeList
0002f8 e5840004 STR r0,[r4,#4] ;259
0002fc e59f05a0 LDR r0,|L1.2212| ;260
000300 e5804000 STR r4,[r0,#0] ;260 ; OSEventFreeList
000304 ef000003 SVC 0x3 ; formerly SWI ;261
000308 e3580001 CMP r8,#1 ;262
00030c 1a000000 BNE |L1.788| ;262
000310 ebfffffe BL OS_Sched ;263
|L1.788|
000314 e3a00000 MOV r0,#0 ;265
000318 e5c60000 STRB r0,[r6,#0] ;265
00031c eaffffb2 B |L1.492| ;266
|L1.800|
000320 e1a00000 MOV r0,r0 ;268
000324 ef000003 SVC 0x3 ; formerly SWI ;269
000328 e3a00007 MOV r0,#7 ;270
00032c e5c60000 STRB r0,[r6,#0] ;270
000330 e1a00004 MOV r0,r4 ;271
000334 eaffffac B |L1.492| ;271
ENDP
OSMutexPend PROC
;;;306 void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;307 {
000338 e92d47f0 PUSH {r4-r10,lr}
00033c e1a04000 MOV r4,r0
000340 e1a05001 MOV r5,r1
000344 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 ... */
000348 e59f0548 LDR r0,|L1.2200|
00034c e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000350 e3500000 CMP r0,#0
000354 da000003 BLE |L1.872|
;;;318 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000358 e3a00002 MOV r0,#2
00035c 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.864|
000360 e8bd47f0 POP {r4-r10,lr}
000364 e12fff1e BX lr
|L1.872|
000368 e3540000 CMP r4,#0 ;322
00036c 1a000002 BNE |L1.892| ;322
000370 e3a00004 MOV r0,#4 ;323
000374 e5c60000 STRB r0,[r6,#0] ;323
000378 eafffff8 B |L1.864| ;324
|L1.892|
00037c e5d40000 LDRB r0,[r4,#0] ;326
000380 e3500004 CMP r0,#4 ;326
000384 0a000002 BEQ |L1.916| ;326
000388 e3a00001 MOV r0,#1 ;327
00038c e5c60000 STRB r0,[r6,#0] ;327
000390 eafffff2 B |L1.864| ;328
|L1.916|
000394 ef000002 SVC 0x2 ; formerly SWI ;331
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -