?? os_mbox.txt
字號:
;;;231 OS_EXIT_CRITICAL();
000146 4650 MOV r0,r10
000148 f7fff7ff BL OS_CPU_SR_Restore
;;;232 *perr = OS_ERR_INVALID_OPT;
00014c 2007 MOVS r0,#7
00014e 7028 STRB r0,[r5,#0]
;;;233 pevent_return = pevent;
000150 4620 MOV r0,r4
;;;234 break;
;;;235 }
;;;236 return (pevent_return);
;;;237 }
000152 e8bde8bd POP {r4-r12,pc}
;;;238 #endif
ENDP
OSMboxPend PROC
;;;274 void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;275 {
000156 e92de92d 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
000164 e8bde8bd POP {r4-r10,pc}
|L1.360|
;;;287 }
;;;288 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000168 b925 CBNZ r5,|L1.372|
;;;289 *perr = OS_ERR_PEVENT_NULL;
00016a 2004 MOVS r0,#4
00016c 7020 STRB r0,[r4,#0]
;;;290 return ((void *)0);
00016e 2000 MOVS r0,#0
000170 e8bde8bd POP {r4-r10,pc}
|L1.372|
;;;291 }
;;;292 #endif
;;;293 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
000174 7828 LDRB r0,[r5,#0]
000176 2801 CMP r0,#1
000178 d004 BEQ |L1.388|
;;;294 *perr = OS_ERR_EVENT_TYPE;
00017a 2001 MOVS r0,#1
00017c 7020 STRB r0,[r4,#0]
;;;295 return ((void *)0);
00017e 2000 MOVS r0,#0
000180 e8bde8bd POP {r4-r10,pc}
|L1.388|
;;;296 }
;;;297 if (OSIntNesting > 0) { /* See if called from ISR ... */
000184 4897 LDR r0,|L1.996|
000186 7800 LDRB r0,[r0,#0] ; OSIntNesting
000188 b120 CBZ r0,|L1.404|
;;;298 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
00018a 2002 MOVS r0,#2
00018c 7020 STRB r0,[r4,#0]
;;;299 return ((void *)0);
00018e 2000 MOVS r0,#0
000190 e8bde8bd POP {r4-r10,pc}
|L1.404|
;;;300 }
;;;301 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
000194 4895 LDR r0,|L1.1004|
000196 7800 LDRB r0,[r0,#0] ; OSLockNesting
000198 b120 CBZ r0,|L1.420|
;;;302 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
00019a 200d MOVS r0,#0xd
00019c 7020 STRB r0,[r4,#0]
;;;303 return ((void *)0);
00019e 2000 MOVS r0,#0
0001a0 e8bde8bd POP {r4-r10,pc}
|L1.420|
;;;304 }
;;;305 OS_ENTER_CRITICAL();
0001a4 f7fff7ff BL OS_CPU_SR_Save
0001a8 4681 MOV r9,r0
;;;306 pmsg = pevent->OSEventPtr;
0001aa 686e LDR r6,[r5,#4]
;;;307 if (pmsg != (void *)0) { /* See if there is already a message */
0001ac 2700 MOVS r7,#0
0001ae b13e CBZ r6,|L1.448|
;;;308 pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
0001b0 606f STR r7,[r5,#4]
;;;309 OS_EXIT_CRITICAL();
0001b2 4648 MOV r0,r9
0001b4 f7fff7ff BL OS_CPU_SR_Restore
;;;310 *perr = OS_ERR_NONE;
0001b8 7027 STRB r7,[r4,#0]
;;;311 return (pmsg); /* Return the message received (or NULL) */
0001ba 4630 MOV r0,r6
0001bc e8bde8bd POP {r4-r10,pc}
|L1.448|
;;;312 }
;;;313 OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
0001c0 4e8b LDR r6,|L1.1008|
0001c2 6831 LDR r1,[r6,#0] ; OSTCBCur
0001c4 f891f891 LDRB r0,[r1,#0x2c]
0001c8 f040f040 ORR r0,r0,#2
0001cc f881f881 STRB r0,[r1,#0x2c]
;;;314 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
0001d0 f881f881 STRB r7,[r1,#0x2d]
;;;315 OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
0001d4 f8a1f8a1 STRH r8,[r1,#0x2a]
;;;316 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
0001d8 4628 MOV r0,r5
0001da f7fff7ff BL OS_EventTaskWait
;;;317 OS_EXIT_CRITICAL();
0001de 4648 MOV r0,r9
0001e0 f7fff7ff BL OS_CPU_SR_Restore
;;;318 OS_Sched(); /* Find next highest priority task ready to run */
0001e4 f7fff7ff BL OS_Sched
;;;319 OS_ENTER_CRITICAL();
0001e8 f7fff7ff BL OS_CPU_SR_Save
0001ec 4680 MOV r8,r0
;;;320 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we weren't given the message */
0001ee 6831 LDR r1,[r6,#0] ; OSTCBCur
0001f0 f891f891 LDRB r6,[r1,#0x2d]
0001f4 b17e CBZ r6,|L1.534|
;;;321 pend_stat = OSTCBCur->OSTCBStatPend;
;;;322 OS_EventTOAbort(pevent); /* Timed out, Make task ready */
0001f6 4628 MOV r0,r5
0001f8 f7fff7ff BL OS_EventTOAbort
;;;323 OS_EXIT_CRITICAL();
0001fc 4640 MOV r0,r8
0001fe f7fff7ff BL OS_CPU_SR_Restore
;;;324 switch (pend_stat) {
000202 2e02 CMP r6,#2
000204 d002 BEQ |L1.524|
;;;325 case OS_STAT_PEND_TO:
;;;326 default:
;;;327 *perr = OS_ERR_TIMEOUT; /* Indicate that a timeout occured */
000206 200a MOVS r0,#0xa
000208 7020 STRB r0,[r4,#0]
;;;328 break;
00020a e001 B |L1.528|
|L1.524|
;;;329
;;;330 case OS_STAT_PEND_ABORT:
;;;331 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
00020c 200e MOVS r0,#0xe
00020e 7020 STRB r0,[r4,#0]
|L1.528|
;;;332 break;
;;;333 }
;;;334 return ((void *)0); /* Return a NULL message */
000210 2000 MOVS r0,#0
000212 e8bde8bd POP {r4-r10,pc}
|L1.534|
;;;335 }
;;;336 pmsg = OSTCBCur->OSTCBMsg;
000216 6a0d LDR r5,[r1,#0x20]
;;;337 OSTCBCur->OSTCBMsg = (void *)0; /* Yes, clear message received */
000218 620f STR r7,[r1,#0x20]
;;;338 OSTCBCur->OSTCBStat = OS_STAT_RDY;
00021a f881f881 STRB r7,[r1,#0x2c]
;;;339 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
00021e 61cf STR r7,[r1,#0x1c]
;;;340 OS_EXIT_CRITICAL();
000220 4640 MOV r0,r8
000222 f7fff7ff BL OS_CPU_SR_Restore
;;;341 *perr = OS_ERR_NONE;
000226 7027 STRB r7,[r4,#0]
;;;342 return (pmsg); /* Return the message received */
000228 4628 MOV r0,r5
;;;343 }
00022a e8bde8bd POP {r4-r10,pc}
;;;344 /*$PAGE*/
ENDP
OSMboxPendAbort PROC
;;;378 INT8U OSMboxPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;379 {
00022e e92de92d 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
00023c e8bde8bd POP {r4-r8,pc}
|L1.576|
;;;390 }
;;;391 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000240 b925 CBNZ r5,|L1.588|
;;;392 *perr = OS_ERR_PEVENT_NULL;
000244 7030 STRB r0,[r6,#0]
;;;393 return (0);
000246 2000 MOVS r0,#0
000248 e8bde8bd POP {r4-r8,pc}
|L1.588|
;;;394 }
;;;395 #endif
;;;396 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
00024c 7829 LDRB r1,[r5,#0]
00024e 2001 MOVS r0,#1
000250 2901 CMP r1,#1
000252 d003 BEQ |L1.604|
;;;397 *perr = OS_ERR_EVENT_TYPE;
000254 7030 STRB r0,[r6,#0]
;;;398 return (0);
000256 2000 MOVS r0,#0
000258 e8bde8bd POP {r4-r8,pc}
|L1.604|
;;;399 }
;;;400 OS_ENTER_CRITICAL();
00025c f7fff7ff BL OS_CPU_SR_Save
000260 4607 MOV r7,r0
;;;401 if (pevent->OSEventGrp != 0) { /* See if any task waiting on mailbox? */
000262 7aa8 LDRB r0,[r5,#0xa]
000264 b300 CBZ r0,|L1.680|
;;;402 nbr_tasks = 0;
000266 2400 MOVS r4,#0
;;;403 switch (opt) {
000268 f1b8f1b8 CMP r8,#1
00026c d10b BNE |L1.646|
|L1.622|
00026e 2302 MOVS r3,#2
000270 461a MOV r2,r3
000272 2100 MOVS r1,#0
000274 4628 MOV r0,r5
000276 f7fff7ff BL OS_EventTaskRdy
00027a 1c60 ADDS r0,r4,#1
;;;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++;
00027c b2c4 UXTB r4,r0
00027e 7aa9 LDRB r1,[r5,#0xa]
000280 2900 CMP r1,#0
000282 d1f4 BNE |L1.622|
000284 e006 B |L1.660|
|L1.646|
;;;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);
000286 2302 MOVS r3,#2
000288 461a MOV r2,r3
00028a 2100 MOVS r1,#0
00028c 4628 MOV r0,r5
00028e f7fff7ff BL OS_EventTaskRdy
;;;414 nbr_tasks++;
000292 2401 MOVS r4,#1
|L1.660|
;;;415 break;
;;;416 }
;;;417 OS_EXIT_CRITICAL();
000294 4638 MOV r0,r7
000296 f7fff7ff BL OS_CPU_SR_Restore
;;;418 OS_Sched(); /* Find HPT ready to run */
00029a f7fff7ff BL OS_Sched
;;;419 *perr = OS_ERR_PEND_ABORT;
00029e 200e MOVS r0,#0xe
0002a0 7030 STRB r0,[r6,#0]
;;;420 return (nbr_tasks);
0002a2 4620 MOV r0,r4
0002a4 e8bde8bd POP {r4-r8,pc}
|L1.680|
;;;421 }
;;;422 OS_EXIT_CRITICAL();
0002a8 4638 MOV r0,r7
0002aa f7fff7ff BL OS_CPU_SR_Restore
;;;423 *perr = OS_ERR_NONE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -