📄 os_q.txt
字号:
;;;264 OS_EXIT_CRITICAL();
000200 e1a00007 MOV r0,r7
000204 ebfffffe BL OS_CPU_SR_Restore
;;;265 *perr = OS_ERR_TASK_WAITING;
000208 e3a00049 MOV r0,#0x49
|L1.524|
;;;266 pevent_return = pevent;
;;;267 }
;;;268 break;
;;;269
;;;270 case OS_DEL_ALWAYS: /* Always delete the queue */
;;;271 while (pevent->OSEventGrp != 0) { /* Ready ALL tasks waiting for queue */
;;;272 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_OK);
;;;273 }
;;;274 #if OS_EVENT_NAME_SIZE > 1
;;;275 pevent->OSEventName[0] = '?'; /* Unknown name */
;;;276 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;277 #endif
;;;278 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
;;;279 pq->OSQPtr = OSQFreeList;
;;;280 OSQFreeList = pq;
;;;281 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;282 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;283 pevent->OSEventCnt = 0;
;;;284 OSEventFreeList = pevent; /* Get next free event control block */
;;;285 OS_EXIT_CRITICAL();
;;;286 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
;;;287 OS_Sched(); /* Find highest priority task ready to run */
;;;288 }
;;;289 *perr = OS_ERR_NONE;
;;;290 pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
;;;291 break;
;;;292
;;;293 default:
;;;294 OS_EXIT_CRITICAL();
;;;295 *perr = OS_ERR_INVALID_OPT;
00020c e5c50000 STRB r0,[r5,#0]
;;;296 pevent_return = pevent;
000210 e1a00004 MOV r0,r4
|L1.532|
000214 e8bd5ff0 POP {r4-r12,lr}
;;;297 break;
;;;298 }
;;;299 return (pevent_return);
;;;300 }
000218 e12fff1e BX lr
|L1.540|
00021c e3a03000 MOV r3,#0 ;272
000220 e3a02004 MOV r2,#4 ;272
000224 e1a01003 MOV r1,r3 ;272
000228 e1a00004 MOV r0,r4 ;272
00022c ebfffffe BL OS_EventTaskRdy
|L1.560|
000230 e5d4000a LDRB r0,[r4,#0xa] ;271
000234 e3500000 CMP r0,#0 ;271
000238 1afffff7 BNE |L1.540|
00023c e5c4800f STRB r8,[r4,#0xf] ;275
000240 e5c4b010 STRB r11,[r4,#0x10] ;276
000244 e5940004 LDR r0,[r4,#4] ;279
000248 e5991000 LDR r1,[r9,#0] ;279 ; OSQFreeList
00024c e5801000 STR r1,[r0,#0] ;280
000250 e5890000 STR r0,[r9,#0] ;280 ; OSQFreeList
000254 e5c4b000 STRB r11,[r4,#0] ;281
000258 e59a0000 LDR r0,[r10,#0] ;282 ; OSEventFreeList
00025c e5840004 STR r0,[r4,#4] ;282
000260 e1c4b0b8 STRH r11,[r4,#8] ;283
000264 e1a00007 MOV r0,r7 ;285
000268 e58a4000 STR r4,[r10,#0] ;285 ; OSEventFreeList
00026c ebfffffe BL OS_CPU_SR_Restore
000270 e3560001 CMP r6,#1 ;286
000274 0bfffffe BLEQ OS_Sched
|L1.632|
000278 e3a00000 MOV r0,#0 ;290
00027c e5c5b000 STRB r11,[r5,#0] ;289
000280 eaffffe3 B |L1.532|
|L1.644|
000284 e1a00007 MOV r0,r7 ;294
000288 ebfffffe BL OS_CPU_SR_Restore
00028c e3a00007 MOV r0,#7 ;295
000290 eaffffdd B |L1.524|
;;;301 #endif
ENDP
OSQFlush PROC
;;;324 INT8U OSQFlush (OS_EVENT *pevent)
;;;325 {
000294 e92d4010 PUSH {r4,lr}
000298 e1a04000 MOV r4,r0
;;;326 OS_Q *pq;
;;;327 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;328 OS_CPU_SR cpu_sr = 0;
;;;329 #endif
;;;330
;;;331
;;;332
;;;333 #if OS_ARG_CHK_EN > 0
;;;334 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;335 return (OS_ERR_PEVENT_NULL);
;;;336 }
;;;337 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;338 return (OS_ERR_EVENT_TYPE);
;;;339 }
;;;340 #endif
;;;341 OS_ENTER_CRITICAL();
00029c ebfffffe BL OS_CPU_SR_Save
;;;342 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue storage structure */
;;;343 pq->OSQIn = pq->OSQStart;
0002a0 e5941004 LDR r1,[r4,#4]
0002a4 e5912004 LDR r2,[r1,#4]
;;;344 pq->OSQOut = pq->OSQStart;
0002a8 e581200c STR r2,[r1,#0xc]
0002ac e5812010 STR r2,[r1,#0x10]
;;;345 pq->OSQEntries = 0;
0002b0 e3a02000 MOV r2,#0
0002b4 e1c121b6 STRH r2,[r1,#0x16]
;;;346 OS_EXIT_CRITICAL();
0002b8 ebfffffe BL OS_CPU_SR_Restore
;;;347 return (OS_ERR_NONE);
0002bc e8bd4010 POP {r4,lr}
0002c0 e3a00000 MOV r0,#0
;;;348 }
0002c4 e12fff1e BX lr
;;;349 #endif
ENDP
OSQPend PROC
;;;388 void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;389 {
0002c8 e92d47f0 PUSH {r4-r10,lr}
0002cc e1a07000 MOV r7,r0
;;;390 void *pmsg;
;;;391 OS_Q *pq;
;;;392 INT8U pend_stat;
;;;393 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;394 OS_CPU_SR cpu_sr = 0;
;;;395 #endif
;;;396
;;;397
;;;398
;;;399 #if OS_ARG_CHK_EN > 0
;;;400 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;401 return ((void *)0);
;;;402 }
;;;403 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;404 *perr = OS_ERR_PEVENT_NULL;
;;;405 return ((void *)0);
;;;406 }
;;;407 if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type */
;;;408 *perr = OS_ERR_EVENT_TYPE;
;;;409 return ((void *)0);
;;;410 }
;;;411 #endif
;;;412 if (OSIntNesting > 0) { /* See if called from ISR ... */
0002d0 e59f0544 LDR r0,|L1.2076|
0002d4 e1a08001 MOV r8,r1 ;389
0002d8 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0002dc e1a04002 MOV r4,r2 ;389
0002e0 e3500000 CMP r0,#0
;;;413 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
0002e4 13a00002 MOVNE r0,#2
;;;414 return ((void *)0);
0002e8 1a000004 BNE |L1.768|
;;;415 }
;;;416 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
0002ec e59f0534 LDR r0,|L1.2088|
0002f0 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0002f4 e3500000 CMP r0,#0
0002f8 0a000004 BEQ |L1.784|
;;;417 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
0002fc e3a0000d MOV r0,#0xd
|L1.768|
000300 e5c40000 STRB r0,[r4,#0] ;413
;;;418 return ((void *)0);
;;;419 }
;;;420 OS_ENTER_CRITICAL();
;;;421 pq = (OS_Q *)pevent->OSEventPtr; /* Point at queue control block */
;;;422 if (pq->OSQEntries > 0) { /* See if any messages in the queue */
;;;423 pmsg = *pq->OSQOut++; /* Yes, extract oldest message from the queue */
;;;424 pq->OSQEntries--; /* Update the number of entries in the queue */
;;;425 if (pq->OSQOut == pq->OSQEnd) { /* Wrap OUT pointer if we are at the end of the queue */
;;;426 pq->OSQOut = pq->OSQStart;
;;;427 }
;;;428 OS_EXIT_CRITICAL();
;;;429 *perr = OS_ERR_NONE;
;;;430 return (pmsg); /* Return message received */
;;;431 }
;;;432 OSTCBCur->OSTCBStat |= OS_STAT_Q; /* Task will have to pend for a message to be posted */
;;;433 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
;;;434 OSTCBCur->OSTCBDly = timeout; /* Load timeout into TCB */
;;;435 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;436 OS_EXIT_CRITICAL();
;;;437 OS_Sched(); /* Find next highest priority task ready to run */
;;;438 OS_ENTER_CRITICAL();
;;;439 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* Was task readied because timed-out or aborted?*/
;;;440 pend_stat = OSTCBCur->OSTCBStatPend;
;;;441 OS_EventTOAbort(pevent);
;;;442 OS_EXIT_CRITICAL();
;;;443 switch (pend_stat) {
;;;444 case OS_STAT_PEND_TO:
;;;445 default:
;;;446 *perr = OS_ERR_TIMEOUT; /* Indicate a timeout occured */
;;;447 break;
;;;448
;;;449 case OS_STAT_PEND_ABORT:
;;;450 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
;;;451 break;
;;;452 }
;;;453 return ((void *)0); /* No message received */
000304 e3a00000 MOV r0,#0
|L1.776|
000308 e8bd47f0 POP {r4-r10,lr}
;;;454 }
;;;455 pmsg = OSTCBCur->OSTCBMsg;/* No, Extract message from TCB (Put there by QPost) */
;;;456 OSTCBCur->OSTCBMsg = (void *)0;
;;;457 OSTCBCur->OSTCBStat = OS_STAT_RDY;
;;;458 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
;;;459 OS_EXIT_CRITICAL();
;;;460 *perr = OS_ERR_NONE;
;;;461 return (pmsg); /* Return message received */
;;;462 }
00030c e12fff1e BX lr
|L1.784|
000310 ebfffffe BL OS_CPU_SR_Save
000314 e5971004 LDR r1,[r7,#4] ;421
000318 e1a05000 MOV r5,r0 ;420
00031c e1d101b6 LDRH r0,[r1,#0x16] ;422
000320 e3a06000 MOV r6,#0 ;422
000324 e3500000 CMP r0,#0 ;422
000328 0a00000f BEQ |L1.876|
00032c e5910010 LDR r0,[r1,#0x10] ;423
000330 e2802004 ADD r2,r0,#4 ;423
000334 e5812010 STR r2,[r1,#0x10] ;423
000338 e5907000 LDR r7,[r0,#0] ;423
00033c e1d101b6 LDRH r0,[r1,#0x16] ;424
000340 e2400001 SUB r0,r0,#1 ;424
000344 e1c101b6 STRH r0,[r1,#0x16] ;424
000348 e5910008 LDR r0,[r1,#8] ;425
00034c e1520000 CMP r2,r0 ;425
000350 05910004 LDREQ r0,[r1,#4] ;426
000354 05810010 STREQ r0,[r1,#0x10] ;426
000358 e1a00005 MOV r0,r5 ;428
00035c ebfffffe BL OS_CPU_SR_Restore
000360 e1a00007 MOV r0,r7 ;430
000364 e5c46000 STRB r6,[r4,#0] ;429
000368 eaffffe6 B |L1.776|
|L1.876|
00036c e59f94b8 LDR r9,|L1.2092|
000370 e5991000 LDR r1,[r9,#0] ;432 ; OSTCBCur
000374 e5d1002c LDRB r0,[r1,#0x2c] ;432
000378 e3800004 ORR r0,r0,#4 ;432
00037c e5c1002c STRB r0,[r1,#0x2c] ;432
000380 e5c1602d STRB r6,[r1,#0x2d] ;433
000384 e1a00007 MOV r0,r7 ;435
000388 e1c182ba STRH r8,[r1,#0x2a] ;434
00038c ebfffffe BL OS_EventTaskWait
000390 e1a00005 MOV r0,r5 ;436
000394 ebfffffe BL OS_CPU_SR_Restore
000398 ebfffffe BL OS_Sched
00039c ebfffffe BL OS_CPU_SR_Save
0003a0 e5991000 LDR r1,[r9,#0] ;439 ; OSTCBCur
0003a4 e1a08000 MOV r8,r0 ;438
0003a8 e5d1502d LDRB r5,[r1,#0x2d] ;439
0003ac e3550000 CMP r5,#0 ;439
0003b0 0a000007 BEQ |L1.980|
0003b4 e1a00007 MOV r0,r7 ;441
0003b8 ebfffffe BL OS_EventTOAbort
0003bc e1a00008 MOV r0,r8 ;442
0003c0 ebfffffe BL OS_CPU_SR_Restore
0003c4 e3550002 CMP r5,#2 ;443
0003c8 03a0000e MOVEQ r0,#0xe ;450
0003cc 13a0000a MOVNE r0,#0xa ;446
0003d0 eaffffca B |L1.768|
|L1.980|
0003d4 e5915020 LDR r5,[r1,#0x20] ;456
0003d8 e5816020 STR r6,[r1,#0x20] ;456
0003dc e5c1602c STRB r6,[r1,#0x2c] ;457
0003e0 e1a00008 MOV r0,r8 ;459
0003e4 e581601c STR r6,[r1,#0x1c] ;459
0003e8 ebfffffe BL OS_CPU_SR_Restore
0003ec e1a00005 MOV r0,r5 ;461
0003f0 e5c46000 STRB r6,[r4,#0] ;460
0003f4 eaffffc3 B |L1.776|
;;;463 /*$PAGE*/
ENDP
OSQPendAbort PROC
;;;497 INT8U OSQPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;498 {
0003f8 e92d41f0 PUSH {r4-r8,lr}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -