📄 os_sem.txt
字号:
;;;229 OSEventFreeList = pevent; /* Get next free event control block */
00012c f8c8f8c8 STR r4,[r8,#0] ; OSEventFreeList
;;;230 OS_EXIT_CRITICAL();
000130 4650 MOV r0,r10
000132 f7fff7ff BL OS_CPU_SR_Restore
;;;231 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
000136 2e01 CMP r6,#1
000138 d101 BNE |L1.318|
;;;232 OS_Sched(); /* Find highest priority task ready to run */
00013a f7fff7ff BL OS_Sched
|L1.318|
;;;233 }
;;;234 *perr = OS_ERR_NONE;
00013e f885f885 STRB r9,[r5,#0]
;;;235 pevent_return = (OS_EVENT *)0; /* Semaphore has been deleted */
000142 2000 MOVS r0,#0
000144 e8bde8bd POP {r4-r12,pc}
|L1.328|
;;;236 break;
;;;237
;;;238 default:
;;;239 OS_EXIT_CRITICAL();
000148 4650 MOV r0,r10
00014a f7fff7ff BL OS_CPU_SR_Restore
;;;240 *perr = OS_ERR_INVALID_OPT;
00014e 2007 MOVS r0,#7
000150 7028 STRB r0,[r5,#0]
;;;241 pevent_return = pevent;
000152 4620 MOV r0,r4
;;;242 break;
;;;243 }
;;;244 return (pevent_return);
;;;245 }
000154 e8bde8bd POP {r4-r12,pc}
;;;246 #endif
ENDP
OSSemPend PROC
;;;281 void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;282 {
000158 e92de92d PUSH {r4-r10,lr}
00015c 4605 MOV r5,r0
00015e 4688 MOV r8,r1
000160 4614 MOV r4,r2
;;;283 INT8U pend_stat;
;;;284 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;285 OS_CPU_SR cpu_sr = 0;
;;;286 #endif
;;;287
;;;288
;;;289
;;;290 #if OS_ARG_CHK_EN > 0
;;;291 if (perr == (INT8U *)0) { /* Validate 'perr' */
000162 2c00 CMP r4,#0
000164 d002 BEQ |L1.364|
;;;292 return;
;;;293 }
;;;294 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000166 b91d CBNZ r5,|L1.368|
;;;295 *perr = OS_ERR_PEVENT_NULL;
000168 2004 MOVS r0,#4
00016a 7020 STRB r0,[r4,#0]
|L1.364|
00016c e8bde8bd POP {r4-r10,pc}
|L1.368|
;;;296 return;
;;;297 }
;;;298 #endif
;;;299 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
000170 7828 LDRB r0,[r5,#0]
000172 2803 CMP r0,#3
000174 d003 BEQ |L1.382|
;;;300 *perr = OS_ERR_EVENT_TYPE;
000176 2001 MOVS r0,#1
000178 7020 STRB r0,[r4,#0]
00017a e8bde8bd POP {r4-r10,pc}
|L1.382|
;;;301 return;
;;;302 }
;;;303 if (OSIntNesting > 0) { /* See if called from ISR ... */
00017e 4882 LDR r0,|L1.904|
000180 7800 LDRB r0,[r0,#0] ; OSIntNesting
000182 b118 CBZ r0,|L1.396|
;;;304 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000184 2002 MOVS r0,#2
000186 7020 STRB r0,[r4,#0]
000188 e8bde8bd POP {r4-r10,pc}
|L1.396|
;;;305 return;
;;;306 }
;;;307 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
00018c 4880 LDR r0,|L1.912|
00018e 7800 LDRB r0,[r0,#0] ; OSLockNesting
000190 b118 CBZ r0,|L1.410|
;;;308 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
000192 200d MOVS r0,#0xd
000194 7020 STRB r0,[r4,#0]
000196 e8bde8bd POP {r4-r10,pc}
|L1.410|
;;;309 return;
;;;310 }
;;;311 OS_ENTER_CRITICAL();
00019a f7fff7ff BL OS_CPU_SR_Save
00019e 4681 MOV r9,r0
;;;312 if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
0001a0 8928 LDRH r0,[r5,#8]
0001a2 2700 MOVS r7,#0
0001a4 b138 CBZ r0,|L1.438|
;;;313 pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
0001a6 1e40 SUBS r0,r0,#1
0001a8 8128 STRH r0,[r5,#8]
;;;314 OS_EXIT_CRITICAL();
0001aa 4648 MOV r0,r9
0001ac f7fff7ff BL OS_CPU_SR_Restore
;;;315 *perr = OS_ERR_NONE;
0001b0 7027 STRB r7,[r4,#0]
0001b2 e8bde8bd POP {r4-r10,pc}
|L1.438|
;;;316 return;
;;;317 }
;;;318 /* Otherwise, must wait until event occurs */
;;;319 OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
0001b6 4e77 LDR r6,|L1.916|
0001b8 6831 LDR r1,[r6,#0] ; OSTCBCur
0001ba f891f891 LDRB r0,[r1,#0x2c]
0001be f040f040 ORR r0,r0,#1
0001c2 f881f881 STRB r0,[r1,#0x2c]
;;;320 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
0001c6 f881f881 STRB r7,[r1,#0x2d]
;;;321 OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
0001ca f8a1f8a1 STRH r8,[r1,#0x2a]
;;;322 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
0001ce 4628 MOV r0,r5
0001d0 f7fff7ff BL OS_EventTaskWait
;;;323 OS_EXIT_CRITICAL();
0001d4 4648 MOV r0,r9
0001d6 f7fff7ff BL OS_CPU_SR_Restore
;;;324 OS_Sched(); /* Find next highest priority task ready */
0001da f7fff7ff BL OS_Sched
;;;325 OS_ENTER_CRITICAL();
0001de f7fff7ff BL OS_CPU_SR_Save
0001e2 4680 MOV r8,r0
;;;326 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed-out or aborted */
0001e4 6831 LDR r1,[r6,#0] ; OSTCBCur
0001e6 f891f891 LDRB r6,[r1,#0x2d]
0001ea b17e CBZ r6,|L1.524|
;;;327 pend_stat = OSTCBCur->OSTCBStatPend;
;;;328 OS_EventTOAbort(pevent);
0001ec 4628 MOV r0,r5
0001ee f7fff7ff BL OS_EventTOAbort
;;;329 OS_EXIT_CRITICAL();
0001f2 4640 MOV r0,r8
0001f4 f7fff7ff BL OS_CPU_SR_Restore
;;;330 switch (pend_stat) {
0001f8 2e02 CMP r6,#2
0001fa d003 BEQ |L1.516|
;;;331 case OS_STAT_PEND_TO:
;;;332 default:
;;;333 *perr = OS_ERR_TIMEOUT; /* Indicate that didn't get event within TO */
0001fc 200a MOVS r0,#0xa
0001fe 7020 STRB r0,[r4,#0]
000200 e8bde8bd POP {r4-r10,pc}
|L1.516|
;;;334 break;
;;;335
;;;336 case OS_STAT_PEND_ABORT:
;;;337 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
000204 200e MOVS r0,#0xe
000206 7020 STRB r0,[r4,#0]
000208 e8bde8bd POP {r4-r10,pc}
|L1.524|
;;;338 break;
;;;339 }
;;;340 return;
;;;341 }
;;;342 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
00020c 61cf STR r7,[r1,#0x1c]
;;;343 OS_EXIT_CRITICAL();
00020e 4640 MOV r0,r8
000210 f7fff7ff BL OS_CPU_SR_Restore
;;;344 *perr = OS_ERR_NONE;
000214 7027 STRB r7,[r4,#0]
;;;345 }
000216 e8bde8bd POP {r4-r10,pc}
;;;346
ENDP
OSSemPendAbort PROC
;;;382 INT8U OSSemPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;383 {
00021a e92de92d PUSH {r4-r8,lr}
00021e 4605 MOV r5,r0
000220 4688 MOV r8,r1
000222 4616 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;
;;;387 #endif
;;;388
;;;389
;;;390
;;;391 #if OS_ARG_CHK_EN > 0
;;;392 if (perr == (INT8U *)0) { /* Validate 'perr' */
000224 b916 CBNZ r6,|L1.556|
;;;393 return (0);
000226 2000 MOVS r0,#0
000228 e8bde8bd POP {r4-r8,pc}
|L1.556|
;;;394 }
;;;395 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
00022c b925 CBNZ r5,|L1.568|
;;;396 *perr = OS_ERR_PEVENT_NULL;
00022e 2004 MOVS r0,#4
000230 7030 STRB r0,[r6,#0]
;;;397 return (0);
000232 2000 MOVS r0,#0
000234 e8bde8bd POP {r4-r8,pc}
|L1.568|
;;;398 }
;;;399 #endif
;;;400 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
000238 7829 LDRB r1,[r5,#0]
00023a 2001 MOVS r0,#1
00023c 2903 CMP r1,#3
00023e d003 BEQ |L1.584|
;;;401 *perr = OS_ERR_EVENT_TYPE;
000240 7030 STRB r0,[r6,#0]
;;;402 return (0);
000242 2000 MOVS r0,#0
000244 e8bde8bd POP {r4-r8,pc}
|L1.584|
;;;403 }
;;;404 OS_ENTER_CRITICAL();
000248 f7fff7ff BL OS_CPU_SR_Save
00024c 4607 MOV r7,r0
;;;405 if (pevent->OSEventGrp != 0) { /* See if any task waiting on semaphore? */
00024e 7aa8 LDRB r0,[r5,#0xa]
000250 b300 CBZ r0,|L1.660|
;;;406 nbr_tasks = 0;
000252 2400 MOVS r4,#0
;;;407 switch (opt) {
000254 f1b8f1b8 CMP r8,#1
000258 d10b BNE |L1.626|
|L1.602|
00025a 2302 MOVS r3,#2
00025c 2201 MOVS r2,#1
00025e 2100 MOVS r1,#0
000260 4628 MOV r0,r5
000262 f7fff7ff BL OS_EventTaskRdy
000266 1c60 ADDS r0,r4,#1
;;;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++;
000268 b2c4 UXTB r4,r0
00026a 7aa9 LDRB r1,[r5,#0xa]
00026c 2900 CMP r1,#0
00026e d1f4 BNE |L1.602|
000270 e006 B |L1.640|
|L1.626|
;;;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);
000272 2302 MOVS r3,#2
000274 2201 MOVS r2,#1
000276 2100 MOVS r1,#0
000278 4628 MOV r0,r5
00027a f7fff7ff BL OS_EventTaskRdy
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -