os_mbox.txt
来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 862 行 · 第 1/3 页
TXT
862 行
000136 d101 BNE |L1.316|
000138 f7fffffe BL OS_Sched
|L1.316|
00013c f8859000 STRB r9,[r5,#0] ;226
000140 2000 MOVS r0,#0 ;227
000142 e8bd9ff0 POP {r4-r12,pc}
|L1.326|
000146 4650 MOV r0,r10 ;231
000148 f7fffffe BL OS_CPU_SR_Restore
00014c 2007 MOVS r0,#7 ;232
00014e 7028 STRB r0,[r5,#0] ;232
000150 4620 MOV r0,r4 ;233
000152 e8bd9ff0 POP {r4-r12,pc}
;;;238 #endif
ENDP
OSMboxPend PROC
;;;274 void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;275 {
000156 e92d47f0 PUSH {r4-r10,lr}
00015a 4605 MOV r5,r0
00015c 4688 MOV r8,r1
00015e 4614 MOV r4,r2
;;;276 void *pmsg;
;;;277 INT8U pend_stat;
;;;278 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;279 OS_CPU_SR cpu_sr = 0;
;;;280 #endif
;;;281
;;;282
;;;283
;;;284 #if OS_ARG_CHK_EN > 0
;;;285 if (perr == (INT8U *)0) { /* Validate 'perr' */
000160 b914 CBNZ r4,|L1.360|
;;;286 return ((void *)0);
000162 2000 MOVS r0,#0
;;;287 }
;;;288 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;289 *perr = OS_ERR_PEVENT_NULL;
;;;290 return ((void *)0);
;;;291 }
;;;292 #endif
;;;293 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
;;;294 *perr = OS_ERR_EVENT_TYPE;
;;;295 return ((void *)0);
;;;296 }
;;;297 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;298 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
;;;299 return ((void *)0);
;;;300 }
;;;301 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;302 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;303 return ((void *)0);
;;;304 }
;;;305 OS_ENTER_CRITICAL();
;;;306 pmsg = pevent->OSEventPtr;
;;;307 if (pmsg != (void *)0) { /* See if there is already a message */
;;;308 pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
;;;309 OS_EXIT_CRITICAL();
;;;310 *perr = OS_ERR_NONE;
;;;311 return (pmsg); /* Return the message received (or NULL) */
;;;312 }
;;;313 OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
;;;314 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
;;;315 OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
;;;316 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;317 OS_EXIT_CRITICAL();
;;;318 OS_Sched(); /* Find next highest priority task ready to run */
;;;319 OS_ENTER_CRITICAL();
;;;320 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we weren't given the message */
;;;321 pend_stat = OSTCBCur->OSTCBStatPend;
;;;322 OS_EventTOAbort(pevent); /* Timed out, Make task ready */
;;;323 OS_EXIT_CRITICAL();
;;;324 switch (pend_stat) {
;;;325 case OS_STAT_PEND_TO:
;;;326 default:
;;;327 *perr = OS_ERR_TIMEOUT; /* Indicate that a timeout occured */
;;;328 break;
;;;329
;;;330 case OS_STAT_PEND_ABORT:
;;;331 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
;;;332 break;
;;;333 }
;;;334 return ((void *)0); /* Return a NULL message */
;;;335 }
;;;336 pmsg = OSTCBCur->OSTCBMsg;
;;;337 OSTCBCur->OSTCBMsg = (void *)0; /* Yes, clear message received */
;;;338 OSTCBCur->OSTCBStat = OS_STAT_RDY;
;;;339 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
;;;340 OS_EXIT_CRITICAL();
;;;341 *perr = OS_ERR_NONE;
;;;342 return (pmsg); /* Return the message received */
;;;343 }
000164 e8bd87f0 POP {r4-r10,pc}
|L1.360|
000168 b925 CBNZ r5,|L1.372|
00016a 2004 MOVS r0,#4 ;289
00016c 7020 STRB r0,[r4,#0] ;289
00016e 2000 MOVS r0,#0 ;290
000170 e8bd87f0 POP {r4-r10,pc}
|L1.372|
000174 7828 LDRB r0,[r5,#0] ;293
000176 2801 CMP r0,#1 ;293
000178 d004 BEQ |L1.388|
00017a 2001 MOVS r0,#1 ;294
00017c 7020 STRB r0,[r4,#0] ;294
00017e 2000 MOVS r0,#0 ;295
000180 e8bd87f0 POP {r4-r10,pc}
|L1.388|
000184 4897 LDR r0,|L1.996|
000186 7800 LDRB r0,[r0,#0] ;297 ; OSIntNesting
000188 b120 CBZ r0,|L1.404|
00018a 2002 MOVS r0,#2 ;298
00018c 7020 STRB r0,[r4,#0] ;298
00018e 2000 MOVS r0,#0 ;299
000190 e8bd87f0 POP {r4-r10,pc}
|L1.404|
000194 4895 LDR r0,|L1.1004|
000196 7800 LDRB r0,[r0,#0] ;301 ; OSLockNesting
000198 b120 CBZ r0,|L1.420|
00019a 200d MOVS r0,#0xd ;302
00019c 7020 STRB r0,[r4,#0] ;302
00019e 2000 MOVS r0,#0 ;303
0001a0 e8bd87f0 POP {r4-r10,pc}
|L1.420|
0001a4 f7fffffe BL OS_CPU_SR_Save
0001a8 4681 MOV r9,r0 ;305
0001aa 686e LDR r6,[r5,#4] ;306
0001ac 2700 MOVS r7,#0 ;307
0001ae b13e CBZ r6,|L1.448|
0001b0 606f STR r7,[r5,#4] ;308
0001b2 4648 MOV r0,r9 ;309
0001b4 f7fffffe BL OS_CPU_SR_Restore
0001b8 7027 STRB r7,[r4,#0] ;310
0001ba 4630 MOV r0,r6 ;311
0001bc e8bd87f0 POP {r4-r10,pc}
|L1.448|
0001c0 4e8b LDR r6,|L1.1008|
0001c2 6831 LDR r1,[r6,#0] ;313 ; OSTCBCur
0001c4 f891002c LDRB r0,[r1,#0x2c] ;313
0001c8 f0400002 ORR r0,r0,#2 ;313
0001cc f881002c STRB r0,[r1,#0x2c] ;313
0001d0 f881702d STRB r7,[r1,#0x2d] ;314
0001d4 f8a1802a STRH r8,[r1,#0x2a] ;315
0001d8 4628 MOV r0,r5 ;316
0001da f7fffffe BL OS_EventTaskWait
0001de 4648 MOV r0,r9 ;317
0001e0 f7fffffe BL OS_CPU_SR_Restore
0001e4 f7fffffe BL OS_Sched
0001e8 f7fffffe BL OS_CPU_SR_Save
0001ec 4680 MOV r8,r0 ;319
0001ee 6831 LDR r1,[r6,#0] ;320 ; OSTCBCur
0001f0 f891602d LDRB r6,[r1,#0x2d] ;320
0001f4 b17e CBZ r6,|L1.534|
0001f6 4628 MOV r0,r5 ;322
0001f8 f7fffffe BL OS_EventTOAbort
0001fc 4640 MOV r0,r8 ;323
0001fe f7fffffe BL OS_CPU_SR_Restore
000202 2e02 CMP r6,#2 ;324
000204 d002 BEQ |L1.524|
000206 200a MOVS r0,#0xa ;327
000208 7020 STRB r0,[r4,#0] ;327
00020a e001 B |L1.528|
|L1.524|
00020c 200e MOVS r0,#0xe ;331
00020e 7020 STRB r0,[r4,#0] ;331
|L1.528|
000210 2000 MOVS r0,#0 ;334
000212 e8bd87f0 POP {r4-r10,pc}
|L1.534|
000216 6a0d LDR r5,[r1,#0x20] ;336
000218 620f STR r7,[r1,#0x20] ;337
00021a f881702c STRB r7,[r1,#0x2c] ;338
00021e 61cf STR r7,[r1,#0x1c] ;339
000220 4640 MOV r0,r8 ;340
000222 f7fffffe BL OS_CPU_SR_Restore
000226 7027 STRB r7,[r4,#0] ;341
000228 4628 MOV r0,r5 ;342
00022a e8bd87f0 POP {r4-r10,pc}
;;;344 /*$PAGE*/
ENDP
OSMboxPendAbort PROC
;;;378 INT8U OSMboxPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;379 {
00022e e92d41f0 PUSH {r4-r8,lr}
000232 4605 MOV r5,r0
000234 4688 MOV r8,r1
000236 4616 MOV r6,r2
;;;380 INT8U nbr_tasks;
;;;381 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;382 OS_CPU_SR cpu_sr = 0;
;;;383 #endif
;;;384
;;;385
;;;386
;;;387 #if OS_ARG_CHK_EN > 0
;;;388 if (perr == (INT8U *)0) { /* Validate 'perr' */
000238 b916 CBNZ r6,|L1.576|
;;;389 return (0);
00023a 2000 MOVS r0,#0
;;;390 }
;;;391 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;392 *perr = OS_ERR_PEVENT_NULL;
;;;393 return (0);
;;;394 }
;;;395 #endif
;;;396 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
;;;397 *perr = OS_ERR_EVENT_TYPE;
;;;398 return (0);
;;;399 }
;;;400 OS_ENTER_CRITICAL();
;;;401 if (pevent->OSEventGrp != 0) { /* See if any task waiting on mailbox? */
;;;402 nbr_tasks = 0;
;;;403 switch (opt) {
;;;404 case OS_PEND_OPT_BROADCAST: /* Do we need to abort ALL waiting tasks? */
;;;405 while (pevent->OSEventGrp != 0) { /* Yes, ready ALL tasks waiting on mailbox */
;;;406 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
;;;407 nbr_tasks++;
;;;408 }
;;;409 break;
;;;410
;;;411 case OS_PEND_OPT_NONE: /* No, ready HPT waiting on mailbox */
;;;412 default:
;;;413 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
;;;414 nbr_tasks++;
;;;415 break;
;;;416 }
;;;417 OS_EXIT_CRITICAL();
;;;418 OS_Sched(); /* Find HPT ready to run */
;;;419 *perr = OS_ERR_PEND_ABORT;
;;;420 return (nbr_tasks);
;;;421 }
;;;422 OS_EXIT_CRITICAL();
;;;423 *perr = OS_ERR_NONE;
;;;424 return (0); /* No tasks waiting on mailbox */
;;;425 }
00023c e8bd81f0 POP {r4-r8,pc}
|L1.576|
000240 b925 CBNZ r5,|L1.588|
000242 2004 MOVS r0,#4 ;392
000244 7030 STRB r0,[r6,#0] ;392
000246 2000 MOVS r0,#0 ;393
000248 e8bd81f0 POP {r4-r8,pc}
|L1.588|
00024c 7829 LDRB r1,[r5,#0] ;396
00024e 2001 MOVS r0,#1 ;396
000250 2901 CMP r1,#1 ;396
000252 d003 BEQ |L1.604|
000254 7030 STRB r0,[r6,#0] ;397
000256 2000 MOVS r0,#0 ;398
000258 e8bd81f0 POP {r4-r8,pc}
|L1.604|
00025c f7fffffe BL OS_CPU_SR_Save
000260 4607 MOV r7,r0 ;400
000262 7aa8 LDRB r0,[r5,#0xa] ;401
000264 b300 CBZ r0,|L1.680|
000266 2400 MOVS r4,#0 ;402
000268 f1b80f01 CMP r8,#1 ;403
00026c d10b BNE |L1.646|
|L1.622|
00026e 2302 MOVS r3,#2 ;406
000270 461a MOV r2,r3 ;406
000272 2100 MOVS r1,#0 ;406
000274 4628 MOV r0,r5 ;406
000276 f7fffffe BL OS_EventTaskRdy
00027a 1c60 ADDS r0,r4,#1 ;407
00027c b2c4 UXTB r4,r0 ;407
00027e 7aa9 LDRB r1,[r5,#0xa] ;405
000280 2900 CMP r1,#0 ;405
000282 d1f4 BNE |L1.622|
000284 e006 B |L1.660|
|L1.646|
000286 2302 MOVS r3,#2 ;413
000288 461a MOV r2,r3 ;413
00028a 2100 MOVS r1,#0 ;413
00028c 4628 MOV r0,r5 ;413
00028e f7fffffe BL OS_EventTaskRdy
000292 2401 MOVS r4,#1 ;414
|L1.660|
000294 4638 MOV r0,r7 ;417
000296 f7fffffe BL OS_CPU_SR_Restore
00029a f7fffffe BL OS_Sched
00029e 200e MOVS r0,#0xe ;419
0002a0 7030 STRB r0,[r6,#0] ;419
0002a2 4620 MOV r0,r4 ;420
0002a4 e8bd81f0 POP {r4-r8,pc}
|L1.680|
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?