📄 os_mbox.txt
字号:
000112 4638 MOV r0,r7 ;222
000114 f7fff7ff BL OS_CPU_SR_Restore
000118 2e01 CMP r6,#1 ;223
00011a d101 BNE |L1.288|
00011c f7fff7ff BL OS_Sched
|L1.288|
000120 f885f885 STRB r10,[r5,#0] ;226
000124 2000 MOVS r0,#0 ;227
000126 e7a4 B |L1.114|
|L1.296|
000128 4638 MOV r0,r7 ;231
00012a f7fff7ff BL OS_CPU_SR_Restore
00012e 2007 MOVS r0,#7 ;232
000130 7028 STRB r0,[r5,#0] ;232
000132 4620 MOV r0,r4 ;233
000134 e79d B |L1.114|
;;;238 #endif
ENDP
OSMboxPend PROC
;;;274 void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;275 {
000136 e92de92d PUSH {r4-r10,lr}
00013a 4607 MOV r7,r0
00013c 468a MOV r10,r1
00013e 4614 MOV r4,r2
;;;276 void *pmsg;
;;;277 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;278 OS_CPU_SR cpu_sr = 0;
;;;279 #endif
;;;280
;;;281
;;;282
;;;283 #if OS_ARG_CHK_EN > 0
;;;284 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;285 return ((void *)0);
;;;286 }
;;;287 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;288 *perr = OS_ERR_PEVENT_NULL;
;;;289 return ((void *)0);
;;;290 }
;;;291 #endif
;;;292 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
000140 7838 LDRB r0,[r7,#0]
000142 2801 CMP r0,#1
000144 d004 BEQ |L1.336|
;;;293 *perr = OS_ERR_EVENT_TYPE;
000146 2001 MOVS r0,#1
000148 7020 STRB r0,[r4,#0]
;;;294 return ((void *)0);
00014a 2000 MOVS r0,#0
|L1.332|
;;;295 }
;;;296 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;297 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
;;;298 return ((void *)0);
;;;299 }
;;;300 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;301 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;302 return ((void *)0);
;;;303 }
;;;304 OS_ENTER_CRITICAL();
;;;305 pmsg = pevent->OSEventPtr;
;;;306 if (pmsg != (void *)0) { /* See if there is already a message */
;;;307 pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
;;;308 OS_EXIT_CRITICAL();
;;;309 *perr = OS_ERR_NONE;
;;;310 return (pmsg); /* Return the message received (or NULL) */
;;;311 }
;;;312 OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
;;;313 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
;;;314 OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
;;;315 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;316 OS_EXIT_CRITICAL();
;;;317 OS_Sched(); /* Find next highest priority task ready to run */
;;;318 OS_ENTER_CRITICAL();
;;;319 switch (OSTCBCur->OSTCBStatPend) { /* See if we timed-out or aborted */
;;;320 case OS_STAT_PEND_OK:
;;;321 pmsg = OSTCBCur->OSTCBMsg;
;;;322 *perr = OS_ERR_NONE;
;;;323 break;
;;;324
;;;325 case OS_STAT_PEND_ABORT:
;;;326 pmsg = (void *)0;
;;;327 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
;;;328 break;
;;;329
;;;330 case OS_STAT_PEND_TO:
;;;331 default:
;;;332 OS_EventTaskRemove(OSTCBCur, pevent);
;;;333 pmsg = (void *)0;
;;;334 *perr = OS_ERR_TIMEOUT; /* Indicate that we didn't get event within TO */
;;;335 break;
;;;336 }
;;;337 OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready */
;;;338 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
;;;339 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers */
;;;340 #if (OS_EVENT_MULTI_EN > 0)
;;;341 OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
;;;342 #endif
;;;343 OSTCBCur->OSTCBMsg = (void *)0; /* Clear received message */
;;;344 OS_EXIT_CRITICAL();
;;;345 return (pmsg); /* Return received message */
;;;346 }
00014c e8bde8bd POP {r4-r10,pc}
|L1.336|
000150 4887 LDR r0,|L1.880|
000152 7800 LDRB r0,[r0,#0] ;296 ; OSIntNesting
000154 b118 CBZ r0,|L1.350|
000156 2002 MOVS r0,#2 ;297
000158 7020 STRB r0,[r4,#0] ;297
00015a 2000 MOVS r0,#0 ;298
00015c e7f6 B |L1.332|
|L1.350|
00015e 4886 LDR r0,|L1.888|
000160 7800 LDRB r0,[r0,#0] ;300 ; OSLockNesting
000162 b118 CBZ r0,|L1.364|
000164 200d MOVS r0,#0xd ;301
000166 7020 STRB r0,[r4,#0] ;301
000168 2000 MOVS r0,#0 ;302
00016a e7ef B |L1.332|
|L1.364|
00016c f7fff7ff BL OS_CPU_SR_Save
000170 4606 MOV r6,r0 ;304
000172 687d LDR r5,[r7,#4] ;305
000174 f04ff04f MOV r8,#0 ;306
000178 b145 CBZ r5,|L1.396|
00017a f8c7f8c7 STR r8,[r7,#4] ;307
00017e 4630 MOV r0,r6 ;308
000180 f7fff7ff BL OS_CPU_SR_Restore
000184 f884f884 STRB r8,[r4,#0] ;309
000188 4628 MOV r0,r5 ;310
00018a e7df B |L1.332|
|L1.396|
00018c f8dff8df LDR r9,|L1.892|
000190 f8d9f8d9 LDR r0,[r9,#0] ;312 ; OSTCBCur
000194 f810f810 LDRB r1,[r0,#0x30]! ;312
000198 f041f041 ORR r1,r1,#2 ;312
00019c 7001 STRB r1,[r0,#0] ;312
00019e f880f880 STRB r8,[r0,#1] ;313
0001a2 f820f820 STRH r10,[r0,#-2] ;314
0001a6 4638 MOV r0,r7 ;315
0001a8 f7fff7ff BL OS_EventTaskWait
0001ac 4630 MOV r0,r6 ;316
0001ae f7fff7ff BL OS_CPU_SR_Restore
0001b2 f7fff7ff BL OS_Sched
0001b6 f7fff7ff BL OS_CPU_SR_Save
0001ba 4606 MOV r6,r0 ;318
0001bc f8d9f8d9 LDR r0,[r9,#0] ;319 ; OSTCBCur
0001c0 f890f890 LDRB r1,[r0,#0x31] ;319
0001c4 b121 CBZ r1,|L1.464|
0001c6 2902 CMP r1,#2 ;319
0001c8 d106 BNE |L1.472|
0001ca 200e MOVS r0,#0xe ;327
0001cc 7020 STRB r0,[r4,#0] ;327
0001ce e008 B |L1.482|
|L1.464|
0001d0 6a45 LDR r5,[r0,#0x24] ;321
0001d2 f884f884 STRB r8,[r4,#0] ;322
0001d6 e004 B |L1.482|
|L1.472|
0001d8 4639 MOV r1,r7 ;332
0001da f7fff7ff BL OS_EventTaskRemove
0001de 200a MOVS r0,#0xa ;334
0001e0 7020 STRB r0,[r4,#0] ;334
|L1.482|
0001e2 f8d9f8d9 LDR r1,[r9,#0] ;337 ; OSTCBCur
0001e6 f881f881 STRB r8,[r1,#0x30] ;337
0001ea f881f881 STRB r8,[r1,#0x31] ;338
0001ee f8c1f8c1 STR r8,[r1,#0x1c] ;339
0001f2 f8c1f8c1 STR r8,[r1,#0x20] ;341
0001f6 f8c1f8c1 STR r8,[r1,#0x24] ;343
0001fa 4630 MOV r0,r6 ;344
0001fc f7fff7ff BL OS_CPU_SR_Restore
000200 4628 MOV r0,r5 ;345
000202 e7a3 B |L1.332|
;;;347 /*$PAGE*/
ENDP
OSMboxPendAbort PROC
;;;381 INT8U OSMboxPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;382 {
000204 e92de92d PUSH {r4-r8,lr}
000208 4605 MOV r5,r0
00020a 4688 MOV r8,r1
00020c 4616 MOV r6,r2
;;;383 INT8U nbr_tasks;
;;;384 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;385 OS_CPU_SR cpu_sr = 0;
;;;386 #endif
;;;387
;;;388
;;;389
;;;390 #if OS_ARG_CHK_EN > 0
;;;391 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;392 return (0);
;;;393 }
;;;394 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;395 *perr = OS_ERR_PEVENT_NULL;
;;;396 return (0);
;;;397 }
;;;398 #endif
;;;399 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
00020e 7829 LDRB r1,[r5,#0]
000210 2001 MOVS r0,#1
000212 2901 CMP r1,#1
000214 d003 BEQ |L1.542|
;;;400 *perr = OS_ERR_EVENT_TYPE;
000216 7030 STRB r0,[r6,#0]
;;;401 return (0);
000218 2000 MOVS r0,#0
|L1.538|
;;;402 }
;;;403 OS_ENTER_CRITICAL();
;;;404 if (pevent->OSEventGrp != 0) { /* See if any task waiting on mailbox? */
;;;405 nbr_tasks = 0;
;;;406 switch (opt) {
;;;407 case OS_PEND_OPT_BROADCAST: /* Do we need to abort ALL waiting tasks? */
;;;408 while (pevent->OSEventGrp != 0) { /* Yes, ready ALL tasks waiting on mailbox */
;;;409 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
;;;410 nbr_tasks++;
;;;411 }
;;;412 break;
;;;413
;;;414 case OS_PEND_OPT_NONE:
;;;415 default: /* No, ready HPT waiting on mailbox */
;;;416 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
;;;417 nbr_tasks++;
;;;418 break;
;;;419 }
;;;420 OS_EXIT_CRITICAL();
;;;421 OS_Sched(); /* Find HPT ready to run */
;;;422 *perr = OS_ERR_PEND_ABORT;
;;;423 return (nbr_tasks);
;;;424 }
;;;425 OS_EXIT_CRITICAL();
;;;426 *perr = OS_ERR_NONE;
;;;427 return (0); /* No tasks waiting on mailbox */
;;;428 }
00021a e8bde8bd POP {r4-r8,pc}
|L1.542|
00021e f7fff7ff BL OS_CPU_SR_Save
000222 4607 MOV r7,r0 ;403
000224 7aa8 LDRB r0,[r5,#0xa] ;404
000226 b300 CBZ r0,|L1.618|
000228 2400 MOVS r4,#0 ;405
00022a f1b8f1b8 CMP r8,#1 ;406
00022e d10c BNE |L1.586|
000230 e007 B |L1.578|
|L1.562|
000232 2302 MOVS r3,#2 ;409
000234 461a MOV r2,r3 ;409
000236 2100 MOVS r1,#0 ;409
000238 4628 MOV r0,r5 ;409
00023a f7fff7ff BL OS_EventTaskRdy
00023e 1c64 ADDS r4,r4,#1 ;410
000240 b2e4 UXTB r4,r4 ;410
|L1.578|
000242 7aa8 LDRB r0,[r5,#0xa] ;408
000244 2800 CMP r0,#0 ;408
000246 d1f4 BNE |L1.562|
000248 e006 B |L1.600|
|L1.586|
00024a 2302 MOVS r3,#2 ;416
00024c 461a MOV r2,r3 ;416
00024e 2100 MOVS r1,#0 ;416
000250 4628 MOV r0,r5 ;416
000252 f7fff7ff BL OS_EventTaskRdy
000256 2401 MOVS r4,#1 ;417
|L1.600|
000258 4638 MOV r0,r7 ;420
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -