os_sem.txt
来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 811 行 · 第 1/3 页
TXT
811 行
000102 e8bd9ff0 POP {r4-r12,pc}
|L1.262|
000106 2300 MOVS r3,#0 ;220
000108 2201 MOVS r2,#1 ;220
00010a 4619 MOV r1,r3 ;220
00010c 4620 MOV r0,r4 ;220
00010e f7fffffe BL OS_EventTaskRdy
000112 7aa0 LDRB r0,[r4,#0xa] ;219
000114 2800 CMP r0,#0 ;219
000116 d1f6 BNE |L1.262|
|L1.280|
000118 73e7 STRB r7,[r4,#0xf] ;223
00011a f8849010 STRB r9,[r4,#0x10] ;224
00011e f8849000 STRB r9,[r4,#0] ;226
000122 f8d80000 LDR r0,[r8,#0] ;227 ; OSEventFreeList
000126 6060 STR r0,[r4,#4] ;227
000128 f8a49008 STRH r9,[r4,#8] ;228
00012c f8c84000 STR r4,[r8,#0] ;229 ; OSEventFreeList
000130 4650 MOV r0,r10 ;230
000132 f7fffffe BL OS_CPU_SR_Restore
000136 2e01 CMP r6,#1 ;231
000138 d101 BNE |L1.318|
00013a f7fffffe BL OS_Sched
|L1.318|
00013e f8859000 STRB r9,[r5,#0] ;234
000142 2000 MOVS r0,#0 ;235
000144 e8bd9ff0 POP {r4-r12,pc}
|L1.328|
000148 4650 MOV r0,r10 ;239
00014a f7fffffe BL OS_CPU_SR_Restore
00014e 2007 MOVS r0,#7 ;240
000150 7028 STRB r0,[r5,#0] ;240
000152 4620 MOV r0,r4 ;241
000154 e8bd9ff0 POP {r4-r12,pc}
;;;246 #endif
ENDP
OSSemPend PROC
;;;281 void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;282 {
000158 e92d47f0 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|
;;;296 return;
;;;297 }
;;;298 #endif
;;;299 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;300 *perr = OS_ERR_EVENT_TYPE;
;;;301 return;
;;;302 }
;;;303 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;304 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
;;;305 return;
;;;306 }
;;;307 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;308 *perr = 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 *perr = 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 *perr = OS_ERR_TIMEOUT; /* Indicate that didn't get event within TO */
;;;334 break;
;;;335
;;;336 case OS_STAT_PEND_ABORT:
;;;337 *perr = 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 *perr = OS_ERR_NONE;
;;;345 }
00016c e8bd87f0 POP {r4-r10,pc}
|L1.368|
000170 7828 LDRB r0,[r5,#0] ;299
000172 2803 CMP r0,#3 ;299
000174 d003 BEQ |L1.382|
000176 2001 MOVS r0,#1 ;300
000178 7020 STRB r0,[r4,#0] ;300
00017a e8bd87f0 POP {r4-r10,pc}
|L1.382|
00017e 4882 LDR r0,|L1.904|
000180 7800 LDRB r0,[r0,#0] ;303 ; OSIntNesting
000182 b118 CBZ r0,|L1.396|
000184 2002 MOVS r0,#2 ;304
000186 7020 STRB r0,[r4,#0] ;304
000188 e8bd87f0 POP {r4-r10,pc}
|L1.396|
00018c 4880 LDR r0,|L1.912|
00018e 7800 LDRB r0,[r0,#0] ;307 ; OSLockNesting
000190 b118 CBZ r0,|L1.410|
000192 200d MOVS r0,#0xd ;308
000194 7020 STRB r0,[r4,#0] ;308
000196 e8bd87f0 POP {r4-r10,pc}
|L1.410|
00019a f7fffffe BL OS_CPU_SR_Save
00019e 4681 MOV r9,r0 ;311
0001a0 8928 LDRH r0,[r5,#8] ;312
0001a2 2700 MOVS r7,#0 ;312
0001a4 b138 CBZ r0,|L1.438|
0001a6 1e40 SUBS r0,r0,#1 ;313
0001a8 8128 STRH r0,[r5,#8] ;313
0001aa 4648 MOV r0,r9 ;314
0001ac f7fffffe BL OS_CPU_SR_Restore
0001b0 7027 STRB r7,[r4,#0] ;315
0001b2 e8bd87f0 POP {r4-r10,pc}
|L1.438|
0001b6 4e77 LDR r6,|L1.916|
0001b8 6831 LDR r1,[r6,#0] ;319 ; OSTCBCur
0001ba f891002c LDRB r0,[r1,#0x2c] ;319
0001be f0400001 ORR r0,r0,#1 ;319
0001c2 f881002c STRB r0,[r1,#0x2c] ;319
0001c6 f881702d STRB r7,[r1,#0x2d] ;320
0001ca f8a1802a STRH r8,[r1,#0x2a] ;321
0001ce 4628 MOV r0,r5 ;322
0001d0 f7fffffe BL OS_EventTaskWait
0001d4 4648 MOV r0,r9 ;323
0001d6 f7fffffe BL OS_CPU_SR_Restore
0001da f7fffffe BL OS_Sched
0001de f7fffffe BL OS_CPU_SR_Save
0001e2 4680 MOV r8,r0 ;325
0001e4 6831 LDR r1,[r6,#0] ;326 ; OSTCBCur
0001e6 f891602d LDRB r6,[r1,#0x2d] ;326
0001ea b17e CBZ r6,|L1.524|
0001ec 4628 MOV r0,r5 ;328
0001ee f7fffffe BL OS_EventTOAbort
0001f2 4640 MOV r0,r8 ;329
0001f4 f7fffffe BL OS_CPU_SR_Restore
0001f8 2e02 CMP r6,#2 ;330
0001fa d003 BEQ |L1.516|
0001fc 200a MOVS r0,#0xa ;333
0001fe 7020 STRB r0,[r4,#0] ;333
000200 e8bd87f0 POP {r4-r10,pc}
|L1.516|
000204 200e MOVS r0,#0xe ;337
000206 7020 STRB r0,[r4,#0] ;337
000208 e8bd87f0 POP {r4-r10,pc}
|L1.524|
00020c 61cf STR r7,[r1,#0x1c] ;342
00020e 4640 MOV r0,r8 ;343
000210 f7fffffe BL OS_CPU_SR_Restore
000214 7027 STRB r7,[r4,#0] ;344
000216 e8bd87f0 POP {r4-r10,pc}
;;;346
ENDP
OSSemPendAbort PROC
;;;382 INT8U OSSemPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;383 {
00021a e92d41f0 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
;;;394 }
;;;395 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;396 *perr = OS_ERR_PEVENT_NULL;
;;;397 return (0);
;;;398 }
;;;399 #endif
;;;400 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;401 *perr = 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 *perr = OS_ERR_PEND_ABORT;
;;;424 return (nbr_tasks);
;;;425 }
;;;426 OS_EXIT_CRITICAL();
;;;427 *perr = OS_ERR_NONE;
;;;428 return (0); /* No tasks waiting on semaphore */
;;;429 }
000228 e8bd81f0 POP {r4-r8,pc}
|L1.556|
00022c b925 CBNZ r5,|L1.568|
00022e 2004 MOVS r0,#4 ;396
000230 7030 STRB r0,[r6,#0] ;396
000232 2000 MOVS r0,#0 ;397
000234 e8bd81f0 POP {r4-r8,pc}
|L1.568|
000238 7829 LDRB r1,[r5,#0] ;400
00023a 2001 MOVS r0,#1 ;400
00023c 2903 CMP r1,#3 ;400
00023e d003 BEQ |L1.584|
000240 7030 STRB r0,[r6,#0] ;401
000242 2000 MOVS r0,#0 ;402
000244 e8bd81f0 POP {r4-r8,pc}
|L1.584|
000248 f7fffffe BL OS_CPU_SR_Save
00024c 4607 MOV r7,r0 ;404
00024e 7aa8 LDRB r0,[r5,#0xa] ;405
000250 b300 CBZ r0,|L1.660|
000252 2400 MOVS r4,#0 ;406
000254 f1b80f01 CMP r8,#1 ;407
000258 d10b BNE |L1.626|
|L1.602|
00025a 2302 MOVS r3,#2 ;410
00025c 2201 MOVS r2,#1 ;410
00025e 2100 MOVS r1,#0 ;410
000260 4628 MOV r0,r5 ;410
000262 f7fffffe BL OS_EventTaskRdy
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?