?? os_flag.txt
字號:
000102 b16c CBZ r4,|L1.288|
000104 6862 LDR r2,[r4,#4]
000106 600a STR r2,[r1,#0] ; OSFlagFreeList
000108 2105 MOVS r1,#5
00010a 7021 STRB r1,[r4,#0]
00010c 8126 STRH r6,[r4,#8]
00010e 2600 MOVS r6,#0
000110 6066 STR r6,[r4,#4]
000112 213f MOVS r1,#0x3f
000114 72a1 STRB r1,[r4,#0xa]
000116 72e6 STRB r6,[r4,#0xb]
000118 f7fff7ff BL OS_CPU_SR_Restore
00011c 702e STRB r6,[r5,#0]
00011e e003 B |L1.296|
|L1.288|
000120 f7fff7ff BL OS_CPU_SR_Restore
000124 2072 MOVS r0,#0x72
000126 7028 STRB r0,[r5,#0]
|L1.296|
000128 4620 MOV r0,r4
00012a bd70 POP {r4-r6,pc}
;;;246
ENDP
OS_FlagUnlink PROC
;;;1154
;;;1155 pnode_prev = (OS_FLAG_NODE *)pnode->OSFlagNodePrev;
00012c 6842 LDR r2,[r0,#4]
;;;1156 pnode_next = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
00012e 6801 LDR r1,[r0,#0]
;;;1157 if (pnode_prev == (OS_FLAG_NODE *)0) { /* Is it first node in wait list? */
000130 2300 MOVS r3,#0
000132 b922 CBNZ r2,|L1.318|
;;;1158 pgrp = (OS_FLAG_GRP *)pnode->OSFlagNodeFlagGrp;
000134 68c2 LDR r2,[r0,#0xc]
;;;1159 pgrp->OSFlagWaitList = (void *)pnode_next; /* Update list for new 1st node */
000136 6051 STR r1,[r2,#4]
;;;1160 if (pnode_next != (OS_FLAG_NODE *)0) {
000138 b121 CBZ r1,|L1.324|
;;;1161 pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0; /* Link new 1st node PREV to NULL */
00013a 604b STR r3,[r1,#4]
00013c e002 B |L1.324|
|L1.318|
;;;1162 }
;;;1163 } else { /* No, A node somewhere in the list */
;;;1164 pnode_prev->OSFlagNodeNext = pnode_next; /* Link around the node to unlink */
00013e 6011 STR r1,[r2,#0]
;;;1165 if (pnode_next != (OS_FLAG_NODE *)0) { /* Was this the LAST node? */
000140 b101 CBZ r1,|L1.324|
;;;1166 pnode_next->OSFlagNodePrev = pnode_prev; /* No, Link around current node */
000142 604a STR r2,[r1,#4]
|L1.324|
;;;1167 }
;;;1168 }
;;;1169 #if OS_TASK_DEL_EN > 0
;;;1170 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB;
000144 6880 LDR r0,[r0,#8]
;;;1171 ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;
000146 6243 STR r3,[r0,#0x24]
;;;1172 #endif
;;;1173 }
000148 4770 BX lr
;;;1174 #endif
ENDP
OS_FlagTaskRdy PROC
;;;1101 static BOOLEAN OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;1102 {
00014a b510 PUSH {r4,lr}
;;;1103 OS_TCB *ptcb;
;;;1104 BOOLEAN sched;
;;;1105
;;;1106
;;;1107 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB; /* Point to TCB of waiting task */
00014c 6882 LDR r2,[r0,#8]
;;;1108 ptcb->OSTCBDly = 0;
00014e 2300 MOVS r3,#0
000150 8553 STRH r3,[r2,#0x2a]
;;;1109 ptcb->OSTCBFlagsRdy = flags_rdy;
000152 8511 STRH r1,[r2,#0x28]
;;;1110 ptcb->OSTCBStat &= ~(INT8U)OS_STAT_FLAG;
000154 f892f892 LDRB r1,[r2,#0x2c]
000158 f021f021 BIC r1,r1,#0x20
00015c f882f882 STRB r1,[r2,#0x2c]
;;;1111 ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
000160 f882f882 STRB r3,[r2,#0x2d]
;;;1112 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* Task now ready? */
000164 f892f892 LDRB r1,[r2,#0x2c]
000168 b999 CBNZ r1,|L1.402|
;;;1113 OSRdyGrp |= ptcb->OSTCBBitY; /* Put task into ready list */
00016a 49dc LDR r1,|L1.1244|
00016c f892f892 LDRB r3,[r2,#0x32]
000170 f891f891 LDRB r12,[r1,#0] ; OSRdyGrp
000174 ea43ea43 ORR r3,r3,r12
000178 700b STRB r3,[r1,#0] ; OSRdyGrp
;;;1114 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
00017a f892f892 LDRB r1,[r2,#0x30]
00017e 4bd8 LDR r3,|L1.1248|
000180 f892f892 LDRB r2,[r2,#0x31]
000184 f813f813 LDRB r12,[r3,r1]
000188 ea4cea4c ORR r2,r12,r2
00018c 545a STRB r2,[r3,r1]
;;;1115 sched = OS_TRUE;
00018e 2401 MOVS r4,#1
000190 e000 B |L1.404|
|L1.402|
;;;1116 } else {
;;;1117 sched = OS_FALSE;
000192 2400 MOVS r4,#0
|L1.404|
;;;1118 }
;;;1119 OS_FlagUnlink(pnode);
000194 f7fff7ff BL OS_FlagUnlink
;;;1120 return (sched);
000198 4620 MOV r0,r4
;;;1121 }
00019a bd10 POP {r4,pc}
;;;1122
ENDP
OSFlagDel PROC
;;;285 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *perr)
;;;286 {
00019c e92de92d PUSH {r4-r12,lr}
0001a0 4604 MOV r4,r0
0001a2 4688 MOV r8,r1
0001a4 4615 MOV r5,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;
;;;292 #endif
;;;293
;;;294
;;;295
;;;296 #if OS_ARG_CHK_EN > 0
;;;297 if (perr == (INT8U *)0) { /* Validate 'perr' */
0001a6 b915 CBNZ r5,|L1.430|
;;;298 return (pgrp);
0001a8 4620 MOV r0,r4
0001aa e8bde8bd POP {r4-r12,pc}
|L1.430|
;;;299 }
;;;300 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
0001ae b924 CBNZ r4,|L1.442|
;;;301 *perr = OS_ERR_FLAG_INVALID_PGRP;
0001b0 206e MOVS r0,#0x6e
0001b2 7028 STRB r0,[r5,#0]
;;;302 return (pgrp);
0001b4 4620 MOV r0,r4
0001b6 e8bde8bd POP {r4-r12,pc}
|L1.442|
;;;303 }
;;;304 #endif
;;;305 if (OSIntNesting > 0) { /* See if called from ISR ... */
0001ba 48c6 LDR r0,|L1.1236|
0001bc 7800 LDRB r0,[r0,#0] ; OSIntNesting
0001be b120 CBZ r0,|L1.458|
;;;306 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
0001c0 200f MOVS r0,#0xf
0001c2 7028 STRB r0,[r5,#0]
;;;307 return (pgrp);
0001c4 4620 MOV r0,r4
0001c6 e8bde8bd POP {r4-r12,pc}
|L1.458|
;;;308 }
;;;309 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
0001ca 7820 LDRB r0,[r4,#0]
0001cc 2805 CMP r0,#5
0001ce d004 BEQ |L1.474|
;;;310 *perr = OS_ERR_EVENT_TYPE;
0001d0 2001 MOVS r0,#1
0001d2 7028 STRB r0,[r5,#0]
;;;311 return (pgrp);
0001d4 4620 MOV r0,r4
0001d6 e8bde8bd POP {r4-r12,pc}
|L1.474|
;;;312 }
;;;313 OS_ENTER_CRITICAL();
0001da f7fff7ff BL OS_CPU_SR_Save
0001de 4683 MOV r11,r0
;;;314 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
0001e0 6866 LDR r6,[r4,#4]
0001e2 b10e CBZ r6,|L1.488|
;;;315 tasks_waiting = OS_TRUE; /* Yes */
0001e4 2701 MOVS r7,#1
0001e6 e000 B |L1.490|
|L1.488|
;;;316 } else {
;;;317 tasks_waiting = OS_FALSE; /* No */
0001e8 2700 MOVS r7,#0
|L1.490|
;;;318 }
;;;319 switch (opt) {
0001ea ea5fea5f MOVS r0,r8
0001ee f8dff8df LDR r9,|L1.1240|
0001f2 f04ff04f MOV r8,#0x3f
0001f6 f04ff04f MOV r10,#0
0001fa d003 BEQ |L1.516|
0001fc 2801 CMP r0,#1
0001fe d13f BNE |L1.640|
000200 b32e CBZ r6,|L1.590|
;;;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 *perr = OS_ERR_NONE;
;;;332 pgrp_return = (OS_FLAG_GRP *)0; /* Event Flag Group has been deleted */
;;;333 } else {
;;;334 OS_EXIT_CRITICAL();
;;;335 *perr = 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 */
000202 e01d B |L1.576|
|L1.516|
000204 b9a7 CBNZ r7,|L1.560|
000206 f884f884 STRB r8,[r4,#0xa]
00020a f884f884 STRB r10,[r4,#0xb]
00020e f884f884 STRB r10,[r4,#0]
000212 f8d9f8d9 LDR r0,[r9,#0] ; OSFlagFreeList
000216 6060 STR r0,[r4,#4]
000218 f8a4f8a4 STRH r10,[r4,#8]
00021c f8c9f8c9 STR r4,[r9,#0] ; OSFlagFreeList
000220 4658 MOV r0,r11
000222 f7fff7ff BL OS_CPU_SR_Restore
000226 f885f885 STRB r10,[r5,#0]
00022a 2000 MOVS r0,#0
00022c e8bde8bd POP {r4-r12,pc}
|L1.560|
000230 4658 MOV r0,r11
000232 f7fff7ff BL OS_CPU_SR_Restore
000236 2049 MOVS r0,#0x49
000238 7028 STRB r0,[r5,#0]
00023a 4620 MOV r0,r4
00023c e8bde8bd POP {r4-r12,pc}
|L1.576|
;;;343 (void)OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
000240 2100 MOVS r1,#0
000242 4630 MOV r0,r6
000244 f7fff7ff BL OS_FlagTaskRdy
;;;344 pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
000248 6836 LDR r6,[r6,#0]
00024a 2e00 CMP r6,#0
00024c d1f8 BNE |L1.576|
|L1.590|
;;;345 }
;;;346 #if OS_FLAG_NAME_SIZE > 1
;;;347 pgrp->OSFlagName[0] = '?'; /* Unknown name */
00024e f884f884 STRB r8,[r4,#0xa]
;;;348 pgrp->OSFlagName[1] = OS_ASCII_NUL;
000252 f884f884 STRB r10,[r4,#0xb]
;;;349 #endif
;;;350 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
000256 f884f884 STRB r10,[r4,#0]
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -