📄 os_q.txt
字号:
;;;246 return (pevent);
;;;247 }
;;;248 }
|L1.424|
0001a8 e8bd81f0 POP {r4-r8,pc}
|L1.428|
0001ac e3540000 CMP r4,#0 ;193
0001b0 1a000003 BNE |L1.452| ;193
0001b4 e3a00004 MOV r0,#4 ;194
0001b8 e5c60000 STRB r0,[r6,#0] ;194
0001bc e1a00004 MOV r0,r4 ;195
0001c0 eafffff8 B |L1.424| ;195
|L1.452|
0001c4 e5d40000 LDRB r0,[r4,#0] ;197
0001c8 e3500002 CMP r0,#2 ;197
0001cc 0a000003 BEQ |L1.480| ;197
0001d0 e3a00001 MOV r0,#1 ;198
0001d4 e5c60000 STRB r0,[r6,#0] ;198
0001d8 e1a00004 MOV r0,r4 ;199
0001dc eafffff1 B |L1.424| ;199
|L1.480|
0001e0 ef000002 SVC 0x2 ; formerly SWI ;202
0001e4 e5d40001 LDRB r0,[r4,#1] ;203
0001e8 e3500000 CMP r0,#0 ;203
0001ec 0a000001 BEQ |L1.504| ;203
0001f0 e3a08001 MOV r8,#1 ;204
0001f4 ea000000 B |L1.508| ;204
|L1.504|
0001f8 e3a08000 MOV r8,#0 ;206
|L1.508|
0001fc e3550000 CMP r5,#0 ;208
000200 0a000002 BEQ |L1.528| ;208
000204 e3550001 CMP r5,#1 ;208
000208 1a000036 BNE |L1.744| ;208
00020c ea000018 B |L1.628| ;208
|L1.528|
000210 e1a00000 MOV r0,r0 ;209
000214 e3580000 CMP r8,#0 ;210
000218 1a000010 BNE |L1.608| ;210
00021c e5947004 LDR r7,[r4,#4] ;211
000220 e59f0660 LDR r0,|L1.2184| ;212
000224 e5900000 LDR r0,[r0,#0] ;212 ; OSQFreeList
000228 e5870000 STR r0,[r7,#0] ;212
00022c e59f0654 LDR r0,|L1.2184| ;213
000230 e5807000 STR r7,[r0,#0] ;213 ; OSQFreeList
000234 e3a00000 MOV r0,#0 ;214
000238 e5c40000 STRB r0,[r4,#0] ;214
00023c e59f0640 LDR r0,|L1.2180| ;215
000240 e5900000 LDR r0,[r0,#0] ;215 ; OSEventFreeList
000244 e5840004 STR r0,[r4,#4] ;215
000248 e59f0634 LDR r0,|L1.2180| ;216
00024c e5804000 STR r4,[r0,#0] ;216 ; OSEventFreeList
000250 ef000003 SVC 0x3 ; formerly SWI ;217
000254 e3a00000 MOV r0,#0 ;218
000258 e5c60000 STRB r0,[r6,#0] ;218
00025c eaffffd1 B |L1.424| ;219
|L1.608|
000260 ef000003 SVC 0x3 ; formerly SWI ;221
000264 e3a00008 MOV r0,#8 ;222
000268 e5c60000 STRB r0,[r6,#0] ;222
00026c e1a00004 MOV r0,r4 ;223
000270 eaffffcc B |L1.424| ;223
|L1.628|
000274 e1a00000 MOV r0,r0 ;226
000278 ea000003 B |L1.652| ;227
|L1.636|
00027c e3a02004 MOV r2,#4 ;228
000280 e3a01000 MOV r1,#0 ;228
000284 e1a00004 MOV r0,r4 ;228
000288 ebfffffe BL OS_EventTaskRdy ;228
|L1.652|
00028c e5d40001 LDRB r0,[r4,#1] ;227
000290 e3500000 CMP r0,#0 ;227
000294 1afffff8 BNE |L1.636| ;227
000298 e5947004 LDR r7,[r4,#4] ;230
00029c e59f05e4 LDR r0,|L1.2184| ;231
0002a0 e5900000 LDR r0,[r0,#0] ;231 ; OSQFreeList
0002a4 e5870000 STR r0,[r7,#0] ;231
0002a8 e59f05d8 LDR r0,|L1.2184| ;232
0002ac e5807000 STR r7,[r0,#0] ;232 ; OSQFreeList
0002b0 e3a00000 MOV r0,#0 ;233
0002b4 e5c40000 STRB r0,[r4,#0] ;233
0002b8 e59f05c4 LDR r0,|L1.2180| ;234
0002bc e5900000 LDR r0,[r0,#0] ;234 ; OSEventFreeList
0002c0 e5840004 STR r0,[r4,#4] ;234
0002c4 e59f05b8 LDR r0,|L1.2180| ;235
0002c8 e5804000 STR r4,[r0,#0] ;235 ; OSEventFreeList
0002cc ef000003 SVC 0x3 ; formerly SWI ;236
0002d0 e3580001 CMP r8,#1 ;237
0002d4 1a000000 BNE |L1.732| ;237
0002d8 ebfffffe BL OS_Sched ;238
|L1.732|
0002dc e3a00000 MOV r0,#0 ;240
0002e0 e5c60000 STRB r0,[r6,#0] ;240
0002e4 eaffffaf B |L1.424| ;241
|L1.744|
0002e8 e1a00000 MOV r0,r0 ;243
0002ec ef000003 SVC 0x3 ; formerly SWI ;244
0002f0 e3a00007 MOV r0,#7 ;245
0002f4 e5c60000 STRB r0,[r6,#0] ;245
0002f8 e1a00004 MOV r0,r4 ;246
0002fc eaffffa9 B |L1.424| ;246
ENDP
OSQFlush PROC
;;;267 INT8U OSQFlush (OS_EVENT *pevent)
;;;268 {
000300 e92d4070 PUSH {r4-r6,lr}
000304 e1a05000 MOV r5,r0
;;;269 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;270 OS_CPU_SR cpu_sr;
;;;271 #endif
;;;272 OS_Q *pq;
;;;273
;;;274
;;;275 #if OS_ARG_CHK_EN > 0
;;;276 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000308 e3550000 CMP r5,#0
00030c 1a000001 BNE |L1.792|
;;;277 return (OS_ERR_PEVENT_NULL);
000310 e3a00004 MOV r0,#4
;;;278 }
;;;279 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;280 return (OS_ERR_EVENT_TYPE);
;;;281 }
;;;282 #endif
;;;283 OS_ENTER_CRITICAL();
;;;284 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue storage structure */
;;;285 pq->OSQIn = pq->OSQStart;
;;;286 pq->OSQOut = pq->OSQStart;
;;;287 pq->OSQEntries = 0;
;;;288 OS_EXIT_CRITICAL();
;;;289 return (OS_NO_ERR);
;;;290 }
|L1.788|
000314 e8bd8070 POP {r4-r6,pc}
|L1.792|
000318 e5d50000 LDRB r0,[r5,#0] ;279
00031c e3500002 CMP r0,#2 ;279
000320 0a000001 BEQ |L1.812| ;279
000324 e3a00001 MOV r0,#1 ;280
000328 eafffff9 B |L1.788| ;280
|L1.812|
00032c ef000002 SVC 0x2 ; formerly SWI ;283
000330 e5954004 LDR r4,[r5,#4] ;284
000334 e5940004 LDR r0,[r4,#4] ;285
000338 e584000c STR r0,[r4,#0xc] ;285
00033c e5940004 LDR r0,[r4,#4] ;286
000340 e5840010 STR r0,[r4,#0x10] ;286
000344 e3a00000 MOV r0,#0 ;287
000348 e1c401b6 STRH r0,[r4,#0x16] ;287
00034c ef000003 SVC 0x3 ; formerly SWI ;288
000350 e3a00000 MOV r0,#0 ;289
000354 eaffffee B |L1.788| ;289
ENDP
OSQPend PROC
;;;325 void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;326 {
000358 e92d41f0 PUSH {r4-r8,lr}
00035c e1a04000 MOV r4,r0
000360 e1a05001 MOV r5,r1
000364 e1a06002 MOV r6,r2
;;;327 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;328 OS_CPU_SR cpu_sr;
;;;329 #endif
;;;330 void *msg;
;;;331 OS_Q *pq;
;;;332
;;;333
;;;334 if (OSIntNesting > 0) { /* See if called from ISR ... */
000368 e59f0510 LDR r0,|L1.2176|
00036c e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000370 e3500000 CMP r0,#0
000374 da000003 BLE |L1.904|
;;;335 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000378 e3a00002 MOV r0,#2
00037c e5c60000 STRB r0,[r6,#0]
;;;336 return ((void *)0);
000380 e3a00000 MOV r0,#0
;;;337 }
;;;338 #if OS_ARG_CHK_EN > 0
;;;339 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;340 *err = OS_ERR_PEVENT_NULL;
;;;341 return ((void *)0);
;;;342 }
;;;343 if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type */
;;;344 *err = OS_ERR_EVENT_TYPE;
;;;345 return ((void *)0);
;;;346 }
;;;347 #endif
;;;348 OS_ENTER_CRITICAL();
;;;349 pq = (OS_Q *)pevent->OSEventPtr; /* Point at queue control block */
;;;350 if (pq->OSQEntries != 0) { /* See if any messages in the queue */
;;;351 msg = *pq->OSQOut++; /* Yes, extract oldest message from the queue */
;;;352 pq->OSQEntries--; /* Update the number of entries in the queue */
;;;353 if (pq->OSQOut == pq->OSQEnd) { /* Wrap OUT pointer if we are at the end of the queue */
;;;354 pq->OSQOut = pq->OSQStart;
;;;355 }
;;;356 OS_EXIT_CRITICAL();
;;;357 *err = OS_NO_ERR;
;;;358 return (msg); /* Return message received */
;;;359 }
;;;360 OSTCBCur->OSTCBStat |= OS_STAT_Q; /* Task will have to pend for a message to be posted */
;;;361 OSTCBCur->OSTCBDly = timeout; /* Load timeout into TCB */
;;;362 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;363 OS_EXIT_CRITICAL();
;;;364 OS_Sched(); /* Find next highest priority task ready to run */
;;;365 OS_ENTER_CRITICAL();
;;;366 msg = OSTCBCur->OSTCBMsg;
;;;367 if (msg != (void *)0) { /* Did we get a message? */
;;;368 OSTCBCur->OSTCBMsg = (void *)0; /* Extract message from TCB (Put there by QPost) */
;;;369 OSTCBCur->OSTCBStat = OS_STAT_RDY;
;;;370 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
;;;371 OS_EXIT_CRITICAL();
;;;372 *err = OS_NO_ERR;
;;;373 return (msg); /* Return message received */
;;;374 }
;;;375 OS_EventTO(pevent); /* Timed out */
;;;376 OS_EXIT_CRITICAL();
;;;377 *err = OS_TIMEOUT; /* Indicate a timeout occured */
;;;378 return ((void *)0); /* No message received */
;;;379 }
|L1.900|
000384 e8bd81f0 POP {r4-r8,pc}
|L1.904|
000388 e3540000 CMP r4,#0 ;339
00038c 1a000003 BNE |L1.928| ;339
000390 e3a00004 MOV r0,#4 ;340
000394 e5c60000 STRB r0,[r6,#0] ;340
000398 e3a00000 MOV r0,#0 ;341
00039c eafffff8 B |L1.900| ;341
|L1.928|
0003a0 e5d40000 LDRB r0,[r4,#0] ;343
0003a4 e3500002 CMP r0,#2 ;343
0003a8 0a000003 BEQ |L1.956| ;343
0003ac e3a00001 MOV r0,#1 ;344
0003b0 e5c60000 STRB r0,[r6,#0] ;344
0003b4 e3a00000 MOV r0,#0 ;345
0003b8 eafffff1 B |L1.900| ;345
|L1.956|
0003bc ef000002 SVC 0x2 ; formerly SWI ;348
0003c0 e5947004 LDR r7,[r4,#4] ;349
0003c4 e1d701b6 LDRH r0,[r7,#0x16] ;350
0003c8 e3500000 CMP r0,#0 ;350
0003cc 0a000011 BEQ |L1.1048| ;350
0003d0 e5970010 LDR r0,[r7,#0x10] ;351
0003d4 e2801004 ADD r1,r0,#4 ;351
0003d8 e5871010 STR r1,[r7,#0x10] ;351
0003dc e5908000 LDR r8,[r0,#0] ;351
0003e0 e1d701b6 LDRH r0,[r7,#0x16] ;352
0003e4 e2400001 SUB r0,r0,#1 ;352
0003e8 e1c701b6 STRH r0,[r7,#0x16] ;352
0003ec e5970010 LDR r0,[r7,#0x10] ;353
0003f0 e5971008 LDR r1,[r7,#8] ;353
0003f4 e1500001 CMP r0,r1 ;353
0003f8 1a000001 BNE |L1.1028| ;353
0003fc e5970004 LDR r0,[r7,#4] ;354
000400 e5870010 STR r0,[r7,#0x10] ;354
|L1.1028|
000404 ef000003 SVC 0x3 ; formerly SWI ;356
000408 e3a00000 MOV r0,#0 ;357
00040c e5c60000 STRB r0,[r6,#0] ;357
000410 e1a00008 MOV r0,r8 ;358
000414 eaffffda B |L1.900| ;358
|L1.1048|
000418 e59f046c LDR r0,|L1.2188| ;360
00041c e5900000 LDR r0,[r0,#0] ;360 ; OSTCBCur
000420 e5d0001c LDRB r0,[r0,#0x1c] ;360
000424 e3800004 ORR r0,r0,#4 ;360
000428 e59f145c LDR r1,|L1.2188| ;360
00042c e5911000 LDR r1,[r1,#0] ;360 ; OSTCBCur
000430 e5c1001c STRB r0,[r1,#0x1c] ;360
000434 e59f0450 LDR r0,|L1.2188| ;361
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -