📄 os_sem.txt
字号:
0000e6 e7c5 B |L1.116|
|L1.232|
0000e8 2300 MOVS r3,#0 ;220
0000ea 2201 MOVS r2,#1 ;220
0000ec 4619 MOV r1,r3 ;220
0000ee 4620 MOV r0,r4 ;220
0000f0 f7fff7ff BL OS_EventTaskRdy
|L1.244|
0000f4 7aa0 LDRB r0,[r4,#0xa] ;219
0000f6 2800 CMP r0,#0 ;219
0000f8 d1f6 BNE |L1.232|
0000fa f884f884 STRB r8,[r4,#0xf] ;223
0000fe f884f884 STRB r10,[r4,#0x10] ;224
000102 f884f884 STRB r10,[r4,#0] ;226
000106 f8d9f8d9 LDR r0,[r9,#0] ;227 ; OSEventFreeList
00010a 6060 STR r0,[r4,#4] ;227
00010c f8a4f8a4 STRH r10,[r4,#8] ;228
000110 f8c9f8c9 STR r4,[r9,#0] ;229 ; OSEventFreeList
000114 4638 MOV r0,r7 ;230
000116 f7fff7ff BL OS_CPU_SR_Restore
00011a 2e01 CMP r6,#1 ;231
00011c d101 BNE |L1.290|
00011e f7fff7ff BL OS_Sched
|L1.290|
000122 f885f885 STRB r10,[r5,#0] ;234
000126 2000 MOVS r0,#0 ;235
000128 e7a4 B |L1.116|
|L1.298|
00012a 4638 MOV r0,r7 ;239
00012c f7fff7ff BL OS_CPU_SR_Restore
000130 2007 MOVS r0,#7 ;240
000132 7028 STRB r0,[r5,#0] ;240
000134 4620 MOV r0,r4 ;241
000136 e79d B |L1.116|
;;;246 #endif
ENDP
OSSemPend PROC
;;;281 void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;282 {
000138 e92de92d PUSH {r4-r10,lr}
00013c 4606 MOV r6,r0
00013e 4689 MOV r9,r1
000140 4614 MOV r4,r2
;;;283 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;284 OS_CPU_SR cpu_sr = 0;
;;;285 #endif
;;;286
;;;287
;;;288
;;;289 #if OS_ARG_CHK_EN > 0
;;;290 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;291 return;
;;;292 }
;;;293 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;294 *perr = OS_ERR_PEVENT_NULL;
;;;295 return;
;;;296 }
;;;297 #endif
;;;298 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
000142 7830 LDRB r0,[r6,#0]
000144 2803 CMP r0,#3
000146 d003 BEQ |L1.336|
;;;299 *perr = OS_ERR_EVENT_TYPE;
000148 2001 MOVS r0,#1
00014a 7020 STRB r0,[r4,#0]
|L1.332|
;;;300 return;
;;;301 }
;;;302 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;303 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
;;;304 return;
;;;305 }
;;;306 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;307 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;308 return;
;;;309 }
;;;310 OS_ENTER_CRITICAL();
;;;311 if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
;;;312 pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
;;;313 OS_EXIT_CRITICAL();
;;;314 *perr = OS_ERR_NONE;
;;;315 return;
;;;316 }
;;;317 /* Otherwise, must wait until event occurs */
;;;318 OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
;;;319 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
;;;320 OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
;;;321 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;322 OS_EXIT_CRITICAL();
;;;323 OS_Sched(); /* Find next highest priority task ready */
;;;324 OS_ENTER_CRITICAL();
;;;325 switch (OSTCBCur->OSTCBStatPend) { /* See if we timed-out or aborted */
;;;326 case OS_STAT_PEND_OK:
;;;327 *perr = OS_ERR_NONE;
;;;328 break;
;;;329
;;;330 case OS_STAT_PEND_ABORT:
;;;331 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
;;;332 break;
;;;333
;;;334 case OS_STAT_PEND_TO:
;;;335 default:
;;;336 OS_EventTaskRemove(OSTCBCur, pevent);
;;;337 *perr = OS_ERR_TIMEOUT; /* Indicate that we didn't get event within TO */
;;;338 break;
;;;339 }
;;;340 OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready */
;;;341 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
;;;342 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers */
;;;343 #if (OS_EVENT_MULTI_EN > 0)
;;;344 OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
;;;345 #endif
;;;346 OS_EXIT_CRITICAL();
;;;347 }
00014c e8bde8bd POP {r4-r10,pc}
|L1.336|
000150 4874 LDR r0,|L1.804|
000152 7800 LDRB r0,[r0,#0] ;302 ; OSIntNesting
000154 b110 CBZ r0,|L1.348|
000156 2002 MOVS r0,#2 ;303
000158 7020 STRB r0,[r4,#0] ;303
00015a e7f7 B |L1.332|
|L1.348|
00015c 4873 LDR r0,|L1.812|
00015e 7800 LDRB r0,[r0,#0] ;306 ; OSLockNesting
000160 b110 CBZ r0,|L1.360|
000162 200d MOVS r0,#0xd ;307
000164 7020 STRB r0,[r4,#0] ;307
000166 e7f1 B |L1.332|
|L1.360|
000168 f7fff7ff BL OS_CPU_SR_Save
00016c 4605 MOV r5,r0 ;310
00016e 8930 LDRH r0,[r6,#8] ;311
000170 2700 MOVS r7,#0 ;311
000172 b130 CBZ r0,|L1.386|
000174 1e40 SUBS r0,r0,#1 ;312
000176 8130 STRH r0,[r6,#8] ;312
000178 4628 MOV r0,r5 ;313
00017a f7fff7ff BL OS_CPU_SR_Restore
00017e 7027 STRB r7,[r4,#0] ;314
000180 e7e4 B |L1.332|
|L1.386|
000182 f8dff8df LDR r8,|L1.816|
000186 f8d8f8d8 LDR r1,[r8,#0] ;318 ; OSTCBCur
00018a f811f811 LDRB r0,[r1,#0x30]! ;318
00018e f040f040 ORR r0,r0,#1 ;318
000192 7008 STRB r0,[r1,#0] ;318
000194 704f STRB r7,[r1,#1] ;319
000196 f821f821 STRH r9,[r1,#-2] ;320
00019a 4630 MOV r0,r6 ;321
00019c f7fff7ff BL OS_EventTaskWait
0001a0 4628 MOV r0,r5 ;322
0001a2 f7fff7ff BL OS_CPU_SR_Restore
0001a6 f7fff7ff BL OS_Sched
0001aa f7fff7ff BL OS_CPU_SR_Save
0001ae 4605 MOV r5,r0 ;324
0001b0 f8d8f8d8 LDR r0,[r8,#0] ;325 ; OSTCBCur
0001b4 f890f890 LDRB r1,[r0,#0x31] ;325
0001b8 b121 CBZ r1,|L1.452|
0001ba 2902 CMP r1,#2 ;325
0001bc d104 BNE |L1.456|
0001be 200e MOVS r0,#0xe ;331
0001c0 7020 STRB r0,[r4,#0] ;331
0001c2 e006 B |L1.466|
|L1.452|
0001c4 7027 STRB r7,[r4,#0] ;327
0001c6 e004 B |L1.466|
|L1.456|
0001c8 4631 MOV r1,r6 ;336
0001ca f7fff7ff BL OS_EventTaskRemove
0001ce 200a MOVS r0,#0xa ;337
0001d0 7020 STRB r0,[r4,#0] ;337
|L1.466|
0001d2 f8d8f8d8 LDR r1,[r8,#0] ;340 ; OSTCBCur
0001d6 311c ADDS r1,r1,#0x1c ;340
0001d8 750f STRB r7,[r1,#0x14] ;340
0001da 754f STRB r7,[r1,#0x15] ;341
0001dc 600f STR r7,[r1,#0] ;342
0001de 604f STR r7,[r1,#4] ;344
0001e0 4628 MOV r0,r5 ;346
0001e2 e8bde8bd POP {r4-r10,lr} ;346
0001e6 f7fff7ff B.W OS_CPU_SR_Restore
;;;348
ENDP
OSSemPendAbort PROC
;;;384 INT8U OSSemPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;385 {
0001ea e92de92d PUSH {r4-r8,lr}
0001ee 4605 MOV r5,r0
0001f0 4688 MOV r8,r1
0001f2 4616 MOV r6,r2
;;;386 INT8U nbr_tasks;
;;;387 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;388 OS_CPU_SR cpu_sr = 0;
;;;389 #endif
;;;390
;;;391
;;;392
;;;393 #if OS_ARG_CHK_EN > 0
;;;394 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;395 return (0);
;;;396 }
;;;397 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;398 *perr = OS_ERR_PEVENT_NULL;
;;;399 return (0);
;;;400 }
;;;401 #endif
;;;402 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
0001f4 7829 LDRB r1,[r5,#0]
0001f6 2001 MOVS r0,#1
0001f8 2903 CMP r1,#3
0001fa d003 BEQ |L1.516|
;;;403 *perr = OS_ERR_EVENT_TYPE;
0001fc 7030 STRB r0,[r6,#0]
;;;404 return (0);
0001fe 2000 MOVS r0,#0
|L1.512|
;;;405 }
;;;406 OS_ENTER_CRITICAL();
;;;407 if (pevent->OSEventGrp != 0) { /* See if any task waiting on semaphore? */
;;;408 nbr_tasks = 0;
;;;409 switch (opt) {
;;;410 case OS_PEND_OPT_BROADCAST: /* Do we need to abort ALL waiting tasks? */
;;;411 while (pevent->OSEventGrp != 0) { /* Yes, ready ALL tasks waiting on semaphore */
;;;412 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
;;;413 nbr_tasks++;
;;;414 }
;;;415 break;
;;;416
;;;417 case OS_PEND_OPT_NONE:
;;;418 default: /* No, ready HPT waiting on semaphore */
;;;419 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
;;;420 nbr_tasks++;
;;;421 break;
;;;422 }
;;;423 OS_EXIT_CRITICAL();
;;;424 OS_Sched(); /* Find HPT ready to run */
;;;425 *perr = OS_ERR_PEND_ABORT;
;;;426 return (nbr_tasks);
;;;427 }
;;;428 OS_EXIT_CRITICAL();
;;;429 *perr = OS_ERR_NONE;
;;;430 return (0); /* No tasks waiting on semaphore */
;;;431 }
000200 e8bde8bd POP {r4-r8,pc}
|L1.516|
000204 f7fff7ff BL OS_CPU_SR_Save
000208 4607 MOV r7,r0 ;406
00020a 7aa8 LDRB r0,[r5,#0xa] ;407
00020c b300 CBZ r0,|L1.592|
00020e 2400 MOVS r4,#0 ;408
000210 f1b8f1b8 CMP r8,#1 ;409
000214 d10c BNE |L1.560|
000216 e007 B |L1.552|
|L1.536|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -