📄 os_flag.txt
字号:
;;;244 return (pgrp); /* Return pointer to event flag group */
;;;245 }
0000dc bd70 POP {r4-r6,pc}
|L1.222|
0000de f7fff7ff BL OS_CPU_SR_Save
0000e2 49f3 LDR r1,|L1.1200|
0000e4 680c LDR r4,[r1,#0] ;227 ; OSFlagFreeList
0000e6 b16c CBZ r4,|L1.260|
0000e8 6862 LDR r2,[r4,#4] ;230
0000ea 600a STR r2,[r1,#0] ;230 ; OSFlagFreeList
0000ec 2105 MOVS r1,#5 ;231
0000ee 7021 STRB r1,[r4,#0] ;231
0000f0 8126 STRH r6,[r4,#8] ;232
0000f2 2600 MOVS r6,#0 ;233
0000f4 6066 STR r6,[r4,#4] ;233
0000f6 213f MOVS r1,#0x3f ;235
0000f8 72a1 STRB r1,[r4,#0xa] ;235
0000fa 72e6 STRB r6,[r4,#0xb] ;236
0000fc f7fff7ff BL OS_CPU_SR_Restore
000100 702e STRB r6,[r5,#0] ;239
000102 e003 B |L1.268|
|L1.260|
000104 f7fff7ff BL OS_CPU_SR_Restore
000108 2072 MOVS r0,#0x72 ;242
00010a 7028 STRB r0,[r5,#0] ;242
|L1.268|
00010c 4620 MOV r0,r4 ;244
00010e bd70 POP {r4-r6,pc}
;;;246
ENDP
OS_FlagUnlink PROC
;;;1154
;;;1155 pnode_prev = (OS_FLAG_NODE *)pnode->OSFlagNodePrev;
000110 6842 LDR r2,[r0,#4]
;;;1156 pnode_next = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
000112 6801 LDR r1,[r0,#0]
;;;1157 if (pnode_prev == (OS_FLAG_NODE *)0) { /* Is it first node in wait list? */
000114 2300 MOVS r3,#0
000116 b922 CBNZ r2,|L1.290|
;;;1158 pgrp = (OS_FLAG_GRP *)pnode->OSFlagNodeFlagGrp;
000118 68c2 LDR r2,[r0,#0xc]
;;;1159 pgrp->OSFlagWaitList = (void *)pnode_next; /* Update list for new 1st node */
00011a 6051 STR r1,[r2,#4]
;;;1160 if (pnode_next != (OS_FLAG_NODE *)0) {
00011c b121 CBZ r1,|L1.296|
;;;1161 pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0; /* Link new 1st node PREV to NULL */
00011e 604b STR r3,[r1,#4]
000120 e002 B |L1.296|
|L1.290|
;;;1162 }
;;;1163 } else { /* No, A node somewhere in the list */
;;;1164 pnode_prev->OSFlagNodeNext = pnode_next; /* Link around the node to unlink */
000122 6011 STR r1,[r2,#0]
;;;1165 if (pnode_next != (OS_FLAG_NODE *)0) { /* Was this the LAST node? */
000124 b101 CBZ r1,|L1.296|
;;;1166 pnode_next->OSFlagNodePrev = pnode_prev; /* No, Link around current node */
000126 604a STR r2,[r1,#4]
|L1.296|
;;;1167 }
;;;1168 }
;;;1169 #if OS_TASK_DEL_EN > 0
;;;1170 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB;
000128 6880 LDR r0,[r0,#8]
;;;1171 ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;
00012a 6283 STR r3,[r0,#0x28]
;;;1172 #endif
;;;1173 }
00012c 4770 BX lr
;;;1174 #endif
ENDP
OS_FlagTaskRdy PROC
;;;1101 static BOOLEAN OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;1102 {
00012e 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 */
000130 6882 LDR r2,[r0,#8]
;;;1108 ptcb->OSTCBDly = 0;
000132 2300 MOVS r3,#0
000134 322c ADDS r2,r2,#0x2c
000136 8053 STRH r3,[r2,#2]
;;;1109 ptcb->OSTCBFlagsRdy = flags_rdy;
000138 8011 STRH r1,[r2,#0]
;;;1110 ptcb->OSTCBStat &= ~(INT8U)OS_STAT_FLAG;
00013a 7911 LDRB r1,[r2,#4]
00013c f021f021 BIC r1,r1,#0x20
000140 7111 STRB r1,[r2,#4]
;;;1111 ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
000142 7153 STRB r3,[r2,#5]
;;;1112 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* Task now ready? */
000144 7911 LDRB r1,[r2,#4]
000146 3a2c SUBS r2,r2,#0x2c
000148 b969 CBNZ r1,|L1.358|
;;;1113 OSRdyGrp |= ptcb->OSTCBBitY; /* Put task into ready list */
00014a 4bda LDR r3,|L1.1204|
00014c 3234 ADDS r2,r2,#0x34
00014e 7891 LDRB r1,[r2,#2]
000150 781c LDRB r4,[r3,#0] ; OSRdyGrp
000152 4321 ORRS r1,r1,r4
000154 7019 STRB r1,[r3,#0] ; OSRdyGrp
;;;1114 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000156 7811 LDRB r1,[r2,#0]
000158 4bd7 LDR r3,|L1.1208|
00015a 7852 LDRB r2,[r2,#1]
00015c 5c5c LDRB r4,[r3,r1]
00015e 4314 ORRS r4,r4,r2
000160 545c STRB r4,[r3,r1]
;;;1115 sched = OS_TRUE;
000162 2401 MOVS r4,#1
000164 e000 B |L1.360|
|L1.358|
;;;1116 } else {
;;;1117 sched = OS_FALSE;
000166 2400 MOVS r4,#0
|L1.360|
;;;1118 }
;;;1119 OS_FlagUnlink(pnode);
000168 f7fff7ff BL OS_FlagUnlink
;;;1120 return (sched);
00016c 4620 MOV r0,r4
;;;1121 }
00016e bd10 POP {r4,pc}
;;;1122
ENDP
OSFlagDel PROC
;;;285 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *perr)
;;;286 {
000170 e92de92d PUSH {r4-r12,lr}
000174 4604 MOV r4,r0
000176 4689 MOV r9,r1
000178 4616 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;
;;;292 #endif
;;;293
;;;294
;;;295
;;;296 #if OS_ARG_CHK_EN > 0
;;;297 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;298 return (pgrp);
;;;299 }
;;;300 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
;;;301 *perr = OS_ERR_FLAG_INVALID_PGRP;
;;;302 return (pgrp);
;;;303 }
;;;304 #endif
;;;305 if (OSIntNesting > 0) { /* See if called from ISR ... */
00017a 48cc LDR r0,|L1.1196|
00017c 7800 LDRB r0,[r0,#0] ; OSIntNesting
00017e b120 CBZ r0,|L1.394|
;;;306 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
000180 200f MOVS r0,#0xf
000182 7030 STRB r0,[r6,#0]
;;;307 return (pgrp);
000184 4620 MOV r0,r4
|L1.390|
;;;308 }
;;;309 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
;;;310 *perr = 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 *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 */
;;;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;
;;;354 OS_EXIT_CRITICAL();
;;;355 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
;;;356 OS_Sched(); /* Find highest priority task ready to run */
;;;357 }
;;;358 *perr = OS_ERR_NONE;
;;;359 pgrp_return = (OS_FLAG_GRP *)0; /* Event Flag Group has been deleted */
;;;360 break;
;;;361
;;;362 default:
;;;363 OS_EXIT_CRITICAL();
;;;364 *perr = OS_ERR_INVALID_OPT;
;;;365 pgrp_return = pgrp;
;;;366 break;
;;;367 }
;;;368 return (pgrp_return);
;;;369 }
000186 e8bde8bd POP {r4-r12,pc}
|L1.394|
00018a 7820 LDRB r0,[r4,#0] ;309
00018c 2805 CMP r0,#5 ;309
00018e d003 BEQ |L1.408|
000190 2001 MOVS r0,#1 ;310
000192 7030 STRB r0,[r6,#0] ;310
000194 4620 MOV r0,r4 ;311
000196 e7f6 B |L1.390|
|L1.408|
000198 f7fff7ff BL OS_CPU_SR_Save
00019c 4680 MOV r8,r0 ;313
00019e 6865 LDR r5,[r4,#4] ;314
0001a0 b10d CBZ r5,|L1.422|
0001a2 2701 MOVS r7,#1 ;315
0001a4 e000 B |L1.424|
|L1.422|
0001a6 2700 MOVS r7,#0 ;317
|L1.424|
0001a8 ea5fea5f MOVS r0,r9 ;319
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -