📄 os_flag.txt
字号:
0003ac 604e STR r6,[r1,#4]
;;;1005 pnode->OSFlagNodeFlagGrp = (void *)pgrp; /* Link to Event Flag Group */
0003ae 60c8 STR r0,[r1,#0xc]
;;;1006 pnode_next = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
0003b0 6842 LDR r2,[r0,#4]
;;;1007 if (pnode_next != (void *)0) { /* Is this the first NODE to insert? */
0003b2 b102 CBZ r2,|L1.950|
;;;1008 pnode_next->OSFlagNodePrev = pnode; /* No, link in doubly linked list */
0003b4 6051 STR r1,[r2,#4]
|L1.950|
;;;1009 }
;;;1010 pgrp->OSFlagWaitList = (void *)pnode;
0003b6 6041 STR r1,[r0,#4]
;;;1011
;;;1012 y = OSTCBCur->OSTCBY; /* Suspend current task until flag(s) received */
0003b8 6829 LDR r1,[r5,#0] ; OSTCBCur
0003ba f891f891 LDRB r0,[r1,#0x30]
;;;1013 OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
0003be 4a48 LDR r2,|L1.1248|
0003c0 f891f891 LDRB r12,[r1,#0x31]
0003c4 5c13 LDRB r3,[r2,r0]
0003c6 ea23ea23 BIC r3,r3,r12
0003ca 5413 STRB r3,[r2,r0]
;;;1014 if (OSRdyTbl[y] == 0x00) {
0003cc 5c10 LDRB r0,[r2,r0]
0003ce 2800 CMP r0,#0
0003d0 d106 BNE |L1.992|
;;;1015 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
0003d2 4842 LDR r0,|L1.1244|
0003d4 f891f891 LDRB r1,[r1,#0x32]
0003d8 7802 LDRB r2,[r0,#0] ; OSRdyGrp
0003da ea22ea22 BIC r1,r2,r1
0003de 7001 STRB r1,[r0,#0] ; OSRdyGrp
|L1.992|
;;;1016 }
;;;1017 }
0003e0 bc70 POP {r4-r6}
0003e2 4770 BX lr
;;;1018
ENDP
OSFlagPend PROC
;;;560 OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *perr)
;;;561 {
0003e4 e92de92d PUSH {r0-r11,lr}
0003e8 b087 SUB sp,sp,#0x1c
0003ea 9c14 LDR r4,[sp,#0x50]
0003ec 4605 MOV r5,r0
0003ee 460f MOV r7,r1
0003f0 4690 MOV r8,r2
;;;562 OS_FLAG_NODE node;
;;;563 OS_FLAGS flags_rdy;
;;;564 INT8U result;
;;;565 INT8U pend_stat;
;;;566 BOOLEAN consume;
;;;567 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;568 OS_CPU_SR cpu_sr = 0;
;;;569 #endif
;;;570
;;;571
;;;572
;;;573 #if OS_ARG_CHK_EN > 0
;;;574 if (perr == (INT8U *)0) { /* Validate 'perr' */
0003f2 b91c CBNZ r4,|L1.1020|
;;;575 return ((OS_FLAGS)0);
0003f4 2000 MOVS r0,#0
0003f6 b00b ADD sp,sp,#0x2c
0003f8 e8bde8bd POP {r4-r11,pc}
|L1.1020|
;;;576 }
;;;577 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
0003fc b92d CBNZ r5,|L1.1034|
;;;578 *perr = OS_ERR_FLAG_INVALID_PGRP;
0003fe 206e MOVS r0,#0x6e
000400 7020 STRB r0,[r4,#0]
;;;579 return ((OS_FLAGS)0);
000402 2000 MOVS r0,#0
000404 b00b ADD sp,sp,#0x2c
000406 e8bde8bd POP {r4-r11,pc}
|L1.1034|
;;;580 }
;;;581 #endif
;;;582 if (OSIntNesting > 0) { /* See if called from ISR ... */
00040a 4832 LDR r0,|L1.1236|
00040c 7800 LDRB r0,[r0,#0] ; OSIntNesting
00040e b128 CBZ r0,|L1.1052|
;;;583 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000410 2002 MOVS r0,#2
000412 7020 STRB r0,[r4,#0]
;;;584 return ((OS_FLAGS)0);
000414 2000 MOVS r0,#0
000416 b00b ADD sp,sp,#0x2c
000418 e8bde8bd POP {r4-r11,pc}
|L1.1052|
;;;585 }
;;;586 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
00041c 4832 LDR r0,|L1.1256|
00041e 7800 LDRB r0,[r0,#0] ; OSLockNesting
000420 b128 CBZ r0,|L1.1070|
;;;587 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
000422 200d MOVS r0,#0xd
000424 7020 STRB r0,[r4,#0]
;;;588 return ((OS_FLAGS)0);
000426 2000 MOVS r0,#0
000428 b00b ADD sp,sp,#0x2c
00042a e8bde8bd POP {r4-r11,pc}
|L1.1070|
;;;589 }
;;;590 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
00042e 7828 LDRB r0,[r5,#0]
000430 2805 CMP r0,#5
000432 d005 BEQ |L1.1088|
;;;591 *perr = OS_ERR_EVENT_TYPE;
000434 2001 MOVS r0,#1
000436 7020 STRB r0,[r4,#0]
;;;592 return ((OS_FLAGS)0);
000438 2000 MOVS r0,#0
00043a b00b ADD sp,sp,#0x2c
00043c e8bde8bd POP {r4-r11,pc}
|L1.1088|
;;;593 }
;;;594 result = (INT8U)(wait_type & OS_FLAG_CONSUME);
000440 f008f008 AND r0,r8,#0x80
;;;595 if (result != (INT8U)0) { /* See if we need to consume the flags */
000444 b118 CBZ r0,|L1.1102|
;;;596 wait_type &= ~(INT8U)OS_FLAG_CONSUME;
000446 f028f028 BIC r8,r8,#0x80
;;;597 consume = OS_TRUE;
00044a 2601 MOVS r6,#1
00044c e000 B |L1.1104|
|L1.1102|
;;;598 } else {
;;;599 consume = OS_FALSE;
00044e 2600 MOVS r6,#0
|L1.1104|
;;;600 }
;;;601 /*$PAGE*/
;;;602 OS_ENTER_CRITICAL();
000450 f7fff7ff BL OS_CPU_SR_Save
000454 9001 STR r0,[sp,#4]
;;;603 switch (wait_type) {
000456 f8dff8df LDR r10,|L1.1252|
00045a f04ff04f MOV r9,#0
00045e f1b8f1b8 CMP r8,#0
000462 d05b BEQ |L1.1308|
000464 f1b8f1b8 CMP r8,#1
000468 d07b BEQ |L1.1378|
00046a f1b8f1b8 CMP r8,#2
00046e d01a BEQ |L1.1190|
000470 f1b8f1b8 CMP r8,#3
000474 d174 BNE |L1.1376|
;;;604 case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
;;;605 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
;;;606 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
;;;607 if (consume == OS_TRUE) { /* See if we need to consume the flags */
;;;608 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
;;;609 }
;;;610 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
;;;611 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;612 *perr = OS_ERR_NONE;
;;;613 return (flags_rdy);
;;;614 } else { /* Block task until events occur or timeout */
;;;615 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;616 OS_EXIT_CRITICAL();
;;;617 }
;;;618 break;
;;;619
;;;620 case OS_FLAG_WAIT_SET_ANY:
;;;621 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
000476 8928 LDRH r0,[r5,#8]
000478 ea00ea00 AND r11,r0,r7
;;;622 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
00047c f1bbf1bb CMP r11,#0
000480 d040 BEQ |L1.1284|
;;;623 if (consume == OS_TRUE) { /* See if we need to consume the flags */
000482 2e01 CMP r6,#1
000484 d102 BNE |L1.1164|
;;;624 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
000486 ea20ea20 BIC r0,r0,r11
00048a 8128 STRH r0,[r5,#8]
|L1.1164|
;;;625 }
;;;626 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
00048c f8daf8da LDR r0,[r10,#0] ; OSTCBCur
000490 f8a0f8a0 STRH r11,[r0,#0x28]
;;;627 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
000494 9801 LDR r0,[sp,#4]
000496 f7fff7ff BL OS_CPU_SR_Restore
;;;628 *perr = OS_ERR_NONE;
00049a f884f884 STRB r9,[r4,#0]
;;;629 return (flags_rdy);
00049e 4658 MOV r0,r11
0004a0 b00b ADD sp,sp,#0x2c
0004a2 e8bde8bd POP {r4-r11,pc}
|L1.1190|
0004a6 8928 LDRH r0,[r5,#8]
0004a8 ea00ea00 AND r11,r0,r7
0004ac 45bb CMP r11,r7
0004ae d11d BNE |L1.1260|
0004b0 2e01 CMP r6,#1
0004b2 d102 BNE |L1.1210|
0004b4 ea20ea20 BIC r0,r0,r11
0004b8 8128 STRH r0,[r5,#8]
|L1.1210|
0004ba f8daf8da LDR r0,[r10,#0] ; OSTCBCur
0004be f8a0f8a0 STRH r11,[r0,#0x28]
0004c2 9801 LDR r0,[sp,#4]
0004c4 f7fff7ff BL OS_CPU_SR_Restore
0004c8 f884f884 STRB r9,[r4,#0]
0004cc 4658 MOV r0,r11
|L1.1230|
0004ce b00b ADD sp,sp,#0x2c
0004d0 e8bde8bd POP {r4-r11,pc}
|L1.1236|
0004d4 00000000 DCD OSIntNesting
|L1.1240|
0004d8 00000000 DCD OSFlagFreeList
|L1.1244|
0004dc 00000000 DCD OSRdyGrp
|L1.1248|
0004e0 00000000 DCD OSRdyTbl
|L1.1252|
0004e4 00000000 DCD OSTCBCur
|L1.1256|
0004e8 00000000 DCD OSLockNesting
|L1.1260|
0004ec 9b0a LDR r3,[sp,#0x28]
0004ee 9300 STR r3,[sp,#0]
0004f0 4643 MOV r3,r8
0004f2 463a MOV r2,r7
0004f4 a902 ADD r1,sp,#8
0004f6 4628 MOV r0,r5
0004f8 f7fff7ff BL OS_FlagBlock
0004fc 9801 LDR r0,[sp,#4]
0004fe f7fff7ff BL OS_CPU_SR_Restore
000502 e04f B |L1.1444|
|L1.1284|
;;;630 } else { /* Block task until events occur or timeout */
;;;631 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
000504 9b0a LDR r3,[sp,#0x28]
000506 9300 STR r3,[sp,#0]
000508 4643 MOV r3,r8
00050a 463a MOV r2,r7
00050c a902 ADD r1,sp,#8
00050e 4628 MOV r0,r5
000510 f7fff7ff BL OS_FlagBlock
;;;632 OS_EXIT_CRITICAL();
000514 9801 LDR r0,[sp,#4]
000516 f7fff7ff BL OS_CPU_SR_Restore
00051a e043 B |L1.1444|
|L1.1308|
;;;633 }
;;;634 break;
;;;635
;;;636 #if OS_FLAG_WAIT_CLR_EN > 0
;;;637 case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
;;;638 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
00051c 8928 LDRH r0,[r5,#8]
00051e ea27ea27 BIC r11,r7,r0
;;;639 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
000522 45bb CMP r11,r7
000524 d10f BNE |L1.1350|
;;;640 if (consume == OS_TRUE) { /* See if we need to consume the flags */
000526 2e01 CMP r6,#1
000528 d102 BNE |L1.1328|
;;;641 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
00052a ea40ea40 ORR r0,r0,r11
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -