📄 os_flag.txt
字号:
;;;246
ENDP
OS_FlagUnlink PROC
000184 e8900006 LDM r0,{r1,r2} ;0
000188 e3a03000 MOV r3,#0 ;0
00018c e3520000 CMP r2,#0 ;0
000190 1a000004 BNE |L1.424|
000194 e590200c LDR r2,[r0,#0xc] ;0
000198 e3510000 CMP r1,#0 ;0
00019c e5821004 STR r1,[r2,#4] ;0
0001a0 15813004 STRNE r3,[r1,#4] ;0
0001a4 ea000002 B |L1.436|
|L1.424|
0001a8 e3510000 CMP r1,#0 ;0
0001ac e5821000 STR r1,[r2,#0] ;0
0001b0 15812004 STRNE r2,[r1,#4] ;0
|L1.436|
0001b4 e5900008 LDR r0,[r0,#8] ;0
0001b8 e5803024 STR r3,[r0,#0x24] ;0
0001bc e12fff1e BX lr ;0
ENDP
OS_FlagTaskRdy PROC
;;;1101 static BOOLEAN OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;1102 {
0001c0 e52de004 PUSH {lr}
;;;1103 OS_TCB *ptcb;
;;;1104 BOOLEAN sched;
;;;1105
;;;1106
;;;1107 ptcb = (OS_TCB *)pnode->OSFlagNodeTCB; /* Point to TCB of waiting task */
;;;1108 ptcb->OSTCBDly = 0;
0001c4 e5902008 LDR r2,[r0,#8]
0001c8 e3a03000 MOV r3,#0
0001cc e1c232ba STRH r3,[r2,#0x2a]
;;;1109 ptcb->OSTCBFlagsRdy = flags_rdy;
0001d0 e1c212b8 STRH r1,[r2,#0x28]
;;;1110 ptcb->OSTCBStat &= ~(INT8U)OS_STAT_FLAG;
0001d4 e5d2102c LDRB r1,[r2,#0x2c]
0001d8 e3c11020 BIC r1,r1,#0x20
;;;1111 ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
;;;1112 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* Task now ready? */
0001dc e31100ff TST r1,#0xff
0001e0 e5c2102c STRB r1,[r2,#0x2c] ;1110
;;;1113 OSRdyGrp |= ptcb->OSTCBBitY; /* Put task into ready list */
;;;1114 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;1115 sched = OS_TRUE;
;;;1116 } else {
;;;1117 sched = OS_FALSE;
0001e4 13a0c000 MOVNE r12,#0
0001e8 e5c2302d STRB r3,[r2,#0x2d] ;1111
0001ec 1a00000b BNE |L1.544|
0001f0 e59f16f8 LDR r1,|L1.2288|
0001f4 e5d23032 LDRB r3,[r2,#0x32] ;1113
0001f8 e5d1c000 LDRB r12,[r1,#0] ;1113 ; OSRdyGrp
0001fc e183300c ORR r3,r3,r12 ;1113
000200 e5c13000 STRB r3,[r1,#0] ;1113 ; OSRdyGrp
000204 e5d21030 LDRB r1,[r2,#0x30] ;1114
000208 e59f36e4 LDR r3,|L1.2292|
00020c e5d22031 LDRB r2,[r2,#0x31] ;1114
000210 e7d3c001 LDRB r12,[r3,r1] ;1114
000214 e182200c ORR r2,r2,r12 ;1114
000218 e3a0c001 MOV r12,#1 ;1115
00021c e7c32001 STRB r2,[r3,r1] ;1114
|L1.544|
;;;1118 }
;;;1119 OS_FlagUnlink(pnode);
000220 ebfffffe BL OS_FlagUnlink
;;;1120 return (sched);
000224 e49de004 POP {lr}
000228 e1a0000c MOV r0,r12
;;;1121 }
00022c e12fff1e BX lr
;;;1122
ENDP
OSFlagDel PROC
;;;285 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *perr)
;;;286 {
000230 e92d5ff0 PUSH {r4-r12,lr}
000234 e1a04000 MOV r4,r0
;;;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 ... */
000238 e59f06a8 LDR r0,|L1.2280|
00023c e1a09001 MOV r9,r1 ;286
000240 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000244 e1a06002 MOV r6,r2 ;286
000248 e3500000 CMP r0,#0
;;;306 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
00024c 13a0000f MOVNE r0,#0xf
;;;307 return (pgrp);
000250 1a00001f BNE |L1.724|
;;;308 }
;;;309 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
000254 e5d40000 LDRB r0,[r4,#0]
000258 e3500005 CMP r0,#5
;;;310 *perr = OS_ERR_EVENT_TYPE;
00025c 13a00001 MOVNE r0,#1
;;;311 return (pgrp);
000260 1a00001b BNE |L1.724|
;;;312 }
;;;313 OS_ENTER_CRITICAL();
000264 ebfffffe BL OS_CPU_SR_Save
;;;314 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
000268 e5945004 LDR r5,[r4,#4]
00026c e1a08000 MOV r8,r0 ;313
000270 e2957000 ADDS r7,r5,#0
;;;315 tasks_waiting = OS_TRUE; /* Yes */
000274 13a07001 MOVNE r7,#1
;;;316 } else {
;;;317 tasks_waiting = OS_FALSE; /* No */
;;;318 }
;;;319 switch (opt) {
000278 e59fa66c LDR r10,|L1.2284|
00027c e1b00009 MOVS r0,r9
000280 e3a0903f MOV r9,#0x3f
000284 e3a0b000 MOV r11,#0
000288 0a000002 BEQ |L1.664|
00028c e3500001 CMP r0,#1
000290 1a000027 BNE |L1.820|
000294 ea000016 B |L1.756|
|L1.664|
;;;320 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
;;;321 if (tasks_waiting == OS_FALSE) {
000298 e3570000 CMP r7,#0
00029c 1a000009 BNE |L1.712|
;;;322 #if OS_FLAG_NAME_SIZE > 1
;;;323 pgrp->OSFlagName[0] = '?'; /* Unknown name */
0002a0 e5c4900a STRB r9,[r4,#0xa]
;;;324 pgrp->OSFlagName[1] = OS_ASCII_NUL;
0002a4 e5c4b00b STRB r11,[r4,#0xb]
;;;325 #endif
;;;326 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
0002a8 e5c4b000 STRB r11,[r4,#0]
;;;327 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
0002ac e59a0000 LDR r0,[r10,#0] ; OSFlagFreeList
0002b0 e5840004 STR r0,[r4,#4]
;;;328 pgrp->OSFlagFlags = (OS_FLAGS)0;
0002b4 e1c4b0b8 STRH r11,[r4,#8]
;;;329 OSFlagFreeList = pgrp;
;;;330 OS_EXIT_CRITICAL();
0002b8 e1a00008 MOV r0,r8
0002bc e58a4000 STR r4,[r10,#0] ; OSFlagFreeList
0002c0 ebfffffe BL OS_CPU_SR_Restore
;;;331 *perr = OS_ERR_NONE;
;;;332 pgrp_return = (OS_FLAG_GRP *)0; /* Event Flag Group has been deleted */
0002c4 ea000017 B |L1.808|
|L1.712|
;;;333 } else {
;;;334 OS_EXIT_CRITICAL();
0002c8 e1a00008 MOV r0,r8
0002cc ebfffffe BL OS_CPU_SR_Restore
;;;335 *perr = OS_ERR_TASK_WAITING;
0002d0 e3a00049 MOV r0,#0x49
|L1.724|
;;;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;
0002d4 e5c60000 STRB r0,[r6,#0]
;;;365 pgrp_return = pgrp;
0002d8 e1a00004 MOV r0,r4
|L1.732|
0002dc e8bd5ff0 POP {r4-r12,lr}
;;;366 break;
;;;367 }
;;;368 return (pgrp_return);
;;;369 }
0002e0 e12fff1e BX lr
|L1.740|
0002e4 e3a01000 MOV r1,#0 ;343
0002e8 e1a00005 MOV r0,r5 ;343
0002ec ebfffffe BL OS_FlagTaskRdy
0002f0 e5955000 LDR r5,[r5,#0] ;344
|L1.756|
0002f4 e3550000 CMP r5,#0 ;342
0002f8 1afffff9 BNE |L1.740|
0002fc e5c4900a STRB r9,[r4,#0xa] ;347
000300 e5c4b00b STRB r11,[r4,#0xb] ;348
000304 e5c4b000 STRB r11,[r4,#0] ;350
000308 e59a0000 LDR r0,[r10,#0] ;351 ; OSFlagFreeList
00030c e5840004 STR r0,[r4,#4] ;351
000310 e1c4b0b8 STRH r11,[r4,#8] ;352
000314 e1a00008 MOV r0,r8 ;354
000318 e58a4000 STR r4,[r10,#0] ;354 ; OSFlagFreeList
00031c ebfffffe BL OS_CPU_SR_Restore
000320 e3570001 CMP r7,#1 ;355
000324 0bfffffe BLEQ OS_Sched
|L1.808|
000328 e3a00000 MOV r0,#0 ;359
00032c e5c6b000 STRB r11,[r6,#0] ;358
000330 eaffffe9 B |L1.732|
|L1.820|
000334 e1a00008 MOV r0,r8 ;363
000338 ebfffffe BL OS_CPU_SR_Restore
00033c e3a00007 MOV r0,#7 ;364
000340 eaffffe3 B |L1.724|
;;;370 #endif
ENDP
OSFlagNameGet PROC
;;;396 INT8U OSFlagNameGet (OS_FLAG_GRP *pgrp, INT8U *pname, INT8U *perr)
;;;397 {
000344 e92d41f0 PUSH {r4-r8,lr}
000348 e1a06000 MOV r6,r0
;;;398 INT8U len;
;;;399 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;400 OS_CPU_SR cpu_sr = 0;
;;;401 #endif
;;;402
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -