📄 os_mutex.txt
字号:
0001b4 0a000004 BEQ |L1.460|
;;;216 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
0001b8 e3a0008c MOV r0,#0x8c
0001bc e5c50000 STRB r0,[r5,#0]
;;;217 return (pevent);
0001c0 e1a00004 MOV r0,r4
|L1.452|
0001c4 e8bd47f0 POP {r4-r10,lr}
;;;218 }
;;;219 #if OS_ARG_CHK_EN > 0
;;;220 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;221 *err = OS_ERR_PEVENT_NULL;
;;;222 return ((OS_EVENT *)0);
;;;223 }
;;;224 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
;;;225 *err = OS_ERR_EVENT_TYPE;
;;;226 return (pevent);
;;;227 }
;;;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 }
0001c8 e12fff1e BX lr
|L1.460|
0001cc e3540000 CMP r4,#0 ;220
0001d0 1a000003 BNE |L1.484|
0001d4 e3a00004 MOV r0,#4 ;221
0001d8 e5c50000 STRB r0,[r5,#0] ;221
0001dc e3a00000 MOV r0,#0 ;222
0001e0 eafffff7 B |L1.452|
|L1.484|
0001e4 e5d40000 LDRB r0,[r4,#0] ;224
0001e8 e3500004 CMP r0,#4 ;224
0001ec 0a000003 BEQ |L1.512|
0001f0 e3a00001 MOV r0,#1 ;225
0001f4 e5c50000 STRB r0,[r5,#0] ;225
0001f8 e1a00004 MOV r0,r4 ;226
0001fc eafffff0 B |L1.452|
|L1.512|
000200 ef000002 SVC #0x2 ;229
000204 e5d40001 LDRB r0,[r4,#1] ;230
000208 e3500000 CMP r0,#0 ;230
00020c 0a000001 BEQ |L1.536|
000210 e3a06001 MOV r6,#1 ;231
000214 ea000000 B |L1.540|
|L1.536|
000218 e3a06000 MOV r6,#0 ;233
|L1.540|
00021c e59f74c8 LDR r7,|L1.1772|
000220 e59f84c8 LDR r8,|L1.1776|
000224 e35a0000 CMP r10,#0 ;235
000228 e3a09000 MOV r9,#0 ;233
00022c 0a000002 BEQ |L1.572|
000230 e35a0001 CMP r10,#1 ;235
000234 1a000027 BNE |L1.728|
000238 ea000015 B |L1.660|
|L1.572|
00023c e3560000 CMP r6,#0 ;237
000240 1a00000a BNE |L1.624|
000244 e1d400b2 LDRH r0,[r4,#2] ;238
000248 e1a00420 LSR r0,r0,#8 ;238
00024c e7879100 STR r9,[r7,r0,LSL #2] ;239
000250 e5c49000 STRB r9,[r4,#0] ;240
000254 e5980000 LDR r0,[r8,#0] ;241 ; OSEventFreeList
000258 e5840004 STR r0,[r4,#4] ;241
00025c e5884000 STR r4,[r8,#0] ;242 ; OSEventFreeList
000260 ef000003 SVC #0x3 ;243
000264 e5c59000 STRB r9,[r5,#0] ;244
000268 e3a00000 MOV r0,#0 ;245
00026c eaffffd4 B |L1.452|
|L1.624|
000270 ef000003 SVC #0x3 ;247
000274 e3a00008 MOV r0,#8 ;248
000278 e5c50000 STRB r0,[r5,#0] ;248
00027c e1a00004 MOV r0,r4 ;249
000280 eaffffcf B |L1.452|
|L1.644|
000284 e3a02010 MOV r2,#0x10 ;254
000288 e3a01000 MOV r1,#0 ;254
00028c e1a00004 MOV r0,r4 ;254
000290 ebfffffe BL OS_EventTaskRdy
|L1.660|
000294 e5d40001 LDRB r0,[r4,#1] ;253
000298 e3500000 CMP r0,#0 ;253
00029c 1afffff8 BNE |L1.644|
0002a0 e1d400b2 LDRH r0,[r4,#2] ;256
0002a4 e1a00420 LSR r0,r0,#8 ;256
0002a8 e7879100 STR r9,[r7,r0,LSL #2] ;257
0002ac e5c49000 STRB r9,[r4,#0] ;258
0002b0 e5980000 LDR r0,[r8,#0] ;259 ; OSEventFreeList
0002b4 e5840004 STR r0,[r4,#4] ;259
0002b8 e5884000 STR r4,[r8,#0] ;260 ; OSEventFreeList
0002bc ef000003 SVC #0x3 ;261
0002c0 e3560001 CMP r6,#1 ;262
0002c4 1a000000 BNE |L1.716|
0002c8 ebfffffe BL OS_Sched
|L1.716|
0002cc e5c59000 STRB r9,[r5,#0] ;265
0002d0 e3a00000 MOV r0,#0 ;266
0002d4 eaffffba B |L1.452|
|L1.728|
0002d8 ef000003 SVC #0x3 ;269
0002dc e3a00007 MOV r0,#7 ;270
0002e0 e5c50000 STRB r0,[r5,#0] ;270
0002e4 e1a00004 MOV r0,r4 ;271
0002e8 eaffffb5 B |L1.452|
;;;274 #endif
ENDP
OSMutexPend PROC
;;;306 void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;307 {
0002ec e92d5ff0 PUSH {r4-r12,lr}
0002f0 e1a04000 MOV r4,r0
0002f4 e1a08001 MOV r8,r1
0002f8 e1a05002 MOV r5,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 ... */
0002fc e59f03e0 LDR r0,|L1.1764|
000300 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000304 e3500000 CMP r0,#0
000308 0a000003 BEQ |L1.796|
;;;318 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
00030c e3a00002 MOV r0,#2
000310 e5c50000 STRB r0,[r5,#0]
|L1.788|
;;;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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -