📄 os_flag.txt
字号:
OSFlagCreate PROC
;;;193 OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags, INT8U *err)
;;;194 {
0001c8 e92d4070 PUSH {r4-r6,lr}
0001cc e1a04000 MOV r4,r0
0001d0 e1a06001 MOV r6,r1
;;;195 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;196 OS_CPU_SR cpu_sr;
;;;197 #endif
;;;198 OS_FLAG_GRP *pgrp;
;;;199
;;;200
;;;201 if (OSIntNesting > 0) { /* See if called from ISR ... */
0001d4 e59f097c LDR r0,|L1.2904|
0001d8 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0001dc e3500000 CMP r0,#0
0001e0 da000004 BLE |L1.504|
;;;202 *err = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR */
0001e4 e3a0008d MOV r0,#0x8d
0001e8 e5c60000 STRB r0,[r6,#0]
;;;203 return ((OS_FLAG_GRP *)0);
0001ec e3a00000 MOV r0,#0
|L1.496|
0001f0 e8bd4070 POP {r4-r6,lr}
;;;204 }
;;;205 OS_ENTER_CRITICAL();
;;;206 pgrp = OSFlagFreeList; /* Get next free event flag */
;;;207 if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
;;;208 /* Adjust free list */
;;;209 OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
;;;210 pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
;;;211 pgrp->OSFlagFlags = flags; /* Set to desired initial value */
;;;212 pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
;;;213 OS_EXIT_CRITICAL();
;;;214 *err = OS_NO_ERR;
;;;215 } else {
;;;216 OS_EXIT_CRITICAL();
;;;217 *err = OS_FLAG_GRP_DEPLETED;
;;;218 }
;;;219 return (pgrp); /* Return pointer to event flag group */
;;;220 }
0001f4 e12fff1e BX lr
|L1.504|
0001f8 ef000002 SVC 0x2 ; formerly SWI ;205
0001fc e59f0958 LDR r0,|L1.2908| ;206
000200 e5905000 LDR r5,[r0,#0] ;206 ; OSFlagFreeList
000204 e3550000 CMP r5,#0 ;207
000208 0a00000c BEQ |L1.576| ;207
00020c e5900000 LDR r0,[r0,#0] ;209 ; OSFlagFreeList
000210 e5900004 LDR r0,[r0,#4] ;209
000214 e59f1940 LDR r1,|L1.2908| ;209
000218 e5810000 STR r0,[r1,#0] ;209 ; OSFlagFreeList
00021c e3a00005 MOV r0,#5 ;210
000220 e5c50000 STRB r0,[r5,#0] ;210
000224 e1c540b8 STRH r4,[r5,#8] ;211
000228 e3a00000 MOV r0,#0 ;212
00022c e5850004 STR r0,[r5,#4] ;212
000230 ef000003 SVC 0x3 ; formerly SWI ;213
000234 e3a00000 MOV r0,#0 ;214
000238 e5c60000 STRB r0,[r6,#0] ;214
00023c ea000002 B |L1.588| ;214
|L1.576|
000240 ef000003 SVC 0x3 ; formerly SWI ;216
000244 e3a0009a MOV r0,#0x9a ;217
000248 e5c60000 STRB r0,[r6,#0] ;217
|L1.588|
00024c e1a00005 MOV r0,r5 ;219
000250 eaffffe6 B |L1.496| ;219
ENDP
OS_FlagUnlink PROC
;;;867 void OS_FlagUnlink (OS_FLAG_NODE *pnode)
;;;868 {
000254 e52de004 PUSH {lr}
;;;869 #if OS_TASK_DEL_EN > 0
;;;870 OS_TCB *ptcb;
;;;871 #endif
;;;872 OS_FLAG_GRP *pgrp;
;;;873 OS_FLAG_NODE *pnode_prev;
;;;874 OS_FLAG_NODE *pnode_next;
;;;875
;;;876
;;;877 pnode_prev = (OS_FLAG_NODE *)pnode->OSFlagNodePrev;
000258 e5903004 LDR r3,[r0,#4]
;;;878 pnode_next = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
00025c e590c000 LDR r12,[r0,#0]
;;;879 if (pnode_prev == (OS_FLAG_NODE *)0) { /* Is it first node in wait list? */
000260 e3530000 CMP r3,#0
000264 1a000006 BNE |L1.644|
;;;880 pgrp = (OS_FLAG_GRP *)pnode->OSFlagNodeFlagGrp;
000268 e590200c LDR r2,[r0,#0xc]
;;;881 pgrp->OSFlagWaitList = (void *)pnode_next; /* Update list for new 1st node */
00026c e582c004 STR r12,[r2,#4]
;;;882 if (pnode_next != (OS_FLAG_NODE *)0) {
000270 e35c0000 CMP r12,#0
000274 0a000006 BEQ |L1.660|
;;;883 pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0; /* Link new 1st node PREV to NULL */
000278 e3a0e000 MOV lr,#0
00027c e58ce004 STR lr,[r12,#4]
000280 ea000003 B |L1.660|
;;;884 }
;;;885 } else { /* No, A node somewhere in the list */
;;;886 pnode_prev->OSFlagNodeNext = pnode_next; /* Link around the node to unlink */
|L1.644|
000284 e583c000 STR r12,[r3,#0]
;;;887 if (pnode_next != (OS_FLAG_NODE *)0) { /* Was this the LAST node? */
000288 e35c0000 CMP r12,#0
00028c 0a000000 BEQ |L1.660|
;;;888 pnode_next->OSFlagNodePrev = pnode_prev; /* No, Link around current node */
000290 e58c3004 STR r3,[r12,#4]
;;;889 }
;;;890 }
;;;891 #if OS_TASK_DEL_EN > 0
;;;892 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB;
|L1.660|
000294 e5901008 LDR r1,[r0,#8]
;;;893 ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;
000298 e3a0e000 MOV lr,#0
00029c e581e024 STR lr,[r1,#0x24]
;;;894 #endif
;;;895 }
0002a0 e49de004 POP {lr}
0002a4 e12fff1e BX lr
ENDP
OS_FlagTaskRdy PROC
;;;824 static BOOLEAN OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;825 {
0002a8 e92d40f0 PUSH {r4-r7,lr}
0002ac e1a04000 MOV r4,r0
0002b0 e1a05001 MOV r5,r1
;;;826 OS_TCB *ptcb;
;;;827 BOOLEAN sched;
;;;828
;;;829
;;;830 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB; /* Point to TCB of waiting task */
0002b4 e5946008 LDR r6,[r4,#8]
;;;831 ptcb->OSTCBDly = 0;
0002b8 e3a00000 MOV r0,#0
0002bc e1c602ba STRH r0,[r6,#0x2a]
;;;832 ptcb->OSTCBFlagsRdy = flags_rdy;
0002c0 e1c652b8 STRH r5,[r6,#0x28]
;;;833 ptcb->OSTCBStat &= ~OS_STAT_FLAG;
0002c4 e5d6002c LDRB r0,[r6,#0x2c]
0002c8 e3c00020 BIC r0,r0,#0x20
0002cc e5c6002c STRB r0,[r6,#0x2c]
;;;834 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* Put task into ready list */
0002d0 e5d6002c LDRB r0,[r6,#0x2c]
0002d4 e3500000 CMP r0,#0
0002d8 1a00000f BNE |L1.796|
;;;835 OSRdyGrp |= ptcb->OSTCBBitY;
0002dc e5d60031 LDRB r0,[r6,#0x31]
0002e0 e59f1878 LDR r1,|L1.2912|
0002e4 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
0002e8 e1800001 ORR r0,r0,r1
0002ec e59f186c LDR r1,|L1.2912|
0002f0 e5c10000 STRB r0,[r1,#0] ; OSRdyGrp
;;;836 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0002f4 e5d6002f LDRB r0,[r6,#0x2f]
0002f8 e59f1864 LDR r1,|L1.2916|
0002fc e7d10000 LDRB r0,[r1,r0]
000300 e5d61030 LDRB r1,[r6,#0x30]
000304 e1800001 ORR r0,r0,r1
000308 e5d6102f LDRB r1,[r6,#0x2f]
00030c e59f2850 LDR r2,|L1.2916|
000310 e7c20001 STRB r0,[r2,r1]
;;;837 sched = TRUE;
000314 e3a07001 MOV r7,#1
000318 ea000000 B |L1.800|
;;;838 } else {
;;;839 sched = FALSE;
|L1.796|
00031c e3a07000 MOV r7,#0
;;;840 }
;;;841 OS_FlagUnlink(pnode);
|L1.800|
000320 e1a00004 MOV r0,r4
000324 ebfffffe BL OS_FlagUnlink
;;;842 return (sched);
000328 e1a00007 MOV r0,r7
00032c e8bd40f0 POP {r4-r7,lr}
;;;843 }
000330 e12fff1e BX lr
ENDP
OSFlagDel PROC
;;;260 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
;;;261 {
000334 e92d41f0 PUSH {r4-r8,lr}
000338 e1a04000 MOV r4,r0
00033c e1a05001 MOV r5,r1
000340 e1a06002 MOV r6,r2
;;;262 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;263 OS_CPU_SR cpu_sr;
;;;264 #endif
;;;265 BOOLEAN tasks_waiting;
;;;266 OS_FLAG_NODE *pnode;
;;;267
;;;268
;;;269 if (OSIntNesting > 0) { /* See if called from ISR ... */
000344 e59f080c LDR r0,|L1.2904|
000348 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00034c e3500000 CMP r0,#0
000350 da000004 BLE |L1.872|
;;;270 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
000354 e3a0008c MOV r0,#0x8c
000358 e5c60000 STRB r0,[r6,#0]
;;;271 return (pgrp);
00035c e1a00004 MOV r0,r4
|L1.864|
000360 e8bd41f0 POP {r4-r8,lr}
;;;272 }
;;;273 #if OS_ARG_CHK_EN > 0
;;;274 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
;;;275 *err = OS_FLAG_INVALID_PGRP;
;;;276 return (pgrp);
;;;277 }
;;;278 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
;;;279 *err = OS_ERR_EVENT_TYPE;
;;;280 return (pgrp);
;;;281 }
;;;282 #endif
;;;283 OS_ENTER_CRITICAL();
;;;284 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
;;;285 tasks_waiting = TRUE; /* Yes */
;;;286 } else {
;;;287 tasks_waiting = FALSE; /* No */
;;;288 }
;;;289 switch (opt) {
;;;290 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
;;;291 if (tasks_waiting == FALSE) {
;;;292 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
;;;293 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -