📄 os_flag.txt
字号:
;;;403
;;;404
;;;405 #if OS_ARG_CHK_EN > 0
;;;406 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;407 return (0);
;;;408 }
;;;409 if (pgrp == (OS_FLAG_GRP *)0) { /* Is 'pgrp' a NULL pointer? */
;;;410 *perr = OS_ERR_FLAG_INVALID_PGRP;
;;;411 return (0);
;;;412 }
;;;413 if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
;;;414 *perr = OS_ERR_PNAME_NULL;
;;;415 return (0);
;;;416 }
;;;417 #endif
;;;418 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
00034c e59f0594 LDR r0,|L1.2280|
000350 e1a07001 MOV r7,r1 ;397
000354 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000358 e1a05002 MOV r5,r2 ;397
00035c e3500000 CMP r0,#0
;;;419 *perr = OS_ERR_NAME_GET_ISR;
000360 13a00011 MOVNE r0,#0x11
;;;420 return (0);
000364 1a000007 BNE |L1.904|
;;;421 }
;;;422 OS_ENTER_CRITICAL();
000368 ebfffffe BL OS_CPU_SR_Save
00036c e1a04000 MOV r4,r0
;;;423 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
000370 e5d60000 LDRB r0,[r6,#0]
000374 e3500005 CMP r0,#5
000378 0a000006 BEQ |L1.920|
;;;424 OS_EXIT_CRITICAL();
00037c e1a00004 MOV r0,r4
000380 ebfffffe BL OS_CPU_SR_Restore
;;;425 *perr = OS_ERR_EVENT_TYPE;
000384 e3a00001 MOV r0,#1
|L1.904|
000388 e5c50000 STRB r0,[r5,#0]
;;;426 return (0);
00038c e3a00000 MOV r0,#0
|L1.912|
000390 e8bd41f0 POP {r4-r8,lr}
;;;427 }
;;;428 len = OS_StrCopy(pname, pgrp->OSFlagName); /* Copy name from OS_FLAG_GRP */
;;;429 OS_EXIT_CRITICAL();
;;;430 *perr = OS_ERR_NONE;
;;;431 return (len);
;;;432 }
000394 e12fff1e BX lr
|L1.920|
000398 e286100a ADD r1,r6,#0xa ;428
00039c e1a00007 MOV r0,r7 ;428
0003a0 ebfffffe BL OS_StrCopy
0003a4 e1a06000 MOV r6,r0 ;428
0003a8 e1a00004 MOV r0,r4 ;429
0003ac ebfffffe BL OS_CPU_SR_Restore
0003b0 e3a00000 MOV r0,#0 ;430
0003b4 e5c50000 STRB r0,[r5,#0] ;430
0003b8 e1a00006 MOV r0,r6 ;431
0003bc eafffff3 B |L1.912|
;;;433 #endif
ENDP
OSFlagNameSet PROC
;;;460 void OSFlagNameSet (OS_FLAG_GRP *pgrp, INT8U *pname, INT8U *perr)
;;;461 {
0003c0 e92d41f0 PUSH {r4-r8,lr}
0003c4 e1a06000 MOV r6,r0
;;;462 INT8U len;
;;;463 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;464 OS_CPU_SR cpu_sr = 0;
;;;465 #endif
;;;466
;;;467
;;;468
;;;469 #if OS_ARG_CHK_EN > 0
;;;470 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;471 return;
;;;472 }
;;;473 if (pgrp == (OS_FLAG_GRP *)0) { /* Is 'pgrp' a NULL pointer? */
;;;474 *perr = OS_ERR_FLAG_INVALID_PGRP;
;;;475 return;
;;;476 }
;;;477 if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
;;;478 *perr = OS_ERR_PNAME_NULL;
;;;479 return;
;;;480 }
;;;481 #endif
;;;482 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
0003c8 e59f0518 LDR r0,|L1.2280|
0003cc e1a07001 MOV r7,r1 ;461
0003d0 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0003d4 e1a04002 MOV r4,r2 ;461
0003d8 e3500000 CMP r0,#0
;;;483 *perr = OS_ERR_NAME_SET_ISR;
0003dc 13a00012 MOVNE r0,#0x12
;;;484 return;
0003e0 1a000016 BNE |L1.1088|
;;;485 }
;;;486 OS_ENTER_CRITICAL();
0003e4 ebfffffe BL OS_CPU_SR_Save
0003e8 e1a05000 MOV r5,r0
;;;487 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
0003ec e5d60000 LDRB r0,[r6,#0]
0003f0 e3500005 CMP r0,#5
0003f4 0a000003 BEQ |L1.1032|
;;;488 OS_EXIT_CRITICAL();
0003f8 e1a00005 MOV r0,r5
0003fc ebfffffe BL OS_CPU_SR_Restore
;;;489 *perr = OS_ERR_EVENT_TYPE;
000400 e3a00001 MOV r0,#1
;;;490 return;
000404 ea00000d B |L1.1088|
|L1.1032|
;;;491 }
;;;492 len = OS_StrLen(pname); /* Can we fit the string in the storage area? */
000408 e1a00007 MOV r0,r7
00040c ebfffffe BL OS_StrLen
;;;493 if (len > (OS_FLAG_NAME_SIZE - 1)) { /* No */
000410 e350000f CMP r0,#0xf
000414 9a000003 BLS |L1.1064|
;;;494 OS_EXIT_CRITICAL();
000418 e1a00005 MOV r0,r5
00041c ebfffffe BL OS_CPU_SR_Restore
;;;495 *perr = OS_ERR_FLAG_NAME_TOO_LONG;
000420 e3a00073 MOV r0,#0x73
;;;496 return;
000424 ea000005 B |L1.1088|
|L1.1064|
;;;497 }
;;;498 (void)OS_StrCopy(pgrp->OSFlagName, pname); /* Yes, copy name from OS_FLAG_GRP */
000428 e1a01007 MOV r1,r7
00042c e286000a ADD r0,r6,#0xa
000430 ebfffffe BL OS_StrCopy
;;;499 OS_EXIT_CRITICAL();
000434 e1a00005 MOV r0,r5
000438 ebfffffe BL OS_CPU_SR_Restore
;;;500 *perr = OS_ERR_NONE;
00043c e3a00000 MOV r0,#0
|L1.1088|
000440 e5c40000 STRB r0,[r4,#0]
;;;501 return;
;;;502 }
000444 e8bd41f0 POP {r4-r8,lr}
000448 e12fff1e BX lr
;;;503 #endif
ENDP
OS_FlagBlock PROC
;;;988 static void OS_FlagBlock (OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout)
;;;989 {
00044c e92d4030 PUSH {r4,r5,lr}
;;;990 OS_FLAG_NODE *pnode_next;
;;;991 INT8U y;
;;;992
;;;993
;;;994 OSTCBCur->OSTCBStat |= OS_STAT_FLAG;
000450 e59fe4a0 LDR lr,|L1.2296|
000454 e59d500c LDR r5,[sp,#0xc]
000458 e59ec000 LDR r12,[lr,#0] ; OSTCBCur
00045c e5dc402c LDRB r4,[r12,#0x2c]
000460 e3844020 ORR r4,r4,#0x20
000464 e5cc402c STRB r4,[r12,#0x2c]
;;;995 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
000468 e3a04000 MOV r4,#0
00046c e5cc402d STRB r4,[r12,#0x2d]
;;;996 OSTCBCur->OSTCBDly = timeout; /* Store timeout in task's TCB */
000470 e1cc52ba STRH r5,[r12,#0x2a]
;;;997 #if OS_TASK_DEL_EN > 0
;;;998 OSTCBCur->OSTCBFlagNode = pnode; /* TCB to link to node */
000474 e58c1024 STR r1,[r12,#0x24]
;;;999 #endif
;;;1000 pnode->OSFlagNodeFlags = flags; /* Save the flags that we need to wait for */
000478 e1c121b0 STRH r2,[r1,#0x10]
;;;1001 pnode->OSFlagNodeWaitType = wait_type; /* Save the type of wait we are doing */
00047c e5c13012 STRB r3,[r1,#0x12]
;;;1002 pnode->OSFlagNodeTCB = (void *)OSTCBCur; /* Link to task's TCB */
;;;1003 pnode->OSFlagNodeNext = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
000480 e581c008 STR r12,[r1,#8]
000484 e5902004 LDR r2,[r0,#4]
;;;1004 pnode->OSFlagNodePrev = (void *)0;
;;;1005 pnode->OSFlagNodeFlagGrp = (void *)pgrp; /* Link to Event Flag Group */
;;;1006 pnode_next = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
000488 e581000c STR r0,[r1,#0xc]
00048c e8810014 STM r1,{r2,r4}
000490 e5902004 LDR r2,[r0,#4]
;;;1007 if (pnode_next != (void *)0) { /* Is this the first NODE to insert? */
000494 e3520000 CMP r2,#0
;;;1008 pnode_next->OSFlagNodePrev = pnode; /* No, link in doubly linked list */
000498 15821004 STRNE r1,[r2,#4]
;;;1009 }
;;;1010 pgrp->OSFlagWaitList = (void *)pnode;
;;;1011
;;;1012 y = OSTCBCur->OSTCBY; /* Suspend current task until flag(s) received */
00049c e5801004 STR r1,[r0,#4]
0004a0 e59e1000 LDR r1,[lr,#0] ; OSTCBCur
;;;1013 OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
0004a4 e59f2448 LDR r2,|L1.2292|
0004a8 e5d10030 LDRB r0,[r1,#0x30] ;1012
0004ac e5d1c031 LDRB r12,[r1,#0x31]
0004b0 e7d23000 LDRB r3,[r2,r0]
0004b4 e1c3300c BIC r3,r3,r12
0004b8 e7c23000 STRB r3,[r2,r0]
;;;1014 if (OSRdyTbl[y] == 0x00) {
0004bc e7d20000 LDRB r0,[r2,r0]
0004c0 e3500000 CMP r0,#0
;;;1015 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
0004c4 059f0424 LDREQ r0,|L1.2288|
0004c8 05d11032 LDRBEQ r1,[r1,#0x32]
0004cc 05d02000 LDRBEQ r2,[r0,#0] ; OSRdyGrp
0004d0 01c21001 BICEQ r1,r2,r1
0004d4 05c01000 STRBEQ r1,[r0,#0] ; OSRdyGrp
;;;1016 }
;;;1017 }
0004d8 e8bd4030 POP {r4,r5,lr}
0004dc e12fff1e 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 {
0004e0 e92d4fff PUSH {r0-r11,lr}
0004e4 e1a04000 MOV r4,r0
;;;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' */
;;;575 return ((OS_FLAGS)0);
;;;576 }
;;;577 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
;;;578 *perr = OS_ERR_FLAG_INVALID_PGRP;
;;;579 return ((OS_FLAGS)0);
;;;580 }
;;;581 #endif
;;;582 if (OSIntNesting > 0) { /* See if called from ISR ... */
0004e8 e59f03f8 LDR r0,|L1.2280|
0004ec e24dd01c SUB sp,sp,#0x1c ;561
0004f0 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0004f4 e59d5050 LDR r5,[sp,#0x50]
0004f8 e1a07001 MOV r7,r1 ;561
0004fc e3500000 CMP r0,#0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -