os_flag.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,195 行 · 第 1/5 页
TXT
1,195 行
;;;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 }
0001a8 e12fff1e BX lr
|L1.428|
0001ac ef000002 SVC #0x2 ;205
0001b0 e59f07cc LDR r0,|L1.2436|
0001b4 e5904000 LDR r4,[r0,#0] ;206 ; OSFlagFreeList
0001b8 e3540000 CMP r4,#0 ;207
0001bc 0a000009 BEQ |L1.488|
0001c0 e5941004 LDR r1,[r4,#4] ;209
0001c4 e5801000 STR r1,[r0,#0] ;209 ; OSFlagFreeList
0001c8 e3a00005 MOV r0,#5 ;210
0001cc e5c40000 STRB r0,[r4,#0] ;210
0001d0 e1c460b8 STRH r6,[r4,#8] ;211
0001d4 e3a06000 MOV r6,#0 ;212
0001d8 e5846004 STR r6,[r4,#4] ;212
0001dc ef000003 SVC #0x3 ;213
0001e0 e5c56000 STRB r6,[r5,#0] ;214
0001e4 ea000002 B |L1.500|
|L1.488|
0001e8 ef000003 SVC #0x3 ;216
0001ec e3a0009a MOV r0,#0x9a ;217
0001f0 e5c50000 STRB r0,[r5,#0] ;217
|L1.500|
0001f4 e1a00004 MOV r0,r4 ;219
0001f8 eaffffe9 B |L1.420|
;;;221
ENDP
OS_FlagUnlink PROC
;;;876
;;;877 pnode_prev = (OS_FLAG_NODE *)pnode->OSFlagNodePrev;
0001fc e5902004 LDR r2,[r0,#4]
;;;878 pnode_next = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
000200 e5901000 LDR r1,[r0,#0]
;;;879 if (pnode_prev == (OS_FLAG_NODE *)0) { /* Is it first node in wait list? */
000204 e3520000 CMP r2,#0
000208 e3a03000 MOV r3,#0 ;878
00020c 1a000005 BNE |L1.552|
;;;880 pgrp = (OS_FLAG_GRP *)pnode->OSFlagNodeFlagGrp;
000210 e590200c LDR r2,[r0,#0xc]
;;;881 pgrp->OSFlagWaitList = (void *)pnode_next; /* Update list for new 1st node */
000214 e5821004 STR r1,[r2,#4]
;;;882 if (pnode_next != (OS_FLAG_NODE *)0) {
000218 e3510000 CMP r1,#0
00021c 0a000005 BEQ |L1.568|
;;;883 pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0; /* Link new 1st node PREV to NULL */
000220 e5813004 STR r3,[r1,#4]
000224 ea000003 B |L1.568|
|L1.552|
;;;884 }
;;;885 } else { /* No, A node somewhere in the list */
;;;886 pnode_prev->OSFlagNodeNext = pnode_next; /* Link around the node to unlink */
000228 e5821000 STR r1,[r2,#0]
;;;887 if (pnode_next != (OS_FLAG_NODE *)0) { /* Was this the LAST node? */
00022c e3510000 CMP r1,#0
000230 0a000000 BEQ |L1.568|
;;;888 pnode_next->OSFlagNodePrev = pnode_prev; /* No, Link around current node */
000234 e5812004 STR r2,[r1,#4]
|L1.568|
;;;889 }
;;;890 }
;;;891 #if OS_TASK_DEL_EN > 0
;;;892 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB;
000238 e5900008 LDR r0,[r0,#8]
;;;893 ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;
00023c e5803024 STR r3,[r0,#0x24]
;;;894 #endif
;;;895 }
000240 e12fff1e BX lr
;;;896 #endif
ENDP
OS_FlagTaskRdy PROC
;;;824 static BOOLEAN OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;825 {
000244 e92d4010 PUSH {r4,lr}
;;;826 OS_TCB *ptcb;
;;;827 BOOLEAN sched;
;;;828
;;;829
;;;830 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB; /* Point to TCB of waiting task */
000248 e5902008 LDR r2,[r0,#8]
;;;831 ptcb->OSTCBDly = 0;
00024c e3a03000 MOV r3,#0
000250 e1c232ba STRH r3,[r2,#0x2a]
;;;832 ptcb->OSTCBFlagsRdy = flags_rdy;
000254 e1c212b8 STRH r1,[r2,#0x28]
;;;833 ptcb->OSTCBStat &= ~OS_STAT_FLAG;
000258 e5d2102c LDRB r1,[r2,#0x2c]
00025c e3c11020 BIC r1,r1,#0x20
000260 e5c2102c STRB r1,[r2,#0x2c]
;;;834 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* Put task into ready list */
000264 e5d2102c LDRB r1,[r2,#0x2c]
000268 e3510000 CMP r1,#0
00026c 1a00000c BNE |L1.676|
;;;835 OSRdyGrp |= ptcb->OSTCBBitY;
000270 e59f1710 LDR r1,|L1.2440|
000274 e5d23031 LDRB r3,[r2,#0x31]
000278 e5d1c000 LDRB r12,[r1,#0] ; OSRdyGrp
00027c e183300c ORR r3,r3,r12
000280 e5c13000 STRB r3,[r1,#0] ; OSRdyGrp
;;;836 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000284 e5d2102f LDRB r1,[r2,#0x2f]
000288 e59f36fc LDR r3,|L1.2444|
00028c e5d22030 LDRB r2,[r2,#0x30]
000290 e7d3c001 LDRB r12,[r3,r1]
000294 e182200c ORR r2,r2,r12
000298 e7c32001 STRB r2,[r3,r1]
;;;837 sched = TRUE;
00029c e3a04001 MOV r4,#1
0002a0 ea000000 B |L1.680|
|L1.676|
;;;838 } else {
;;;839 sched = FALSE;
0002a4 e3a04000 MOV r4,#0
|L1.680|
;;;840 }
;;;841 OS_FlagUnlink(pnode);
0002a8 ebfffffe BL OS_FlagUnlink
;;;842 return (sched);
0002ac e1a00004 MOV r0,r4
0002b0 e8bd4010 POP {r4,lr}
;;;843 }
0002b4 e12fff1e BX lr
;;;844
ENDP
OSFlagDel PROC
;;;260 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
;;;261 {
0002b8 e92d47f0 PUSH {r4-r10,lr}
0002bc e1a04000 MOV r4,r0
0002c0 e1a0a001 MOV r10,r1
0002c4 e1a05002 MOV r5,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 ... */
0002c8 e59f06b0 LDR r0,|L1.2432|
0002cc e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0002d0 e3500000 CMP r0,#0
0002d4 0a000004 BEQ |L1.748|
;;;270 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
0002d8 e3a0008c MOV r0,#0x8c
0002dc e5c50000 STRB r0,[r5,#0]
;;;271 return (pgrp);
0002e0 e1a00004 MOV r0,r4
|L1.740|
0002e4 e8bd47f0 POP {r4-r10,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 */
;;;294 OSFlagFreeList = pgrp;
;;;295 OS_EXIT_CRITICAL();
;;;296 *err = OS_NO_ERR;
;;;297 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
;;;298 } else {
;;;299 OS_EXIT_CRITICAL();
;;;300 *err = OS_ERR_TASK_WAITING;
;;;301 return (pgrp);
;;;302 }
;;;303
;;;304 case OS_DEL_ALWAYS: /* Always delete the event flag group */
;;;305 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
;;;306 while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags */
;;;307 OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
;;;308 pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
;;;309 }
;;;310 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
;;;311 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list */
;;;312 OSFlagFreeList = pgrp;
;;;313 OS_EXIT_CRITICAL();
;;;314 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
;;;315 OS_Sched(); /* Find highest priority task ready to run */
;;;316 }
;;;317 *err = OS_NO_ERR;
;;;318 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
;;;319
;;;320 default:
;;;321 OS_EXIT_CRITICAL();
;;;322 *err = OS_ERR_INVALID_OPT;
;;;323 return (pgrp);
;;;324 }
;;;325 }
0002e8 e12fff1e BX lr
|L1.748|
0002ec e3540000 CMP r4,#0 ;274
0002f0 1a000003 BNE |L1.772|
0002f4 e3a00096 MOV r0,#0x96 ;275
0002f8 e5c50000 STRB r0,[r5,#0] ;275
0002fc e1a00004 MOV r0,r4 ;276
000300 eafffff7 B |L1.740|
|L1.772|
000304 e5d40000 LDRB r0,[r4,#0] ;278
000308 e3500005 CMP r0,#5 ;278
00030c 0a000003 BEQ |L1.800|
000310 e3a00001 MOV r0,#1 ;279
000314 e5c50000 STRB r0,[r5,#0] ;279
000318 e1a00004 MOV r0,r4 ;280
00031c eafffff0 B |L1.740|
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?