os_flag.txt
来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 1,214 行 · 第 1/5 页
TXT
1,214 行
;;;235 pgrp->OSFlagName[0] = '?';
;;;236 pgrp->OSFlagName[1] = OS_ASCII_NUL;
;;;237 #endif
;;;238 OS_EXIT_CRITICAL();
;;;239 *perr = OS_ERR_NONE;
;;;240 } else {
;;;241 OS_EXIT_CRITICAL();
;;;242 *perr = OS_ERR_FLAG_GRP_DEPLETED;
;;;243 }
;;;244 return (pgrp); /* Return pointer to event flag group */
;;;245 }
0000ea bd70 POP {r4-r6,pc}
|L1.236|
0000ec 48f9 LDR r0,|L1.1236|
0000ee 7800 LDRB r0,[r0,#0] ;222 ; OSIntNesting
0000f0 b118 CBZ r0,|L1.250|
0000f2 2010 MOVS r0,#0x10 ;223
0000f4 7028 STRB r0,[r5,#0] ;223
0000f6 2000 MOVS r0,#0 ;224
0000f8 bd70 POP {r4-r6,pc}
|L1.250|
0000fa f7fffffe BL OS_CPU_SR_Save
0000fe 49f6 LDR r1,|L1.1240|
000100 680c LDR r4,[r1,#0] ;227 ; OSFlagFreeList
000102 b16c CBZ r4,|L1.288|
000104 6862 LDR r2,[r4,#4] ;230
000106 600a STR r2,[r1,#0] ;230 ; OSFlagFreeList
000108 2105 MOVS r1,#5 ;231
00010a 7021 STRB r1,[r4,#0] ;231
00010c 8126 STRH r6,[r4,#8] ;232
00010e 2600 MOVS r6,#0 ;233
000110 6066 STR r6,[r4,#4] ;233
000112 213f MOVS r1,#0x3f ;235
000114 72a1 STRB r1,[r4,#0xa] ;235
000116 72e6 STRB r6,[r4,#0xb] ;236
000118 f7fffffe BL OS_CPU_SR_Restore
00011c 702e STRB r6,[r5,#0] ;239
00011e e003 B |L1.296|
|L1.288|
000120 f7fffffe BL OS_CPU_SR_Restore
000124 2072 MOVS r0,#0x72 ;242
000126 7028 STRB r0,[r5,#0] ;242
|L1.296|
000128 4620 MOV r0,r4 ;244
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 f892102c LDRB r1,[r2,#0x2c]
000158 f0210120 BIC r1,r1,#0x20
00015c f882102c STRB r1,[r2,#0x2c]
;;;1111 ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
000160 f882302d STRB r3,[r2,#0x2d]
;;;1112 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* Task now ready? */
000164 f892102c 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 f8923032 LDRB r3,[r2,#0x32]
000170 f891c000 LDRB r12,[r1,#0] ; OSRdyGrp
000174 ea43030c ORR r3,r3,r12
000178 700b STRB r3,[r1,#0] ; OSRdyGrp
;;;1114 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
00017a f8921030 LDRB r1,[r2,#0x30]
00017e 4bd8 LDR r3,|L1.1248|
000180 f8922031 LDRB r2,[r2,#0x31]
000184 f813c001 LDRB r12,[r3,r1]
000188 ea4c0202 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 f7fffffe 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 e92d5ff0 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
;;;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 ... */
;;;306 *perr = 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 *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 }
0001aa e8bd9ff0 POP {r4-r12,pc}
|L1.430|
0001ae b924 CBNZ r4,|L1.442|
0001b0 206e MOVS r0,#0x6e ;301
0001b2 7028 STRB r0,[r5,#0] ;301
0001b4 4620 MOV r0,r4 ;302
0001b6 e8bd9ff0 POP {r4-r12,pc}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?