📄 os_q.txt
字号:
000458 e3560000 CMP r6,#0
00045c 1a000002 BNE |L1.1132|
;;;401 return ((void *)0);
000460 e3a00000 MOV r0,#0
|L1.1124|
000464 e8bd47f0 POP {r4-r10,lr}
;;;402 }
;;;403 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;404 *err = OS_ERR_PEVENT_NULL;
;;;405 return ((void *)0);
;;;406 }
;;;407 if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type */
;;;408 *err = OS_ERR_EVENT_TYPE;
;;;409 return ((void *)0);
;;;410 }
;;;411 #endif
;;;412 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;413 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
;;;414 return ((void *)0);
;;;415 }
;;;416 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;417 *err = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;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 msg = *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 *err = OS_ERR_NONE;
;;;430 return (msg); /* 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 *err = OS_ERR_TIMEOUT; /* Indicate a timeout occured */
;;;447 break;
;;;448
;;;449 case OS_STAT_PEND_ABORT:
;;;450 *err = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
;;;451 break;
;;;452 }
;;;453 return ((void *)0); /* No message received */
;;;454 }
;;;455 msg = 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 *err = OS_ERR_NONE;
;;;461 return (msg); /* Return message received */
;;;462 }
000468 e12fff1e BX lr
|L1.1132|
00046c e3540000 CMP r4,#0
000470 1a000003 BNE |L1.1156|
000474 e3a00004 MOV r0,#4
000478 e5c60000 STRB r0,[r6,#0]
00047c e3a00000 MOV r0,#0
000480 eafffff7 B |L1.1124|
|L1.1156|
000484 e5d40000 LDRB r0,[r4,#0]
000488 e3500002 CMP r0,#2
00048c 0a000003 BEQ |L1.1184|
000490 e3a00001 MOV r0,#1
000494 e5c60000 STRB r0,[r6,#0]
000498 e3a00000 MOV r0,#0
00049c eafffff0 B |L1.1124|
|L1.1184|
0004a0 e59f06fc LDR r0,|L1.2980|
0004a4 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0004a8 e3500000 CMP r0,#0
0004ac da000003 BLE |L1.1216|
0004b0 e3a00002 MOV r0,#2
0004b4 e5c60000 STRB r0,[r6,#0]
0004b8 e3a00000 MOV r0,#0
0004bc eaffffe8 B |L1.1124|
|L1.1216|
0004c0 e59f06e8 LDR r0,|L1.2992|
0004c4 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0004c8 e3500000 CMP r0,#0
0004cc da000003 BLE |L1.1248|
0004d0 e3a0000d MOV r0,#0xd
0004d4 e5c60000 STRB r0,[r6,#0]
0004d8 e3a00000 MOV r0,#0
0004dc eaffffe0 B |L1.1124|
|L1.1248|
0004e0 ebfffffe BL OS_CPU_SR_Save
0004e4 e1a0a000 MOV r10,r0
0004e8 e5948004 LDR r8,[r4,#4]
0004ec e1d801b6 LDRH r0,[r8,#0x16]
0004f0 e3500000 CMP r0,#0
0004f4 da000012 BLE |L1.1348|
0004f8 e5980010 LDR r0,[r8,#0x10]
0004fc e2801004 ADD r1,r0,#4
000500 e5881010 STR r1,[r8,#0x10]
000504 e5907000 LDR r7,[r0,#0]
000508 e1d801b6 LDRH r0,[r8,#0x16]
00050c e2400001 SUB r0,r0,#1
000510 e1c801b6 STRH r0,[r8,#0x16]
000514 e5980010 LDR r0,[r8,#0x10]
000518 e5981008 LDR r1,[r8,#8]
00051c e1500001 CMP r0,r1
000520 1a000001 BNE |L1.1324|
000524 e5980004 LDR r0,[r8,#4]
000528 e5880010 STR r0,[r8,#0x10]
|L1.1324|
00052c e1a0000a MOV r0,r10
000530 ebfffffe BL OS_CPU_SR_Restore
000534 e3a00000 MOV r0,#0
000538 e5c60000 STRB r0,[r6,#0]
00053c e1a00007 MOV r0,r7
000540 eaffffc7 B |L1.1124|
|L1.1348|
000544 e59f0668 LDR r0,|L1.2996|
000548 e5900000 LDR r0,[r0,#0] ; OSTCBCur
00054c e5d0002c LDRB r0,[r0,#0x2c]
000550 e3800004 ORR r0,r0,#4
000554 e59f1658 LDR r1,|L1.2996|
000558 e5911000 LDR r1,[r1,#0] ; OSTCBCur
00055c e5c1002c STRB r0,[r1,#0x2c]
000560 e3a00000 MOV r0,#0
000564 e59f1648 LDR r1,|L1.2996|
000568 e5911000 LDR r1,[r1,#0] ; OSTCBCur
00056c e5c1002d STRB r0,[r1,#0x2d]
000570 e59f063c LDR r0,|L1.2996|
000574 e5900000 LDR r0,[r0,#0] ; OSTCBCur
000578 e1c052ba STRH r5,[r0,#0x2a]
00057c e1a00004 MOV r0,r4
000580 ebfffffe BL OS_EventTaskWait
000584 e1a0000a MOV r0,r10
000588 ebfffffe BL OS_CPU_SR_Restore
00058c ebfffffe BL OS_Sched
000590 ebfffffe BL OS_CPU_SR_Save
000594 e1a0a000 MOV r10,r0
000598 e59f0614 LDR r0,|L1.2996|
00059c e5900000 LDR r0,[r0,#0] ; OSTCBCur
0005a0 e5d0002d LDRB r0,[r0,#0x2d]
0005a4 e3500000 CMP r0,#0
0005a8 0a000017 BEQ |L1.1548|
0005ac e59f0600 LDR r0,|L1.2996|
0005b0 e5900000 LDR r0,[r0,#0] ; OSTCBCur
0005b4 e5d0902d LDRB r9,[r0,#0x2d]
0005b8 e1a00004 MOV r0,r4
0005bc ebfffffe BL OS_EventTOAbort
0005c0 e1a0000a MOV r0,r10
0005c4 ebfffffe BL OS_CPU_SR_Restore
0005c8 e3590001 CMP r9,#1
0005cc 0a000002 BEQ |L1.1500|
0005d0 e3590002 CMP r9,#2
0005d4 0a000005 BEQ |L1.1520|
0005d8 ea000001 B |L1.1508|
|L1.1500|
0005dc e1a00000 MOV r0,r0
0005e0 e1a00000 MOV r0,r0
|L1.1508|
0005e4 e3a0000a MOV r0,#0xa
0005e8 e5c60000 STRB r0,[r6,#0]
0005ec ea000003 B |L1.1536|
|L1.1520|
0005f0 e1a00000 MOV r0,r0
0005f4 e3a0000e MOV r0,#0xe
0005f8 e5c60000 STRB r0,[r6,#0]
0005fc e1a00000 MOV r0,r0
|L1.1536|
000600 e1a00000 MOV r0,r0
000604 e3a00000 MOV r0,#0
000608 eaffff95 B |L1.1124|
|L1.1548|
00060c e59f05a0 LDR r0,|L1.2996|
000610 e5900000 LDR r0,[r0,#0] ; OSTCBCur
000614 e5907020 LDR r7,[r0,#0x20]
000618 e3a00000 MOV r0,#0
00061c e59f1590 LDR r1,|L1.2996|
000620 e5911000 LDR r1,[r1,#0] ; OSTCBCur
000624 e5810020 STR r0,[r1,#0x20]
000628 e59f1584 LDR r1,|L1.2996|
00062c e5911000 LDR r1,[r1,#0] ; OSTCBCur
000630 e5c1002c STRB r0,[r1,#0x2c]
000634 e59f1578 LDR r1,|L1.2996|
000638 e5911000 LDR r1,[r1,#0] ; OSTCBCur
00063c e581001c STR r0,[r1,#0x1c]
000640 e1a0000a MOV r0,r10
000644 ebfffffe BL OS_CPU_SR_Restore
000648 e3a00000 MOV r0,#0
00064c e5c60000 STRB r0,[r6,#0]
000650 e1a00007 MOV r0,r7
000654 eaffff82 B |L1.1124|
ENDP
OSQPendAbort PROC
;;;497 INT8U OSQPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;498 {
000658 e92d41f0 PUSH {r4-r8,lr}
00065c e1a04000 MOV r4,r0
000660 e1a05001 MOV r5,r1
000664 e1a06002 MOV r6,r2
;;;499 INT8U nbr_tasks;
;;;500 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;501 OS_CPU_SR cpu_sr = 0;
000668 e3a08000 MOV r8,#0
;;;502 #endif
;;;503
;;;504
;;;505
;;;506 #if OS_ARG_CHK_EN > 0
;;;507 if (err == (INT8U *)0) { /* Validate 'err' */
00066c e3560000 CMP r6,#0
000670 1a000002 BNE |L1.1664|
;;;508 return (0);
000674 e3a00000 MOV r0,#0
|L1.1656|
000678 e8bd41f0 POP {r4-r8,lr}
;;;509 }
;;;510 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;511 *err = OS_ERR_PEVENT_NULL;
;;;512 return (0);
;;;513 }
;;;514 #endif
;;;515 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;516 *err = OS_ERR_EVENT_TYPE;
;;;517 return (0);
;;;518 }
;;;519 OS_ENTER_CRITICAL();
;;;520 if (pevent->OSEventGrp != 0) { /* See if any task waiting on queue? */
;;;521 nbr_tasks = 0;
;;;522 switch (opt) {
;;;523 case OS_PEND_OPT_BROADCAST: /* Do we need to abort ALL waiting tasks? */
;;;524 while (pevent->OSEventGrp != 0) { /* Yes, ready ALL tasks waiting on queue */
;;;525 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_ABORT);
;;;526 nbr_tasks++;
;;;527 }
;;;528 break;
;;;529
;;;530 case OS_PEND_OPT_NONE: /* No, ready HPT waiting on queue */
;;;531 default:
;;;532 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_ABORT);
;;;533 nbr_tasks++;
;;;534 break;
;;;535 }
;;;536 OS_EXIT_CRITICAL();
;;;537 OS_Sched(); /* Find HPT ready to run */
;;;538 *err = OS_ERR_PEND_ABORT;
;;;539 return (nbr_tasks);
;;;540 }
;;;541 OS_EXIT_CRITICAL();
;;;542 *err = OS_ERR_NONE;
;;;543 return (0); /* No tasks waiting on queue */
;;;544 }
00067c e12fff1e BX lr
|L1.1664|
000680 e3540000 CMP r4,#0
000684 1a000003 BNE |L1.1688|
000688 e3a00004 MOV r0,#4
00068c e5c60000 STRB r0,[r6,#0]
000690 e3a00000 MOV r0,#0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -