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