📄 os_flag.txt
字号:
ENDP
OSFlagCreate PROC
;;;193 OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags, INT8U *err)
;;;194 {
0001c4 e92d4070 PUSH {r4-r6,lr}
0001c8 e1a04000 MOV r4,r0
0001cc 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 ... */
0001d0 e59f095c LDR r0,|L1.2868|
0001d4 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0001d8 e3500000 CMP r0,#0
0001dc da000003 BLE |L1.496|
;;;202 *err = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR */
0001e0 e3a0008d MOV r0,#0x8d
0001e4 e5c60000 STRB r0,[r6,#0]
;;;203 return ((OS_FLAG_GRP *)0);
0001e8 e3a00000 MOV r0,#0
;;;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 }
|L1.492|
0001ec e8bd8070 POP {r4-r6,pc}
|L1.496|
0001f0 ef000002 SVC 0x2 ; formerly SWI ;205
0001f4 e59f093c LDR r0,|L1.2872| ;206
0001f8 e5905000 LDR r5,[r0,#0] ;206 ; OSFlagFreeList
0001fc e3550000 CMP r5,#0 ;207
000200 0a00000c BEQ |L1.568| ;207
000204 e5900000 LDR r0,[r0,#0] ;209 ; OSFlagFreeList
000208 e5900004 LDR r0,[r0,#4] ;209
00020c e59f1924 LDR r1,|L1.2872| ;209
000210 e5810000 STR r0,[r1,#0] ;209 ; OSFlagFreeList
000214 e3a00005 MOV r0,#5 ;210
000218 e5c50000 STRB r0,[r5,#0] ;210
00021c e1c540b8 STRH r4,[r5,#8] ;211
000220 e3a00000 MOV r0,#0 ;212
000224 e5850004 STR r0,[r5,#4] ;212
000228 ef000003 SVC 0x3 ; formerly SWI ;213
00022c e3a00000 MOV r0,#0 ;214
000230 e5c60000 STRB r0,[r6,#0] ;214
000234 ea000002 B |L1.580| ;214
|L1.568|
000238 ef000003 SVC 0x3 ; formerly SWI ;216
00023c e3a0009a MOV r0,#0x9a ;217
000240 e5c60000 STRB r0,[r6,#0] ;217
|L1.580|
000244 e1a00005 MOV r0,r5 ;219
000248 eaffffe7 B |L1.492| ;219
ENDP
OS_FlagUnlink PROC
;;;868 void OS_FlagUnlink (OS_FLAG_NODE *pnode)
;;;869 {
00024c e52de004 PUSH {lr}
;;;870 OS_TCB *ptcb;
;;;871 OS_FLAG_GRP *pgrp;
;;;872 OS_FLAG_NODE *pnode_prev;
;;;873 OS_FLAG_NODE *pnode_next;
;;;874
;;;875
;;;876 pnode_prev = pnode->OSFlagNodePrev;
000250 e5903004 LDR r3,[r0,#4]
;;;877 pnode_next = pnode->OSFlagNodeNext;
000254 e590c000 LDR r12,[r0,#0]
;;;878 if (pnode_prev == (OS_FLAG_NODE *)0) { /* Is it first node in wait list? */
000258 e3530000 CMP r3,#0
00025c 1a000006 BNE |L1.636|
;;;879 pgrp = pnode->OSFlagNodeFlagGrp; /* Yes, Point to event flag group */
000260 e590200c LDR r2,[r0,#0xc]
;;;880 pgrp->OSFlagWaitList = (void *)pnode_next; /* Update list for new 1st node */
000264 e582c004 STR r12,[r2,#4]
;;;881 if (pnode_next != (OS_FLAG_NODE *)0) {
000268 e35c0000 CMP r12,#0
00026c 0a000006 BEQ |L1.652|
;;;882 pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0; /* Link new 1st node PREV to NULL */
000270 e3a0e000 MOV lr,#0
000274 e58ce004 STR lr,[r12,#4]
000278 ea000003 B |L1.652|
;;;883 }
;;;884 } else { /* No, A node somewhere in the list */
;;;885 pnode_prev->OSFlagNodeNext = pnode_next; /* Link around the node to unlink */
|L1.636|
00027c e583c000 STR r12,[r3,#0]
;;;886 if (pnode_next != (OS_FLAG_NODE *)0) { /* Was this the LAST node? */
000280 e35c0000 CMP r12,#0
000284 0a000000 BEQ |L1.652|
;;;887 pnode_next->OSFlagNodePrev = pnode_prev; /* No, Link around current node */
000288 e58c3004 STR r3,[r12,#4]
;;;888 }
;;;889 }
;;;890 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB;
|L1.652|
00028c e5901008 LDR r1,[r0,#8]
;;;891 #if OS_TASK_DEL_EN > 0
;;;892 ptcb->OSTCBFlagNode = (void *)0;
000290 e3a0e000 MOV lr,#0
000294 e581e014 STR lr,[r1,#0x14]
;;;893 #endif
;;;894 }
000298 e49df004 POP {pc}
ENDP
OS_FlagTaskRdy PROC
;;;825 static BOOLEAN OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;826 {
00029c e92d40f0 PUSH {r4-r7,lr}
0002a0 e1a04000 MOV r4,r0
0002a4 e1a05001 MOV r5,r1
;;;827 OS_TCB *ptcb;
;;;828 BOOLEAN sched;
;;;829
;;;830
;;;831 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB; /* Point to TCB of waiting task */
0002a8 e5946008 LDR r6,[r4,#8]
;;;832 ptcb->OSTCBDly = 0;
0002ac e3a00000 MOV r0,#0
0002b0 e1c601ba STRH r0,[r6,#0x1a]
;;;833 ptcb->OSTCBFlagsRdy = flags_rdy;
0002b4 e1c651b8 STRH r5,[r6,#0x18]
;;;834 ptcb->OSTCBStat &= ~OS_STAT_FLAG;
0002b8 e5d6001c LDRB r0,[r6,#0x1c]
0002bc e3c00020 BIC r0,r0,#0x20
0002c0 e5c6001c STRB r0,[r6,#0x1c]
;;;835 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* Put task into ready list */
0002c4 e5d6001c LDRB r0,[r6,#0x1c]
0002c8 e3500000 CMP r0,#0
0002cc 1a00000f BNE |L1.784|
;;;836 OSRdyGrp |= ptcb->OSTCBBitY;
0002d0 e5d60021 LDRB r0,[r6,#0x21]
0002d4 e59f1860 LDR r1,|L1.2876|
0002d8 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
0002dc e1800001 ORR r0,r0,r1
0002e0 e59f1854 LDR r1,|L1.2876|
0002e4 e5c10000 STRB r0,[r1,#0] ; OSRdyGrp
;;;837 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0002e8 e5d6001f LDRB r0,[r6,#0x1f]
0002ec e59f184c LDR r1,|L1.2880|
0002f0 e7d10000 LDRB r0,[r1,r0]
0002f4 e5d61020 LDRB r1,[r6,#0x20]
0002f8 e1800001 ORR r0,r0,r1
0002fc e5d6101f LDRB r1,[r6,#0x1f]
000300 e59f2838 LDR r2,|L1.2880|
000304 e7c20001 STRB r0,[r2,r1]
;;;838 sched = TRUE;
000308 e3a07001 MOV r7,#1
00030c ea000000 B |L1.788|
;;;839 } else {
;;;840 sched = FALSE;
|L1.784|
000310 e3a07000 MOV r7,#0
;;;841 }
;;;842 OS_FlagUnlink(pnode);
|L1.788|
000314 e1a00004 MOV r0,r4
000318 ebfffffe BL OS_FlagUnlink
;;;843 return (sched);
00031c e1a00007 MOV r0,r7
;;;844 }
000320 e8bd80f0 POP {r4-r7,pc}
ENDP
OSFlagDel PROC
;;;261 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
;;;262 {
000324 e92d41f0 PUSH {r4-r8,lr}
000328 e1a04000 MOV r4,r0
00032c e1a05001 MOV r5,r1
000330 e1a06002 MOV r6,r2
;;;263 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;264 OS_CPU_SR cpu_sr;
;;;265 #endif
;;;266 BOOLEAN tasks_waiting;
;;;267 OS_FLAG_NODE *pnode;
;;;268
;;;269
;;;270 if (OSIntNesting > 0) { /* See if called from ISR ... */
000334 e59f07f8 LDR r0,|L1.2868|
000338 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00033c e3500000 CMP r0,#0
000340 da000003 BLE |L1.852|
;;;271 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
000344 e3a0008c MOV r0,#0x8c
000348 e5c60000 STRB r0,[r6,#0]
;;;272 return (pgrp);
00034c e1a00004 MOV r0,r4
;;;273 }
;;;274 #if OS_ARG_CHK_EN > 0
;;;275 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
;;;276 *err = OS_FLAG_INVALID_PGRP;
;;;277 return (pgrp);
;;;278 }
;;;279 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
;;;280 *err = OS_ERR_EVENT_TYPE;
;;;281 return (pgrp);
;;;282 }
;;;283 #endif
;;;284 OS_ENTER_CRITICAL();
;;;285 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
;;;286 tasks_waiting = TRUE; /* Yes */
;;;287 } else {
;;;288 tasks_waiting = FALSE; /* No */
;;;289 }
;;;290 switch (opt) {
;;;291 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
;;;292 if (tasks_waiting == FALSE) {
;;;293 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
;;;294 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
;;;295 OSFlagFreeList = pgrp;
;;;296 OS_EXIT_CRITICAL();
;;;297 *err = OS_NO_ERR;
;;;298 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -