📄 os_flag.txt
字号:
;;;224 return ((OS_FLAG_GRP *)0);
;;;225 }
;;;226 OS_ENTER_CRITICAL();
;;;227 pgrp = OSFlagFreeList; /* Get next free event flag */
;;;228 if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
;;;229 /* Adjust free list */
;;;230 OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
;;;231 pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
;;;232 pgrp->OSFlagFlags = flags; /* Set to desired initial value */
;;;233 pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
;;;234 #if OS_FLAG_NAME_SIZE > 1
;;;235 pgrp->OSFlagName[0] = '?';
;;;236 pgrp->OSFlagName[1] = OS_ASCII_NUL;
;;;237 #endif
;;;238 OS_EXIT_CRITICAL();
;;;239 *err = OS_ERR_NONE;
;;;240 } else {
;;;241 OS_EXIT_CRITICAL();
;;;242 *err = OS_ERR_FLAG_GRP_DEPLETED;
;;;243 }
;;;244 return (pgrp); /* Return pointer to event flag group */
;;;245 }
0001f8 e12fff1e BX lr
|L1.508|
0001fc e59f0d60 LDR r0,|L1.3940|
000200 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000204 e3500000 CMP r0,#0
000208 da000003 BLE |L1.540|
00020c e3a00010 MOV r0,#0x10
000210 e5c50000 STRB r0,[r5,#0]
000214 e3a00000 MOV r0,#0
000218 eafffff5 B |L1.500|
|L1.540|
00021c ebfffffe BL OS_CPU_SR_Save
000220 e1a07000 MOV r7,r0
000224 e59f0d3c LDR r0,|L1.3944|
000228 e5906000 LDR r6,[r0,#0] ; OSFlagFreeList
00022c e3560000 CMP r6,#0
000230 0a000012 BEQ |L1.640|
000234 e59f0d2c LDR r0,|L1.3944|
000238 e5900000 LDR r0,[r0,#0] ; OSFlagFreeList
00023c e5900004 LDR r0,[r0,#4]
000240 e59f1d20 LDR r1,|L1.3944|
000244 e5810000 STR r0,[r1,#0] ; OSFlagFreeList
000248 e3a00005 MOV r0,#5
00024c e5c60000 STRB r0,[r6,#0]
000250 e1c640b8 STRH r4,[r6,#8]
000254 e3a00000 MOV r0,#0
000258 e5860004 STR r0,[r6,#4]
00025c e3a0003f MOV r0,#0x3f
000260 e5c6000a STRB r0,[r6,#0xa]
000264 e3a00000 MOV r0,#0
000268 e5c6000b STRB r0,[r6,#0xb]
00026c e1a00007 MOV r0,r7
000270 ebfffffe BL OS_CPU_SR_Restore
000274 e3a00000 MOV r0,#0
000278 e5c50000 STRB r0,[r5,#0]
00027c ea000003 B |L1.656|
|L1.640|
000280 e1a00007 MOV r0,r7
000284 ebfffffe BL OS_CPU_SR_Restore
000288 e3a00072 MOV r0,#0x72
00028c e5c50000 STRB r0,[r5,#0]
|L1.656|
000290 e1a00006 MOV r0,r6
000294 eaffffd6 B |L1.500|
ENDP
OS_FlagUnlink PROC
;;;1141 void OS_FlagUnlink (OS_FLAG_NODE *pnode)
;;;1142 {
000298 e52de004 PUSH {lr}
;;;1143 #if OS_TASK_DEL_EN > 0
;;;1144 OS_TCB *ptcb;
;;;1145 #endif
;;;1146 OS_FLAG_GRP *pgrp;
;;;1147 OS_FLAG_NODE *pnode_prev;
;;;1148 OS_FLAG_NODE *pnode_next;
;;;1149
;;;1150
;;;1151 pnode_prev = (OS_FLAG_NODE *)pnode->OSFlagNodePrev;
00029c e5903004 LDR r3,[r0,#4]
;;;1152 pnode_next = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
0002a0 e590c000 LDR r12,[r0,#0]
;;;1153 if (pnode_prev == (OS_FLAG_NODE *)0) { /* Is it first node in wait list? */
0002a4 e3530000 CMP r3,#0
0002a8 1a000006 BNE |L1.712|
;;;1154 pgrp = (OS_FLAG_GRP *)pnode->OSFlagNodeFlagGrp;
0002ac e590200c LDR r2,[r0,#0xc]
;;;1155 pgrp->OSFlagWaitList = (void *)pnode_next; /* Update list for new 1st node */
0002b0 e582c004 STR r12,[r2,#4]
;;;1156 if (pnode_next != (OS_FLAG_NODE *)0) {
0002b4 e35c0000 CMP r12,#0
0002b8 0a000006 BEQ |L1.728|
;;;1157 pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0; /* Link new 1st node PREV to NULL */
0002bc e3a0e000 MOV lr,#0
0002c0 e58ce004 STR lr,[r12,#4]
0002c4 ea000003 B |L1.728|
|L1.712|
;;;1158 }
;;;1159 } else { /* No, A node somewhere in the list */
;;;1160 pnode_prev->OSFlagNodeNext = pnode_next; /* Link around the node to unlink */
0002c8 e583c000 STR r12,[r3,#0]
;;;1161 if (pnode_next != (OS_FLAG_NODE *)0) { /* Was this the LAST node? */
0002cc e35c0000 CMP r12,#0
0002d0 0a000000 BEQ |L1.728|
;;;1162 pnode_next->OSFlagNodePrev = pnode_prev; /* No, Link around current node */
0002d4 e58c3004 STR r3,[r12,#4]
|L1.728|
;;;1163 }
;;;1164 }
;;;1165 #if OS_TASK_DEL_EN > 0
;;;1166 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB;
0002d8 e5901008 LDR r1,[r0,#8]
;;;1167 ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;
0002dc e3a0e000 MOV lr,#0
0002e0 e581e024 STR lr,[r1,#0x24]
;;;1168 #endif
;;;1169 }
0002e4 e49de004 POP {lr}
0002e8 e12fff1e BX lr
ENDP
OS_FlagTaskRdy PROC
;;;1097 static BOOLEAN OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;1098 {
0002ec e92d40f0 PUSH {r4-r7,lr}
0002f0 e1a04000 MOV r4,r0
0002f4 e1a05001 MOV r5,r1
;;;1099 OS_TCB *ptcb;
;;;1100 BOOLEAN sched;
;;;1101
;;;1102
;;;1103 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB; /* Point to TCB of waiting task */
0002f8 e5946008 LDR r6,[r4,#8]
;;;1104 ptcb->OSTCBDly = 0;
0002fc e3a00000 MOV r0,#0
000300 e1c602ba STRH r0,[r6,#0x2a]
;;;1105 ptcb->OSTCBFlagsRdy = flags_rdy;
000304 e1c652b8 STRH r5,[r6,#0x28]
;;;1106 ptcb->OSTCBStat &= ~(INT8U)OS_STAT_FLAG;
000308 e5d6002c LDRB r0,[r6,#0x2c]
00030c e3c00020 BIC r0,r0,#0x20
000310 e5c6002c STRB r0,[r6,#0x2c]
;;;1107 ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
000314 e3a00000 MOV r0,#0
000318 e5c6002d STRB r0,[r6,#0x2d]
;;;1108 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* Task now ready? */
00031c e5d6002c LDRB r0,[r6,#0x2c]
000320 e3500000 CMP r0,#0
000324 1a00000f BNE |L1.872|
;;;1109 OSRdyGrp |= ptcb->OSTCBBitY; /* Put task into ready list */
000328 e5d60032 LDRB r0,[r6,#0x32]
00032c e59f1c38 LDR r1,|L1.3948|
000330 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
000334 e1800001 ORR r0,r0,r1
000338 e59f1c2c LDR r1,|L1.3948|
00033c e5c10000 STRB r0,[r1,#0] ; OSRdyGrp
;;;1110 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000340 e5d60030 LDRB r0,[r6,#0x30]
000344 e59f1c24 LDR r1,|L1.3952|
000348 e7d10000 LDRB r0,[r1,r0]
00034c e5d61031 LDRB r1,[r6,#0x31]
000350 e1800001 ORR r0,r0,r1
000354 e5d61030 LDRB r1,[r6,#0x30]
000358 e59f2c10 LDR r2,|L1.3952|
00035c e7c20001 STRB r0,[r2,r1]
;;;1111 sched = OS_TRUE;
000360 e3a07001 MOV r7,#1
000364 ea000000 B |L1.876|
|L1.872|
;;;1112 } else {
;;;1113 sched = OS_FALSE;
000368 e3a07000 MOV r7,#0
|L1.876|
;;;1114 }
;;;1115 OS_FlagUnlink(pnode);
00036c e1a00004 MOV r0,r4
000370 ebfffffe BL OS_FlagUnlink
;;;1116 return (sched);
000374 e1a00007 MOV r0,r7
000378 e8bd40f0 POP {r4-r7,lr}
;;;1117 }
00037c e12fff1e BX lr
ENDP
OSFlagDel PROC
;;;285 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
;;;286 {
000380 e92d47f0 PUSH {r4-r10,lr}
000384 e1a04000 MOV r4,r0
000388 e1a05001 MOV r5,r1
00038c e1a06002 MOV r6,r2
;;;287 BOOLEAN tasks_waiting;
;;;288 OS_FLAG_NODE *pnode;
;;;289 OS_FLAG_GRP *pgrp_return;
;;;290 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;291 OS_CPU_SR cpu_sr = 0;
000390 e3a0a000 MOV r10,#0
;;;292 #endif
;;;293
;;;294
;;;295
;;;296 #if OS_ARG_CHK_EN > 0
;;;297 if (err == (INT8U *)0) { /* Validate 'err' */
000394 e3560000 CMP r6,#0
000398 1a000002 BNE |L1.936|
;;;298 return (pgrp);
00039c e1a00004 MOV r0,r4
|L1.928|
0003a0 e8bd47f0 POP {r4-r10,lr}
;;;299 }
;;;300 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
;;;301 *err = OS_ERR_FLAG_INVALID_PGRP;
;;;302 return (pgrp);
;;;303 }
;;;304 #endif
;;;305 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;306 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
;;;307 return (pgrp);
;;;308 }
;;;309 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
;;;310 *err = OS_ERR_EVENT_TYPE;
;;;311 return (pgrp);
;;;312 }
;;;313 OS_ENTER_CRITICAL();
;;;314 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
;;;315 tasks_waiting = OS_TRUE; /* Yes */
;;;316 } else {
;;;317 tasks_waiting = OS_FALSE; /* No */
;;;318 }
;;;319 switch (opt) {
;;;320 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
;;;321 if (tasks_waiting == OS_FALSE) {
;;;322 #if OS_FLAG_NAME_SIZE > 1
;;;323 pgrp->OSFlagName[0] = '?'; /* Unknown name */
;;;324 pgrp->OSFlagName[1] = OS_ASCII_NUL;
;;;325 #endif
;;;326 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
;;;327 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
;;;328 pgrp->OSFlagFlags = (OS_FLAGS)0;
;;;329 OSFlagFreeList = pgrp;
;;;330 OS_EXIT_CRITICAL();
;;;331 *err = OS_ERR_NONE;
;;;332 pgrp_return = (OS_FLAG_GRP *)0; /* Event Flag Group has been deleted */
;;;333 } else {
;;;334 OS_EXIT_CRITICAL();
;;;335 *err = OS_ERR_TASK_WAITING;
;;;336 pgrp_return = pgrp;
;;;337 }
;;;338 break;
;;;339
;;;340 case OS_DEL_ALWAYS: /* Always delete the event flag group */
;;;341 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
;;;342 while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags */
;;;343 (void)OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
;;;344 pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
;;;345 }
;;;346 #if OS_FLAG_NAME_SIZE > 1
;;;347 pgrp->OSFlagName[0] = '?'; /* Unknown name */
;;;348 pgrp->OSFlagName[1] = OS_ASCII_NUL;
;;;349 #endif
;;;350 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
;;;351 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list */
;;;352 pgrp->OSFlagFlags = (OS_FLAGS)0;
;;;353 OSFlagFreeList = pgrp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -