📄 os_sem.txt
字号:
000230 e1a00004 MOV r0,r4
000234 ebfffffe BL OS_EventTaskRdy
|L1.568|
000238 e5d4000a LDRB r0,[r4,#0xa]
00023c e3500000 CMP r0,#0
000240 1afffff7 BNE |L1.548|
000244 e3a0003f MOV r0,#0x3f
000248 e5c4000f STRB r0,[r4,#0xf]
00024c e3a00000 MOV r0,#0
000250 e5c40010 STRB r0,[r4,#0x10]
000254 e5c40000 STRB r0,[r4,#0]
000258 e59f0500 LDR r0,|L1.1888|
00025c e5900000 LDR r0,[r0,#0] ; OSEventFreeList
000260 e5840004 STR r0,[r4,#4]
000264 e3a00000 MOV r0,#0
000268 e1c400b8 STRH r0,[r4,#8]
00026c e59f04ec LDR r0,|L1.1888|
000270 e5804000 STR r4,[r0,#0] ; OSEventFreeList
000274 e1a00009 MOV r0,r9
000278 ebfffffe BL OS_CPU_SR_Restore
00027c e3570001 CMP r7,#1
000280 1a000000 BNE |L1.648|
000284 ebfffffe BL OS_Sched
|L1.648|
000288 e3a00000 MOV r0,#0
00028c e5c60000 STRB r0,[r6,#0]
000290 e3a08000 MOV r8,#0
000294 ea000006 B |L1.692|
|L1.664|
000298 e1a00000 MOV r0,r0
00029c e1a00009 MOV r0,r9
0002a0 ebfffffe BL OS_CPU_SR_Restore
0002a4 e3a00007 MOV r0,#7
0002a8 e5c60000 STRB r0,[r6,#0]
0002ac e1a08004 MOV r8,r4
0002b0 e1a00000 MOV r0,r0
|L1.692|
0002b4 e1a00000 MOV r0,r0
0002b8 e1a00008 MOV r0,r8
0002bc eaffff97 B |L1.288|
ENDP
OSSemPend PROC
;;;281 void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;282 {
0002c0 e92d41f0 PUSH {r4-r8,lr}
0002c4 e1a04000 MOV r4,r0
0002c8 e1a05001 MOV r5,r1
0002cc e1a06002 MOV r6,r2
;;;283 INT8U pend_stat;
;;;284 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;285 OS_CPU_SR cpu_sr = 0;
0002d0 e3a08000 MOV r8,#0
;;;286 #endif
;;;287
;;;288
;;;289
;;;290 #if OS_ARG_CHK_EN > 0
;;;291 if (err == (INT8U *)0) { /* Validate 'err' */
0002d4 e3560000 CMP r6,#0
0002d8 1a000001 BNE |L1.740|
|L1.732|
;;;292 return;
;;;293 }
;;;294 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;295 *err = OS_ERR_PEVENT_NULL;
;;;296 return;
;;;297 }
;;;298 #endif
;;;299 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;300 *err = OS_ERR_EVENT_TYPE;
;;;301 return;
;;;302 }
;;;303 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;304 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
;;;305 return;
;;;306 }
;;;307 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;308 *err = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;309 return;
;;;310 }
;;;311 OS_ENTER_CRITICAL();
;;;312 if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
;;;313 pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
;;;314 OS_EXIT_CRITICAL();
;;;315 *err = OS_ERR_NONE;
;;;316 return;
;;;317 }
;;;318 /* Otherwise, must wait until event occurs */
;;;319 OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
;;;320 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
;;;321 OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
;;;322 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;323 OS_EXIT_CRITICAL();
;;;324 OS_Sched(); /* Find next highest priority task ready */
;;;325 OS_ENTER_CRITICAL();
;;;326 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed-out or aborted */
;;;327 pend_stat = OSTCBCur->OSTCBStatPend;
;;;328 OS_EventTOAbort(pevent);
;;;329 OS_EXIT_CRITICAL();
;;;330 switch (pend_stat) {
;;;331 case OS_STAT_PEND_TO:
;;;332 default:
;;;333 *err = OS_ERR_TIMEOUT; /* Indicate that didn't get event within TO */
;;;334 break;
;;;335
;;;336 case OS_STAT_PEND_ABORT:
;;;337 *err = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
;;;338 break;
;;;339 }
;;;340 return;
;;;341 }
;;;342 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
;;;343 OS_EXIT_CRITICAL();
;;;344 *err = OS_ERR_NONE;
;;;345 }
0002dc e8bd41f0 POP {r4-r8,lr}
0002e0 e12fff1e BX lr
|L1.740|
0002e4 e3540000 CMP r4,#0
0002e8 1a000002 BNE |L1.760|
0002ec e3a00004 MOV r0,#4
0002f0 e5c60000 STRB r0,[r6,#0]
0002f4 eafffff8 B |L1.732|
|L1.760|
0002f8 e5d40000 LDRB r0,[r4,#0]
0002fc e3500003 CMP r0,#3
000300 0a000002 BEQ |L1.784|
000304 e3a00001 MOV r0,#1
000308 e5c60000 STRB r0,[r6,#0]
00030c eafffff2 B |L1.732|
|L1.784|
000310 e59f0444 LDR r0,|L1.1884|
000314 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000318 e3500000 CMP r0,#0
00031c da000002 BLE |L1.812|
000320 e3a00002 MOV r0,#2
000324 e5c60000 STRB r0,[r6,#0]
000328 eaffffeb B |L1.732|
|L1.812|
00032c e59f0430 LDR r0,|L1.1892|
000330 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
000334 e3500000 CMP r0,#0
000338 da000002 BLE |L1.840|
00033c e3a0000d MOV r0,#0xd
000340 e5c60000 STRB r0,[r6,#0]
000344 eaffffe4 B |L1.732|
|L1.840|
000348 ebfffffe BL OS_CPU_SR_Save
00034c e1a08000 MOV r8,r0
000350 e1d400b8 LDRH r0,[r4,#8]
000354 e3500000 CMP r0,#0
000358 da000007 BLE |L1.892|
00035c e1d400b8 LDRH r0,[r4,#8]
000360 e2400001 SUB r0,r0,#1
000364 e1c400b8 STRH r0,[r4,#8]
000368 e1a00008 MOV r0,r8
00036c ebfffffe BL OS_CPU_SR_Restore
000370 e3a00000 MOV r0,#0
000374 e5c60000 STRB r0,[r6,#0]
000378 eaffffd7 B |L1.732|
|L1.892|
00037c e59f03e4 LDR r0,|L1.1896|
000380 e5900000 LDR r0,[r0,#0] ; OSTCBCur
000384 e5d0002c LDRB r0,[r0,#0x2c]
000388 e3800001 ORR r0,r0,#1
00038c e59f13d4 LDR r1,|L1.1896|
000390 e5911000 LDR r1,[r1,#0] ; OSTCBCur
000394 e5c1002c STRB r0,[r1,#0x2c]
000398 e3a00000 MOV r0,#0
00039c e59f13c4 LDR r1,|L1.1896|
0003a0 e5911000 LDR r1,[r1,#0] ; OSTCBCur
0003a4 e5c1002d STRB r0,[r1,#0x2d]
0003a8 e59f03b8 LDR r0,|L1.1896|
0003ac e5900000 LDR r0,[r0,#0] ; OSTCBCur
0003b0 e1c052ba STRH r5,[r0,#0x2a]
0003b4 e1a00004 MOV r0,r4
0003b8 ebfffffe BL OS_EventTaskWait
0003bc e1a00008 MOV r0,r8
0003c0 ebfffffe BL OS_CPU_SR_Restore
0003c4 ebfffffe BL OS_Sched
0003c8 ebfffffe BL OS_CPU_SR_Save
0003cc e1a08000 MOV r8,r0
0003d0 e59f0390 LDR r0,|L1.1896|
0003d4 e5900000 LDR r0,[r0,#0] ; OSTCBCur
0003d8 e5d0002d LDRB r0,[r0,#0x2d]
0003dc e3500000 CMP r0,#0
0003e0 0a000016 BEQ |L1.1088|
0003e4 e59f037c LDR r0,|L1.1896|
0003e8 e5900000 LDR r0,[r0,#0] ; OSTCBCur
0003ec e5d0702d LDRB r7,[r0,#0x2d]
0003f0 e1a00004 MOV r0,r4
0003f4 ebfffffe BL OS_EventTOAbort
0003f8 e1a00008 MOV r0,r8
0003fc ebfffffe BL OS_CPU_SR_Restore
000400 e3570001 CMP r7,#1
000404 0a000002 BEQ |L1.1044|
000408 e3570002 CMP r7,#2
00040c 0a000005 BEQ |L1.1064|
000410 ea000001 B |L1.1052|
|L1.1044|
000414 e1a00000 MOV r0,r0
000418 e1a00000 MOV r0,r0
|L1.1052|
00041c e3a0000a MOV r0,#0xa
000420 e5c60000 STRB r0,[r6,#0]
000424 ea000003 B |L1.1080|
|L1.1064|
000428 e1a00000 MOV r0,r0
00042c e3a0000e MOV r0,#0xe
000430 e5c60000 STRB r0,[r6,#0]
000434 e1a00000 MOV r0,r0
|L1.1080|
000438 e1a00000 MOV r0,r0
00043c eaffffa6 B |L1.732|
|L1.1088|
000440 e3a00000 MOV r0,#0
000444 e59f131c LDR r1,|L1.1896|
000448 e5911000 LDR r1,[r1,#0] ; OSTCBCur
00044c e581001c STR r0,[r1,#0x1c]
000450 e1a00008 MOV r0,r8
000454 ebfffffe BL OS_CPU_SR_Restore
000458 e3a00000 MOV r0,#0
00045c e5c60000 STRB r0,[r6,#0]
000460 eaffff9d B |L1.732|
ENDP
OSSemPendAbort PROC
;;;382 INT8U OSSemPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;383 {
000464 e92d41f0 PUSH {r4-r8,lr}
000468 e1a04000 MOV r4,r0
00046c e1a05001 MOV r5,r1
000470 e1a06002 MOV r6,r2
;;;384 INT8U nbr_tasks;
;;;385 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;386 OS_CPU_SR cpu_sr = 0;
000474 e3a08000 MOV r8,#0
;;;387 #endif
;;;388
;;;389
;;;390
;;;391 #if OS_ARG_CHK_EN > 0
;;;392 if (err == (INT8U *)0) { /* Validate 'err' */
000478 e3560000 CMP r6,#0
00047c 1a000002 BNE |L1.1164|
;;;393 return (0);
000480 e3a00000 MOV r0,#0
|L1.1156|
000484 e8bd41f0 POP {r4-r8,lr}
;;;394 }
;;;395 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;396 *err = OS_ERR_PEVENT_NULL;
;;;397 return (0);
;;;398 }
;;;399 #endif
;;;400 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;401 *err = OS_ERR_EVENT_TYPE;
;;;402 return (0);
;;;403 }
;;;404 OS_ENTER_CRITICAL();
;;;405 if (pevent->OSEventGrp != 0) { /* See if any task waiting on semaphore? */
;;;406 nbr_tasks = 0;
;;;407 switch (opt) {
;;;408 case OS_PEND_OPT_BROADCAST: /* Do we need to abort ALL waiting tasks? */
;;;409 while (pevent->OSEventGrp != 0) { /* Yes, ready ALL tasks waiting on semaphore */
;;;410 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
;;;411 nbr_tasks++;
;;;412 }
;;;413 break;
;;;414
;;;415 case OS_PEND_OPT_NONE: /* No, ready HPT waiting on semaphore */
;;;416 default:
;;;417 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
;;;418 nbr_tasks++;
;;;419 break;
;;;420 }
;;;421 OS_EXIT_CRITICAL();
;;;422 OS_Sched(); /* Find HPT ready to run */
;;;423 *err = OS_ERR_PEND_ABORT;
;;;424 return (nbr_tasks);
;;;425 }
;;;426 OS_EXIT_CRITICAL();
;;;427 *err = OS_ERR_NONE;
;;;428 return (0); /* No tasks waiting on semaphore */
;;;429 }
000488 e12fff1e BX lr
|L1.1164|
00048c e3540000 CMP r4,#0
000490 1a000003 BNE |L1.1188|
000494 e3a00004 MOV r0,#4
000498 e5c60000 STRB r0,[r6,#0]
00049c e3a00000 MOV r0,#0
0004a0 eafffff7 B |L1.1156|
|L1.1188|
0004a4 e5d40000 LDRB r0,[r4,#0]
0004a8 e3500003 CMP r0,#3
0004ac 0a000003 BEQ |L1.1216|
0004b0 e3a00001 MOV r0,#1
0004b4 e5c60000 STRB r0,[r6,#0]
0004b8 e3a00000 MOV r0,#0
0004bc eafffff0 B |L1.1156|
|L1.1216|
0004c0 ebfffffe BL OS_CPU_SR_Save
0004c4 e1a08000 MOV r8,r0
0004c8 e5d4000a LDRB r0,[r4,#0xa]
0004cc e3500000 CMP r0,#0
0004d0 0a000023 BEQ |L1.1380|
0004d4 e3a07000 MOV r7,#0
0004d8 e3550000 CMP r5,#0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -