📄 os_mbox.txt
字号:
00015c da000003 BLE |L1.368|
000160 e3a0000f MOV r0,#0xf
000164 e5c60000 STRB r0,[r6,#0]
000168 e1a00004 MOV r0,r4
00016c eaffffe8 B |L1.276|
|L1.368|
000170 ebfffffe BL OS_CPU_SR_Save
000174 e1a09000 MOV r9,r0
000178 e5d4000a LDRB r0,[r4,#0xa]
00017c e3500000 CMP r0,#0
000180 0a000001 BEQ |L1.396|
000184 e3a07001 MOV r7,#1
000188 ea000000 B |L1.400|
|L1.396|
00018c e3a07000 MOV r7,#0
|L1.400|
000190 e3550000 CMP r5,#0
000194 0a000002 BEQ |L1.420|
000198 e3550001 CMP r5,#1
00019c 1a00003a BNE |L1.652|
0001a0 ea00001a B |L1.528|
|L1.420|
0001a4 e1a00000 MOV r0,r0
0001a8 e3570000 CMP r7,#0
0001ac 1a000011 BNE |L1.504|
0001b0 e3a0003f MOV r0,#0x3f
0001b4 e5c4000f STRB r0,[r4,#0xf]
0001b8 e3a00000 MOV r0,#0
0001bc e5c40010 STRB r0,[r4,#0x10]
0001c0 e5c40000 STRB r0,[r4,#0]
0001c4 e59f0620 LDR r0,|L1.2028|
0001c8 e5900000 LDR r0,[r0,#0] ; OSEventFreeList
0001cc e5840004 STR r0,[r4,#4]
0001d0 e3a00000 MOV r0,#0
0001d4 e1c400b8 STRH r0,[r4,#8]
0001d8 e59f060c LDR r0,|L1.2028|
0001dc e5804000 STR r4,[r0,#0] ; OSEventFreeList
0001e0 e1a00009 MOV r0,r9
0001e4 ebfffffe BL OS_CPU_SR_Restore
0001e8 e3a00000 MOV r0,#0
0001ec e5c60000 STRB r0,[r6,#0]
0001f0 e3a08000 MOV r8,#0
0001f4 ea000004 B |L1.524|
|L1.504|
0001f8 e1a00009 MOV r0,r9
0001fc ebfffffe BL OS_CPU_SR_Restore
000200 e3a00049 MOV r0,#0x49
000204 e5c60000 STRB r0,[r6,#0]
000208 e1a08004 MOV r8,r4
|L1.524|
00020c ea000025 B |L1.680|
|L1.528|
000210 e1a00000 MOV r0,r0
000214 ea000004 B |L1.556|
|L1.536|
000218 e3a03000 MOV r3,#0
00021c e3a02002 MOV r2,#2
000220 e1a01003 MOV r1,r3
000224 e1a00004 MOV r0,r4
000228 ebfffffe BL OS_EventTaskRdy
|L1.556|
00022c e5d4000a LDRB r0,[r4,#0xa]
000230 e3500000 CMP r0,#0
000234 1afffff7 BNE |L1.536|
000238 e3a0003f MOV r0,#0x3f
00023c e5c4000f STRB r0,[r4,#0xf]
000240 e3a00000 MOV r0,#0
000244 e5c40010 STRB r0,[r4,#0x10]
000248 e5c40000 STRB r0,[r4,#0]
00024c e59f0598 LDR r0,|L1.2028|
000250 e5900000 LDR r0,[r0,#0] ; OSEventFreeList
000254 e5840004 STR r0,[r4,#4]
000258 e3a00000 MOV r0,#0
00025c e1c400b8 STRH r0,[r4,#8]
000260 e59f0584 LDR r0,|L1.2028|
000264 e5804000 STR r4,[r0,#0] ; OSEventFreeList
000268 e1a00009 MOV r0,r9
00026c ebfffffe BL OS_CPU_SR_Restore
000270 e3570001 CMP r7,#1
000274 1a000000 BNE |L1.636|
000278 ebfffffe BL OS_Sched
|L1.636|
00027c e3a00000 MOV r0,#0
000280 e5c60000 STRB r0,[r6,#0]
000284 e3a08000 MOV r8,#0
000288 ea000006 B |L1.680|
|L1.652|
00028c e1a00000 MOV r0,r0
000290 e1a00009 MOV r0,r9
000294 ebfffffe BL OS_CPU_SR_Restore
000298 e3a00007 MOV r0,#7
00029c e5c60000 STRB r0,[r6,#0]
0002a0 e1a08004 MOV r8,r4
0002a4 e1a00000 MOV r0,r0
|L1.680|
0002a8 e1a00000 MOV r0,r0
0002ac e1a00008 MOV r0,r8
0002b0 eaffff97 B |L1.276|
ENDP
OSMboxPend PROC
;;;274 void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;275 {
0002b4 e92d47f0 PUSH {r4-r10,lr}
0002b8 e1a04000 MOV r4,r0
0002bc e1a05001 MOV r5,r1
0002c0 e1a06002 MOV r6,r2
;;;276 void *msg;
;;;277 INT8U pend_stat;
;;;278 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;279 OS_CPU_SR cpu_sr = 0;
0002c4 e3a09000 MOV r9,#0
;;;280 #endif
;;;281
;;;282
;;;283
;;;284 #if OS_ARG_CHK_EN > 0
;;;285 if (err == (INT8U *)0) { /* Validate 'err' */
0002c8 e3560000 CMP r6,#0
0002cc 1a000002 BNE |L1.732|
;;;286 return ((void *)0);
0002d0 e3a00000 MOV r0,#0
|L1.724|
0002d4 e8bd47f0 POP {r4-r10,lr}
;;;287 }
;;;288 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;289 *err = OS_ERR_PEVENT_NULL;
;;;290 return ((void *)0);
;;;291 }
;;;292 #endif
;;;293 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
;;;294 *err = OS_ERR_EVENT_TYPE;
;;;295 return ((void *)0);
;;;296 }
;;;297 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;298 *err = 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 *err = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;303 return ((void *)0);
;;;304 }
;;;305 OS_ENTER_CRITICAL();
;;;306 msg = pevent->OSEventPtr;
;;;307 if (msg != (void *)0) { /* See if there is already a message */
;;;308 pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
;;;309 OS_EXIT_CRITICAL();
;;;310 *err = OS_ERR_NONE;
;;;311 return (msg); /* 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 *err = OS_ERR_TIMEOUT; /* Indicate that a timeout occured */
;;;328 break;
;;;329
;;;330 case OS_STAT_PEND_ABORT:
;;;331 *err = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
;;;332 break;
;;;333 }
;;;334 return ((void *)0); /* Return a NULL message */
;;;335 }
;;;336 msg = 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 *err = OS_ERR_NONE;
;;;342 return (msg); /* Return the message received */
;;;343 }
0002d8 e12fff1e BX lr
|L1.732|
0002dc e3540000 CMP r4,#0
0002e0 1a000003 BNE |L1.756|
0002e4 e3a00004 MOV r0,#4
0002e8 e5c60000 STRB r0,[r6,#0]
0002ec e3a00000 MOV r0,#0
0002f0 eafffff7 B |L1.724|
|L1.756|
0002f4 e5d40000 LDRB r0,[r4,#0]
0002f8 e3500001 CMP r0,#1
0002fc 0a000003 BEQ |L1.784|
000300 e3a00001 MOV r0,#1
000304 e5c60000 STRB r0,[r6,#0]
000308 e3a00000 MOV r0,#0
00030c eafffff0 B |L1.724|
|L1.784|
000310 e59f04d0 LDR r0,|L1.2024|
000314 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000318 e3500000 CMP r0,#0
00031c da000003 BLE |L1.816|
000320 e3a00002 MOV r0,#2
000324 e5c60000 STRB r0,[r6,#0]
000328 e3a00000 MOV r0,#0
00032c eaffffe8 B |L1.724|
|L1.816|
000330 e59f04b8 LDR r0,|L1.2032|
000334 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
000338 e3500000 CMP r0,#0
00033c da000003 BLE |L1.848|
000340 e3a0000d MOV r0,#0xd
000344 e5c60000 STRB r0,[r6,#0]
000348 e3a00000 MOV r0,#0
00034c eaffffe0 B |L1.724|
|L1.848|
000350 ebfffffe BL OS_CPU_SR_Save
000354 e1a09000 MOV r9,r0
000358 e5947004 LDR r7,[r4,#4]
00035c e3570000 CMP r7,#0
000360 0a000007 BEQ |L1.900|
000364 e3a00000 MOV r0,#0
000368 e5840004 STR r0,[r4,#4]
00036c e1a00009 MOV r0,r9
000370 ebfffffe BL OS_CPU_SR_Restore
000374 e3a00000 MOV r0,#0
000378 e5c60000 STRB r0,[r6,#0]
00037c e1a00007 MOV r0,r7
000380 eaffffd3 B |L1.724|
|L1.900|
000384 e59f0468 LDR r0,|L1.2036|
000388 e5900000 LDR r0,[r0,#0] ; OSTCBCur
00038c e5d0002c LDRB r0,[r0,#0x2c]
000390 e3800002 ORR r0,r0,#2
000394 e59f1458 LDR r1,|L1.2036|
000398 e5911000 LDR r1,[r1,#0] ; OSTCBCur
00039c e5c1002c STRB r0,[r1,#0x2c]
0003a0 e3a00000 MOV r0,#0
0003a4 e59f1448 LDR r1,|L1.2036|
0003a8 e5911000 LDR r1,[r1,#0] ; OSTCBCur
0003ac e5c1002d STRB r0,[r1,#0x2d]
0003b0 e59f043c LDR r0,|L1.2036|
0003b4 e5900000 LDR r0,[r0,#0] ; OSTCBCur
0003b8 e1c052ba STRH r5,[r0,#0x2a]
0003bc e1a00004 MOV r0,r4
0003c0 ebfffffe BL OS_EventTaskWait
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -