📄 os_flag.txt
字号:
;;;299 } else {
;;;300 OS_EXIT_CRITICAL();
;;;301 *err = OS_ERR_TASK_WAITING;
;;;302 return (pgrp);
;;;303 }
;;;304
;;;305 case OS_DEL_ALWAYS: /* Always delete the event flag group */
;;;306 pnode = pgrp->OSFlagWaitList;
;;;307 while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags */
;;;308 OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
;;;309 pnode = pnode->OSFlagNodeNext;
;;;310 }
;;;311 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
;;;312 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list */
;;;313 OSFlagFreeList = pgrp;
;;;314 OS_EXIT_CRITICAL();
;;;315 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
;;;316 OS_Sched(); /* Find highest priority task ready to run */
;;;317 }
;;;318 *err = OS_NO_ERR;
;;;319 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
;;;320
;;;321 default:
;;;322 OS_EXIT_CRITICAL();
;;;323 *err = OS_ERR_INVALID_OPT;
;;;324 return (pgrp);
;;;325 }
;;;326 }
|L1.848|
000350 e8bd81f0 POP {r4-r8,pc}
|L1.852|
000354 e3540000 CMP r4,#0 ;275
000358 1a000003 BNE |L1.876| ;275
00035c e3a00096 MOV r0,#0x96 ;276
000360 e5c60000 STRB r0,[r6,#0] ;276
000364 e1a00004 MOV r0,r4 ;277
000368 eafffff8 B |L1.848| ;277
|L1.876|
00036c e5d40000 LDRB r0,[r4,#0] ;279
000370 e3500005 CMP r0,#5 ;279
000374 0a000003 BEQ |L1.904| ;279
000378 e3a00001 MOV r0,#1 ;280
00037c e5c60000 STRB r0,[r6,#0] ;280
000380 e1a00004 MOV r0,r4 ;281
000384 eafffff1 B |L1.848| ;281
|L1.904|
000388 ef000002 SVC 0x2 ; formerly SWI ;284
00038c e5940004 LDR r0,[r4,#4] ;285
000390 e3500000 CMP r0,#0 ;285
000394 0a000001 BEQ |L1.928| ;285
000398 e3a07001 MOV r7,#1 ;286
00039c ea000000 B |L1.932| ;286
|L1.928|
0003a0 e3a07000 MOV r7,#0 ;288
|L1.932|
0003a4 e3550000 CMP r5,#0 ;290
0003a8 0a000002 BEQ |L1.952| ;290
0003ac e3550001 CMP r5,#1 ;290
0003b0 1a00002a BNE |L1.1120| ;290
0003b4 ea000012 B |L1.1028| ;290
|L1.952|
0003b8 e1a00000 MOV r0,r0 ;291
0003bc e3570000 CMP r7,#0 ;292
0003c0 1a00000a BNE |L1.1008| ;292
0003c4 e3a00000 MOV r0,#0 ;293
0003c8 e5c40000 STRB r0,[r4,#0] ;293
0003cc e59f0764 LDR r0,|L1.2872| ;294
0003d0 e5900000 LDR r0,[r0,#0] ;294 ; OSFlagFreeList
0003d4 e5840004 STR r0,[r4,#4] ;294
0003d8 e59f0758 LDR r0,|L1.2872| ;295
0003dc e5804000 STR r4,[r0,#0] ;295 ; OSFlagFreeList
0003e0 ef000003 SVC 0x3 ; formerly SWI ;296
0003e4 e3a00000 MOV r0,#0 ;297
0003e8 e5c60000 STRB r0,[r6,#0] ;297
0003ec eaffffd7 B |L1.848| ;298
|L1.1008|
0003f0 ef000003 SVC 0x3 ; formerly SWI ;300
0003f4 e3a00008 MOV r0,#8 ;301
0003f8 e5c60000 STRB r0,[r6,#0] ;301
0003fc e1a00004 MOV r0,r4 ;302
000400 eaffffd2 B |L1.848| ;302
|L1.1028|
000404 e1a00000 MOV r0,r0 ;305
000408 e5948004 LDR r8,[r4,#4] ;306
00040c ea000003 B |L1.1056| ;307
|L1.1040|
000410 e3a01000 MOV r1,#0 ;308
000414 e1a00008 MOV r0,r8 ;308
000418 ebfffffe BL OS_FlagTaskRdy ;308
00041c e5988000 LDR r8,[r8,#0] ;309
|L1.1056|
000420 e3580000 CMP r8,#0 ;307
000424 1afffff9 BNE |L1.1040| ;307
000428 e3a00000 MOV r0,#0 ;311
00042c e5c40000 STRB r0,[r4,#0] ;311
000430 e59f0700 LDR r0,|L1.2872| ;312
000434 e5900000 LDR r0,[r0,#0] ;312 ; OSFlagFreeList
000438 e5840004 STR r0,[r4,#4] ;312
00043c e59f06f4 LDR r0,|L1.2872| ;313
000440 e5804000 STR r4,[r0,#0] ;313 ; OSFlagFreeList
000444 ef000003 SVC 0x3 ; formerly SWI ;314
000448 e3570001 CMP r7,#1 ;315
00044c 1a000000 BNE |L1.1108| ;315
000450 ebfffffe BL OS_Sched ;316
|L1.1108|
000454 e3a00000 MOV r0,#0 ;318
000458 e5c60000 STRB r0,[r6,#0] ;318
00045c eaffffbb B |L1.848| ;319
|L1.1120|
000460 e1a00000 MOV r0,r0 ;321
000464 ef000003 SVC 0x3 ; formerly SWI ;322
000468 e3a00007 MOV r0,#7 ;323
00046c e5c60000 STRB r0,[r6,#0] ;323
000470 e1a00004 MOV r0,r4 ;324
000474 eaffffb5 B |L1.848| ;324
ENDP
OS_FlagBlock PROC
;;;732 static void OS_FlagBlock (OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout)
;;;733 {
000478 e92d4070 PUSH {r4-r6,lr}
00047c e59dc010 LDR r12,[sp,#0x10]
;;;734 OS_FLAG_NODE *pnode_next;
;;;735
;;;736
;;;737 OSTCBCur->OSTCBStat |= OS_STAT_FLAG;
000480 e59f46bc LDR r4,|L1.2884|
000484 e5944000 LDR r4,[r4,#0] ; OSTCBCur
000488 e5d4401c LDRB r4,[r4,#0x1c]
00048c e3844020 ORR r4,r4,#0x20
000490 e59f56ac LDR r5,|L1.2884|
000494 e5955000 LDR r5,[r5,#0] ; OSTCBCur
000498 e5c5401c STRB r4,[r5,#0x1c]
;;;738 OSTCBCur->OSTCBDly = timeout; /* Store timeout in task's TCB */
00049c e59f46a0 LDR r4,|L1.2884|
0004a0 e5944000 LDR r4,[r4,#0] ; OSTCBCur
0004a4 e1c4c1ba STRH r12,[r4,#0x1a]
;;;739 #if OS_TASK_DEL_EN > 0
;;;740 OSTCBCur->OSTCBFlagNode = pnode; /* TCB to link to node */
0004a8 e59f4694 LDR r4,|L1.2884|
0004ac e5944000 LDR r4,[r4,#0] ; OSTCBCur
0004b0 e5841014 STR r1,[r4,#0x14]
;;;741 #endif
;;;742 pnode->OSFlagNodeFlags = flags; /* Save the flags that we need to wait for */
0004b4 e1c121b0 STRH r2,[r1,#0x10]
;;;743 pnode->OSFlagNodeWaitType = wait_type; /* Save the type of wait we are doing */
0004b8 e5c13012 STRB r3,[r1,#0x12]
;;;744 pnode->OSFlagNodeTCB = (void *)OSTCBCur; /* Link to task's TCB */
0004bc e59f4680 LDR r4,|L1.2884|
0004c0 e5944000 LDR r4,[r4,#0] ; OSTCBCur
0004c4 e5814008 STR r4,[r1,#8]
;;;745 pnode->OSFlagNodeNext = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
0004c8 e5904004 LDR r4,[r0,#4]
0004cc e5814000 STR r4,[r1,#0]
;;;746 pnode->OSFlagNodePrev = (void *)0;
0004d0 e3a04000 MOV r4,#0
0004d4 e5814004 STR r4,[r1,#4]
;;;747 pnode->OSFlagNodeFlagGrp = (void *)pgrp; /* Link to Event Flag Group */
0004d8 e581000c STR r0,[r1,#0xc]
;;;748 pnode_next = pgrp->OSFlagWaitList;
0004dc e590e004 LDR lr,[r0,#4]
;;;749 if (pnode_next != (void *)0) { /* Is this the first NODE to insert? */
0004e0 e35e0000 CMP lr,#0
0004e4 0a000000 BEQ |L1.1260|
;;;750 pnode_next->OSFlagNodePrev = pnode; /* No, link in doubly linked list */
0004e8 e58e1004 STR r1,[lr,#4]
;;;751 }
;;;752 pgrp->OSFlagWaitList = (void *)pnode;
|L1.1260|
0004ec e5801004 STR r1,[r0,#4]
;;;753 /* Suspend current task until flag(s) received */
;;;754 if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
0004f0 e59f464c LDR r4,|L1.2884|
0004f4 e5944000 LDR r4,[r4,#0] ; OSTCBCur
0004f8 e5d4401f LDRB r4,[r4,#0x1f]
0004fc e59f563c LDR r5,|L1.2880|
000500 e7d54004 LDRB r4,[r5,r4]
000504 e59f5638 LDR r5,|L1.2884|
000508 e5955000 LDR r5,[r5,#0] ; OSTCBCur
00050c e5d55020 LDRB r5,[r5,#0x20]
000510 e1c44005 BIC r4,r4,r5
000514 e21440ff ANDS r4,r4,#0xff
000518 e59f5624 LDR r5,|L1.2884|
00051c e5955000 LDR r5,[r5,#0] ; OSTCBCur
000520 e5d5501f LDRB r5,[r5,#0x1f]
000524 e59f6614 LDR r6,|L1.2880|
000528 e7c64005 STRB r4,[r6,r5]
00052c 1a000007 BNE |L1.1360|
;;;755 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
000530 e59f460c LDR r4,|L1.2884|
000534 e5944000 LDR r4,[r4,#0] ; OSTCBCur
000538 e5d44021 LDRB r4,[r4,#0x21]
00053c e59f55f8 LDR r5,|L1.2876|
000540 e5d55000 LDRB r5,[r5,#0] ; OSRdyGrp
000544 e1c54004 BIC r4,r5,r4
000548 e59f55ec LDR r5,|L1.2876|
00054c e5c54000 STRB r4,[r5,#0] ; OSRdyGrp
;;;756 }
;;;757 }
|L1.1360|
000550 e8bd8070 POP {r4-r6,pc}
ENDP
OSFlagPend PROC
;;;378 OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err)
;;;379 {
000554 e92d4ff0 PUSH {r4-r11,lr}
000558 e24dd01c SUB sp,sp,#0x1c
00055c e1a04000 MOV r4,r0
000560 e1a05001 MOV r5,r1
000564 e1a06002 MOV r6,r2
000568 e1a07003 MOV r7,r3
00056c e59d8040 LDR r8,[sp,#0x40]
;;;380 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;381 OS_CPU_SR cpu_sr;
;;;382 #endif
;;;383 OS_FLAG_NODE node;
;;;384 OS_FLAGS flags_cur;
;;;385 OS_FLAGS flags_rdy;
;;;386 BOOLEAN consume;
;;;387
;;;388
;;;389 if (OSIntNesting > 0) { /* See if called from ISR ... */
000570 e59f05bc LDR r0,|L1.2868|
000574 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000578 e3500000 CMP r0,#0
00057c da000004 BLE |L1.1428|
;;;390 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000580 e3a00002 MOV r0,#2
000584 e5c80000 STRB r0,[r8,#0]
;;;391 return ((OS_FLAGS)0);
000588 e3a00000 MOV r0,#0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -