📄 os_flag.txt
字号:
;;;294 OSFlagFreeList = pgrp;
;;;295 OS_EXIT_CRITICAL();
;;;296 *err = OS_NO_ERR;
;;;297 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
;;;298 } else {
;;;299 OS_EXIT_CRITICAL();
;;;300 *err = OS_ERR_TASK_WAITING;
;;;301 return (pgrp);
;;;302 }
;;;303
;;;304 case OS_DEL_ALWAYS: /* Always delete the event flag group */
;;;305 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
;;;306 while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags */
;;;307 OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
;;;308 pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
;;;309 }
;;;310 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
;;;311 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list */
;;;312 OSFlagFreeList = pgrp;
;;;313 OS_EXIT_CRITICAL();
;;;314 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
;;;315 OS_Sched(); /* Find highest priority task ready to run */
;;;316 }
;;;317 *err = OS_NO_ERR;
;;;318 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
;;;319
;;;320 default:
;;;321 OS_EXIT_CRITICAL();
;;;322 *err = OS_ERR_INVALID_OPT;
;;;323 return (pgrp);
;;;324 }
;;;325 }
000364 e12fff1e BX lr
|L1.872|
000368 e3540000 CMP r4,#0 ;274
00036c 1a000003 BNE |L1.896| ;274
000370 e3a00096 MOV r0,#0x96 ;275
000374 e5c60000 STRB r0,[r6,#0] ;275
000378 e1a00004 MOV r0,r4 ;276
00037c eafffff7 B |L1.864| ;276
|L1.896|
000380 e5d40000 LDRB r0,[r4,#0] ;278
000384 e3500005 CMP r0,#5 ;278
000388 0a000003 BEQ |L1.924| ;278
00038c e3a00001 MOV r0,#1 ;279
000390 e5c60000 STRB r0,[r6,#0] ;279
000394 e1a00004 MOV r0,r4 ;280
000398 eafffff0 B |L1.864| ;280
|L1.924|
00039c ef000002 SVC 0x2 ; formerly SWI ;283
0003a0 e5940004 LDR r0,[r4,#4] ;284
0003a4 e3500000 CMP r0,#0 ;284
0003a8 0a000001 BEQ |L1.948| ;284
0003ac e3a07001 MOV r7,#1 ;285
0003b0 ea000000 B |L1.952| ;285
|L1.948|
0003b4 e3a07000 MOV r7,#0 ;287
|L1.952|
0003b8 e3550000 CMP r5,#0 ;289
0003bc 0a000002 BEQ |L1.972| ;289
0003c0 e3550001 CMP r5,#1 ;289
0003c4 1a00002a BNE |L1.1140| ;289
0003c8 ea000012 B |L1.1048| ;289
|L1.972|
0003cc e1a00000 MOV r0,r0 ;290
0003d0 e3570000 CMP r7,#0 ;291
0003d4 1a00000a BNE |L1.1028| ;291
0003d8 e3a00000 MOV r0,#0 ;292
0003dc e5c40000 STRB r0,[r4,#0] ;292
0003e0 e59f0774 LDR r0,|L1.2908| ;293
0003e4 e5900000 LDR r0,[r0,#0] ;293 ; OSFlagFreeList
0003e8 e5840004 STR r0,[r4,#4] ;293
0003ec e59f0768 LDR r0,|L1.2908| ;294
0003f0 e5804000 STR r4,[r0,#0] ;294 ; OSFlagFreeList
0003f4 ef000003 SVC 0x3 ; formerly SWI ;295
0003f8 e3a00000 MOV r0,#0 ;296
0003fc e5c60000 STRB r0,[r6,#0] ;296
000400 eaffffd6 B |L1.864| ;297
|L1.1028|
000404 ef000003 SVC 0x3 ; formerly SWI ;299
000408 e3a00008 MOV r0,#8 ;300
00040c e5c60000 STRB r0,[r6,#0] ;300
000410 e1a00004 MOV r0,r4 ;301
000414 eaffffd1 B |L1.864| ;301
|L1.1048|
000418 e1a00000 MOV r0,r0 ;304
00041c e5948004 LDR r8,[r4,#4] ;305
000420 ea000003 B |L1.1076| ;306
|L1.1060|
000424 e3a01000 MOV r1,#0 ;307
000428 e1a00008 MOV r0,r8 ;307
00042c ebfffffe BL OS_FlagTaskRdy ;307
000430 e5988000 LDR r8,[r8,#0] ;308
|L1.1076|
000434 e3580000 CMP r8,#0 ;306
000438 1afffff9 BNE |L1.1060| ;306
00043c e3a00000 MOV r0,#0 ;310
000440 e5c40000 STRB r0,[r4,#0] ;310
000444 e59f0710 LDR r0,|L1.2908| ;311
000448 e5900000 LDR r0,[r0,#0] ;311 ; OSFlagFreeList
00044c e5840004 STR r0,[r4,#4] ;311
000450 e59f0704 LDR r0,|L1.2908| ;312
000454 e5804000 STR r4,[r0,#0] ;312 ; OSFlagFreeList
000458 ef000003 SVC 0x3 ; formerly SWI ;313
00045c e3570001 CMP r7,#1 ;314
000460 1a000000 BNE |L1.1128| ;314
000464 ebfffffe BL OS_Sched ;315
|L1.1128|
000468 e3a00000 MOV r0,#0 ;317
00046c e5c60000 STRB r0,[r6,#0] ;317
000470 eaffffba B |L1.864| ;318
|L1.1140|
000474 e1a00000 MOV r0,r0 ;320
000478 ef000003 SVC 0x3 ; formerly SWI ;321
00047c e3a00007 MOV r0,#7 ;322
000480 e5c60000 STRB r0,[r6,#0] ;322
000484 e1a00004 MOV r0,r4 ;323
000488 eaffffb4 B |L1.864| ;323
ENDP
OS_FlagBlock PROC
;;;731 static void OS_FlagBlock (OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout)
;;;732 {
00048c e92d4070 PUSH {r4-r6,lr}
000490 e59dc010 LDR r12,[sp,#0x10]
;;;733 OS_FLAG_NODE *pnode_next;
;;;734
;;;735
;;;736 OSTCBCur->OSTCBStat |= OS_STAT_FLAG;
000494 e59f46cc LDR r4,|L1.2920|
000498 e5944000 LDR r4,[r4,#0] ; OSTCBCur
00049c e5d4402c LDRB r4,[r4,#0x2c]
0004a0 e3844020 ORR r4,r4,#0x20
0004a4 e59f56bc LDR r5,|L1.2920|
0004a8 e5955000 LDR r5,[r5,#0] ; OSTCBCur
0004ac e5c5402c STRB r4,[r5,#0x2c]
;;;737 OSTCBCur->OSTCBDly = timeout; /* Store timeout in task's TCB */
0004b0 e59f46b0 LDR r4,|L1.2920|
0004b4 e5944000 LDR r4,[r4,#0] ; OSTCBCur
0004b8 e1c4c2ba STRH r12,[r4,#0x2a]
;;;738 #if OS_TASK_DEL_EN > 0
;;;739 OSTCBCur->OSTCBFlagNode = pnode; /* TCB to link to node */
0004bc e59f46a4 LDR r4,|L1.2920|
0004c0 e5944000 LDR r4,[r4,#0] ; OSTCBCur
0004c4 e5841024 STR r1,[r4,#0x24]
;;;740 #endif
;;;741 pnode->OSFlagNodeFlags = flags; /* Save the flags that we need to wait for */
0004c8 e1c121b0 STRH r2,[r1,#0x10]
;;;742 pnode->OSFlagNodeWaitType = wait_type; /* Save the type of wait we are doing */
0004cc e5c13012 STRB r3,[r1,#0x12]
;;;743 pnode->OSFlagNodeTCB = (void *)OSTCBCur; /* Link to task's TCB */
0004d0 e59f4690 LDR r4,|L1.2920|
0004d4 e5944000 LDR r4,[r4,#0] ; OSTCBCur
0004d8 e5814008 STR r4,[r1,#8]
;;;744 pnode->OSFlagNodeNext = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
0004dc e5904004 LDR r4,[r0,#4]
0004e0 e5814000 STR r4,[r1,#0]
;;;745 pnode->OSFlagNodePrev = (void *)0;
0004e4 e3a04000 MOV r4,#0
0004e8 e5814004 STR r4,[r1,#4]
;;;746 pnode->OSFlagNodeFlagGrp = (void *)pgrp; /* Link to Event Flag Group */
0004ec e581000c STR r0,[r1,#0xc]
;;;747 pnode_next = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
0004f0 e590e004 LDR lr,[r0,#4]
;;;748 if (pnode_next != (void *)0) { /* Is this the first NODE to insert? */
0004f4 e35e0000 CMP lr,#0
0004f8 0a000000 BEQ |L1.1280|
;;;749 pnode_next->OSFlagNodePrev = pnode; /* No, link in doubly linked list */
0004fc e58e1004 STR r1,[lr,#4]
;;;750 }
;;;751 pgrp->OSFlagWaitList = (void *)pnode;
|L1.1280|
000500 e5801004 STR r1,[r0,#4]
;;;752 /* Suspend current task until flag(s) received */
;;;753 if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
000504 e59f465c LDR r4,|L1.2920|
000508 e5944000 LDR r4,[r4,#0] ; OSTCBCur
00050c e5d4402f LDRB r4,[r4,#0x2f]
000510 e59f564c LDR r5,|L1.2916|
000514 e7d54004 LDRB r4,[r5,r4]
000518 e59f5648 LDR r5,|L1.2920|
00051c e5955000 LDR r5,[r5,#0] ; OSTCBCur
000520 e5d55030 LDRB r5,[r5,#0x30]
000524 e1c44005 BIC r4,r4,r5
000528 e21440ff ANDS r4,r4,#0xff
00052c e59f5634 LDR r5,|L1.2920|
000530 e5955000 LDR r5,[r5,#0] ; OSTCBCur
000534 e5d5502f LDRB r5,[r5,#0x2f]
000538 e59f6624 LDR r6,|L1.2916|
00053c e7c64005 STRB r4,[r6,r5]
000540 1a000007 BNE |L1.1380|
;;;754 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
000544 e59f461c LDR r4,|L1.2920|
000548 e5944000 LDR r4,[r4,#0] ; OSTCBCur
00054c e5d44031 LDRB r4,[r4,#0x31]
000550 e59f5608 LDR r5,|L1.2912|
000554 e5d55000 LDRB r5,[r5,#0] ; OSRdyGrp
000558 e1c54004 BIC r4,r5,r4
00055c e59f55fc LDR r5,|L1.2912|
000560 e5c54000 STRB r4,[r5,#0] ; OSRdyGrp
;;;755 }
;;;756 }
|L1.1380|
000564 e8bd4070 POP {r4-r6,lr}
000568 e12fff1e BX lr
ENDP
OSFlagPend PROC
;;;377 OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err)
;;;378 {
00056c e92d4ff0 PUSH {r4-r11,lr}
000570 e24dd01c SUB sp,sp,#0x1c
000574 e1a04000 MOV r4,r0
000578 e1a05001 MOV r5,r1
00057c e1a06002 MOV r6,r2
000580 e1a07003 MOV r7,r3
000584 e59d8040 LDR r8,[sp,#0x40]
;;;379 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;380 OS_CPU_SR cpu_sr;
;;;381 #endif
;;;382 OS_FLAG_NODE node;
;;;383 OS_FLAGS flags_cur;
;;;384 OS_FLAGS flags_rdy;
;;;385 BOOLEAN consume;
;;;386
;;;387
;;;388 if (OSIntNesting > 0) { /* See if called from ISR ... */
000588 e59f05c8 LDR r0,|L1.2904|
00058c e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000590 e3500000 CMP r0,#0
000594 da000005 BLE |L1.1456|
;;;389 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000598 e3a00002 MOV r0,#2
00059c e5c80000 STRB r0,[r8,#0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -