📄 os_mbox.txt
字号:
000184 e59f03ac LDR r0,|L1.1336| ;174
000188 e5804000 STR r4,[r0,#0] ;174 ; OSEventFreeList
00018c ef000003 SVC 0x3 ; formerly SWI ;175
000190 e3a00000 MOV r0,#0 ;176
000194 e5c60000 STRB r0,[r6,#0] ;176
000198 eaffffd6 B |L1.248| ;177
|L1.412|
00019c ef000003 SVC 0x3 ; formerly SWI ;179
0001a0 e3a00008 MOV r0,#8 ;180
0001a4 e5c60000 STRB r0,[r6,#0] ;180
0001a8 e1a00004 MOV r0,r4 ;181
0001ac eaffffd1 B |L1.248| ;181
|L1.432|
0001b0 e1a00000 MOV r0,r0 ;184
0001b4 ea000003 B |L1.456| ;185
|L1.440|
0001b8 e3a02002 MOV r2,#2 ;186
0001bc e3a01000 MOV r1,#0 ;186
0001c0 e1a00004 MOV r0,r4 ;186
0001c4 ebfffffe BL OS_EventTaskRdy ;186
|L1.456|
0001c8 e5d40001 LDRB r0,[r4,#1] ;185
0001cc e3500000 CMP r0,#0 ;185
0001d0 1afffff8 BNE |L1.440| ;185
0001d4 e3a00000 MOV r0,#0 ;188
0001d8 e5c40000 STRB r0,[r4,#0] ;188
0001dc e59f0354 LDR r0,|L1.1336| ;189
0001e0 e5900000 LDR r0,[r0,#0] ;189 ; OSEventFreeList
0001e4 e5840004 STR r0,[r4,#4] ;189
0001e8 e59f0348 LDR r0,|L1.1336| ;190
0001ec e5804000 STR r4,[r0,#0] ;190 ; OSEventFreeList
0001f0 ef000003 SVC 0x3 ; formerly SWI ;191
0001f4 e3570001 CMP r7,#1 ;192
0001f8 1a000000 BNE |L1.512| ;192
0001fc ebfffffe BL OS_Sched ;193
|L1.512|
000200 e3a00000 MOV r0,#0 ;195
000204 e5c60000 STRB r0,[r6,#0] ;195
000208 eaffffba B |L1.248| ;196
|L1.524|
00020c e1a00000 MOV r0,r0 ;198
000210 ef000003 SVC 0x3 ; formerly SWI ;199
000214 e3a00007 MOV r0,#7 ;200
000218 e5c60000 STRB r0,[r6,#0] ;200
00021c e1a00004 MOV r0,r4 ;201
000220 eaffffb4 B |L1.248| ;201
ENDP
OSMboxPend PROC
;;;238 void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;239 {
000224 e92d41f0 PUSH {r4-r8,lr}
000228 e1a04000 MOV r4,r0
00022c e1a05001 MOV r5,r1
000230 e1a07002 MOV r7,r2
;;;240 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;241 OS_CPU_SR cpu_sr;
;;;242 #endif
;;;243 void *msg;
;;;244
;;;245
;;;246 if (OSIntNesting > 0) { /* See if called from ISR ... */
000234 e59f02f8 LDR r0,|L1.1332|
000238 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00023c e3500000 CMP r0,#0
000240 da000004 BLE |L1.600|
;;;247 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000244 e3a00002 MOV r0,#2
000248 e5c70000 STRB r0,[r7,#0]
;;;248 return ((void *)0);
00024c e3a00000 MOV r0,#0
|L1.592|
000250 e8bd41f0 POP {r4-r8,lr}
;;;249 }
;;;250 #if OS_ARG_CHK_EN > 0
;;;251 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;252 *err = OS_ERR_PEVENT_NULL;
;;;253 return ((void *)0);
;;;254 }
;;;255 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
;;;256 *err = OS_ERR_EVENT_TYPE;
;;;257 return ((void *)0);
;;;258 }
;;;259 #endif
;;;260 OS_ENTER_CRITICAL();
;;;261 msg = pevent->OSEventPtr;
;;;262 if (msg != (void *)0) { /* See if there is already a message */
;;;263 pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
;;;264 OS_EXIT_CRITICAL();
;;;265 *err = OS_NO_ERR;
;;;266 return (msg); /* Return the message received (or NULL) */
;;;267 }
;;;268 OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
;;;269 OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
;;;270 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;271 OS_EXIT_CRITICAL();
;;;272 OS_Sched(); /* Find next highest priority task ready to run */
;;;273 OS_ENTER_CRITICAL();
;;;274 msg = OSTCBCur->OSTCBMsg;
;;;275 if (msg != (void *)0) { /* See if we were given the message */
;;;276 OSTCBCur->OSTCBMsg = (void *)0; /* Yes, clear message received */
;;;277 OSTCBCur->OSTCBStat = OS_STAT_RDY;
;;;278 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
;;;279 OS_EXIT_CRITICAL();
;;;280 *err = OS_NO_ERR;
;;;281 return (msg); /* Return the message received */
;;;282 }
;;;283 OS_EventTO(pevent); /* Timed out, Make task ready */
;;;284 OS_EXIT_CRITICAL();
;;;285 *err = OS_TIMEOUT; /* Indicate that a timeout occured */
;;;286 return ((void *)0); /* Return a NULL message */
;;;287 }
000254 e12fff1e BX lr
|L1.600|
000258 e3540000 CMP r4,#0 ;251
00025c 1a000003 BNE |L1.624| ;251
000260 e3a00004 MOV r0,#4 ;252
000264 e5c70000 STRB r0,[r7,#0] ;252
000268 e3a00000 MOV r0,#0 ;253
00026c eafffff7 B |L1.592| ;253
|L1.624|
000270 e5d40000 LDRB r0,[r4,#0] ;255
000274 e3500001 CMP r0,#1 ;255
000278 0a000003 BEQ |L1.652| ;255
00027c e3a00001 MOV r0,#1 ;256
000280 e5c70000 STRB r0,[r7,#0] ;256
000284 e3a00000 MOV r0,#0 ;257
000288 eafffff0 B |L1.592| ;257
|L1.652|
00028c ef000002 SVC 0x2 ; formerly SWI ;260
000290 e5946004 LDR r6,[r4,#4] ;261
000294 e3560000 CMP r6,#0 ;262
000298 0a000006 BEQ |L1.696| ;262
00029c e3a00000 MOV r0,#0 ;263
0002a0 e5840004 STR r0,[r4,#4] ;263
0002a4 ef000003 SVC 0x3 ; formerly SWI ;264
0002a8 e3a00000 MOV r0,#0 ;265
0002ac e5c70000 STRB r0,[r7,#0] ;265
0002b0 e1a00006 MOV r0,r6 ;266
0002b4 eaffffe5 B |L1.592| ;266
|L1.696|
0002b8 e59f027c LDR r0,|L1.1340| ;268
0002bc e5900000 LDR r0,[r0,#0] ;268 ; OSTCBCur
0002c0 e5d0002c LDRB r0,[r0,#0x2c] ;268
0002c4 e3800002 ORR r0,r0,#2 ;268
0002c8 e59f126c LDR r1,|L1.1340| ;268
0002cc e5911000 LDR r1,[r1,#0] ;268 ; OSTCBCur
0002d0 e5c1002c STRB r0,[r1,#0x2c] ;268
0002d4 e59f0260 LDR r0,|L1.1340| ;269
0002d8 e5900000 LDR r0,[r0,#0] ;269 ; OSTCBCur
0002dc e1c052ba STRH r5,[r0,#0x2a] ;269
0002e0 e1a00004 MOV r0,r4 ;270
0002e4 ebfffffe BL OS_EventTaskWait ;270
0002e8 ef000003 SVC 0x3 ; formerly SWI ;271
0002ec ebfffffe BL OS_Sched ;272
0002f0 ef000002 SVC 0x2 ; formerly SWI ;273
0002f4 e59f0240 LDR r0,|L1.1340| ;274
0002f8 e5900000 LDR r0,[r0,#0] ;274 ; OSTCBCur
0002fc e5906020 LDR r6,[r0,#0x20] ;274
000300 e3560000 CMP r6,#0 ;275
000304 0a00000e BEQ |L1.836| ;275
000308 e3a00000 MOV r0,#0 ;276
00030c e59f1228 LDR r1,|L1.1340| ;276
000310 e5911000 LDR r1,[r1,#0] ;276 ; OSTCBCur
000314 e5810020 STR r0,[r1,#0x20] ;276
000318 e59f121c LDR r1,|L1.1340| ;277
00031c e5911000 LDR r1,[r1,#0] ;277 ; OSTCBCur
000320 e5c1002c STRB r0,[r1,#0x2c] ;277
000324 e59f1210 LDR r1,|L1.1340| ;278
000328 e5911000 LDR r1,[r1,#0] ;278 ; OSTCBCur
00032c e581001c STR r0,[r1,#0x1c] ;278
000330 ef000003 SVC 0x3 ; formerly SWI ;279
000334 e3a00000 MOV r0,#0 ;280
000338 e5c70000 STRB r0,[r7,#0] ;280
00033c e1a00006 MOV r0,r6 ;281
000340 eaffffc2 B |L1.592| ;281
|L1.836|
000344 e1a00004 MOV r0,r4 ;283
000348 ebfffffe BL OS_EventTO ;283
00034c ef000003 SVC 0x3 ; formerly SWI ;284
000350 e3a0000a MOV r0,#0xa ;285
000354 e5c70000 STRB r0,[r7,#0] ;285
000358 e3a00000 MOV r0,#0 ;286
00035c eaffffbb B |L1.592| ;286
ENDP
OSMboxPost PROC
;;;310 INT8U OSMboxPost (OS_EVENT *pevent, void *msg)
;;;311 {
000360 e92d4070 PUSH {r4-r6,lr}
000364 e1a05000 MOV r5,r0
000368 e1a04001 MOV r4,r1
;;;312 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;313 OS_CPU_SR cpu_sr;
;;;314 #endif
;;;315
;;;316
;;;317 #if OS_ARG_CHK_EN > 0
;;;318 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
00036c e3550000 CMP r5,#0
000370 1a000002 BNE |L1.896|
;;;319 return (OS_ERR_PEVENT_NULL);
000374 e3a00004 MOV r0,#4
|L1.888|
000378 e8bd4070 POP {r4-r6,lr}
;;;320 }
;;;321 if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
;;;322 return (OS_ERR_POST_NULL_PTR);
;;;323 }
;;;324 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
;;;325 return (OS_ERR_EVENT_TYPE);
;;;326 }
;;;327 #endif
;;;328 OS_ENTER_CRITICAL();
;;;329 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on mailbox */
;;;330 OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX); /* Ready highest priority task waiting on event */
;;;331 OS_EXIT_CRITICAL();
;;;332 OS_Sched(); /* Find highest priority task ready to run */
;;;333 return (OS_NO_ERR);
;;;334 }
;;;335 if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
;;;336 OS_EXIT_CRITICAL();
;;;337 return (OS_MBOX_FULL);
;;;338 }
;;;339 pevent->OSEventPtr = msg; /* Place message in mailbox */
;;;340 OS_EXIT_CRITICAL();
;;;341 return (OS_NO_ERR);
;;;342 }
00037c e12fff1e BX lr
|L1.896|
000380 e3540000 CMP r4,#0 ;321
000384 1a000001 BNE |L1.912| ;321
000388 e3a00003 MOV r0,#3 ;322
00038c eafffff9 B |L1.888| ;322
|L1.912|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -