os_flag.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,195 行 · 第 1/5 页
TXT
1,195 行
|L1.800|
000320 ef000002 SVC #0x2 ;283
000324 e5946004 LDR r6,[r4,#4] ;284
000328 e3560000 CMP r6,#0 ;284
00032c 0a000001 BEQ |L1.824|
000330 e3a07001 MOV r7,#1 ;285
000334 ea000000 B |L1.828|
|L1.824|
000338 e3a07000 MOV r7,#0 ;287
|L1.828|
00033c e59f8640 LDR r8,|L1.2436|
000340 e35a0000 CMP r10,#0 ;289
000344 e3a09000 MOV r9,#0 ;287
000348 0a000002 BEQ |L1.856|
00034c e35a0001 CMP r10,#1 ;289
000350 1a000020 BNE |L1.984|
000354 ea000012 B |L1.932|
|L1.856|
000358 e3570000 CMP r7,#0 ;291
00035c 1a000007 BNE |L1.896|
000360 e5c49000 STRB r9,[r4,#0] ;292
000364 e5980000 LDR r0,[r8,#0] ;293 ; OSFlagFreeList
000368 e5840004 STR r0,[r4,#4] ;293
00036c e5884000 STR r4,[r8,#0] ;294 ; OSFlagFreeList
000370 ef000003 SVC #0x3 ;295
000374 e5c59000 STRB r9,[r5,#0] ;296
000378 e3a00000 MOV r0,#0 ;297
00037c eaffffd8 B |L1.740|
|L1.896|
000380 ef000003 SVC #0x3 ;299
000384 e3a00008 MOV r0,#8 ;300
000388 e5c50000 STRB r0,[r5,#0] ;300
00038c e1a00004 MOV r0,r4 ;301
000390 eaffffd3 B |L1.740|
|L1.916|
000394 e3a01000 MOV r1,#0 ;307
000398 e1a00006 MOV r0,r6 ;307
00039c ebfffffe BL OS_FlagTaskRdy
0003a0 e5966000 LDR r6,[r6,#0] ;308
|L1.932|
0003a4 e3560000 CMP r6,#0 ;306
0003a8 1afffff9 BNE |L1.916|
0003ac e5c49000 STRB r9,[r4,#0] ;310
0003b0 e5980000 LDR r0,[r8,#0] ;311 ; OSFlagFreeList
0003b4 e5840004 STR r0,[r4,#4] ;311
0003b8 e5884000 STR r4,[r8,#0] ;312 ; OSFlagFreeList
0003bc ef000003 SVC #0x3 ;313
0003c0 e3570001 CMP r7,#1 ;314
0003c4 1a000000 BNE |L1.972|
0003c8 ebfffffe BL OS_Sched
|L1.972|
0003cc e5c59000 STRB r9,[r5,#0] ;317
0003d0 e3a00000 MOV r0,#0 ;318
0003d4 eaffffc2 B |L1.740|
|L1.984|
0003d8 ef000003 SVC #0x3 ;321
0003dc e3a00007 MOV r0,#7 ;322
0003e0 e5c50000 STRB r0,[r5,#0] ;322
0003e4 e1a00004 MOV r0,r4 ;323
0003e8 eaffffbd B |L1.740|
;;;326 #endif
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 {
0003ec e92d4030 PUSH {r4,r5,lr}
0003f0 e59d400c LDR r4,[sp,#0xc]
;;;733 OS_FLAG_NODE *pnode_next;
;;;734
;;;735
;;;736 OSTCBCur->OSTCBStat |= OS_STAT_FLAG;
0003f4 e59fe594 LDR lr,|L1.2448|
0003f8 e59ec000 LDR r12,[lr,#0] ; OSTCBCur
0003fc e5dc502c LDRB r5,[r12,#0x2c]
000400 e3855020 ORR r5,r5,#0x20
000404 e5cc502c STRB r5,[r12,#0x2c]
;;;737 OSTCBCur->OSTCBDly = timeout; /* Store timeout in task's TCB */
000408 e1cc42ba STRH r4,[r12,#0x2a]
;;;738 #if OS_TASK_DEL_EN > 0
;;;739 OSTCBCur->OSTCBFlagNode = pnode; /* TCB to link to node */
00040c e58c1024 STR r1,[r12,#0x24]
;;;740 #endif
;;;741 pnode->OSFlagNodeFlags = flags; /* Save the flags that we need to wait for */
000410 e1c121b0 STRH r2,[r1,#0x10]
;;;742 pnode->OSFlagNodeWaitType = wait_type; /* Save the type of wait we are doing */
000414 e5c13012 STRB r3,[r1,#0x12]
;;;743 pnode->OSFlagNodeTCB = (void *)OSTCBCur; /* Link to task's TCB */
000418 e581c008 STR r12,[r1,#8]
;;;744 pnode->OSFlagNodeNext = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
00041c e5902004 LDR r2,[r0,#4]
000420 e5812000 STR r2,[r1,#0]
;;;745 pnode->OSFlagNodePrev = (void *)0;
000424 e3a02000 MOV r2,#0
000428 e5812004 STR r2,[r1,#4]
;;;746 pnode->OSFlagNodeFlagGrp = (void *)pgrp; /* Link to Event Flag Group */
00042c e581000c STR r0,[r1,#0xc]
;;;747 pnode_next = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
000430 e5902004 LDR r2,[r0,#4]
;;;748 if (pnode_next != (void *)0) { /* Is this the first NODE to insert? */
000434 e3520000 CMP r2,#0
000438 0a000000 BEQ |L1.1088|
;;;749 pnode_next->OSFlagNodePrev = pnode; /* No, link in doubly linked list */
00043c e5821004 STR r1,[r2,#4]
|L1.1088|
;;;750 }
;;;751 pgrp->OSFlagWaitList = (void *)pnode;
000440 e5801004 STR r1,[r0,#4]
;;;752 /* Suspend current task until flag(s) received */
;;;753 if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
000444 e59e0000 LDR r0,[lr,#0] ; OSTCBCur
000448 e59f353c LDR r3,|L1.2444|
00044c e5d0102f LDRB r1,[r0,#0x2f]
000450 e5d0c030 LDRB r12,[r0,#0x30]
000454 e7d32001 LDRB r2,[r3,r1]
000458 e1d2200c BICS r2,r2,r12
00045c e7c32001 STRB r2,[r3,r1]
000460 1a000004 BNE |L1.1144|
;;;754 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
000464 e5d01031 LDRB r1,[r0,#0x31]
000468 e59f0518 LDR r0,|L1.2440|
00046c e5d02000 LDRB r2,[r0,#0] ; OSRdyGrp
000470 e1c21001 BIC r1,r2,r1
000474 e5c01000 STRB r1,[r0,#0] ; OSRdyGrp
|L1.1144|
;;;755 }
;;;756 }
000478 e8bd4030 POP {r4,r5,lr}
00047c e12fff1e BX lr
;;;757
ENDP
OSFlagPend PROC
;;;377 OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err)
;;;378 {
000480 e92d47f0 PUSH {r4-r10,lr}
000484 e24dd018 SUB sp,sp,#0x18
000488 e59d5038 LDR r5,[sp,#0x38]
00048c e1a04000 MOV r4,r0
000490 e1a07001 MOV r7,r1
000494 e1a08002 MOV r8,r2
000498 e1a0a003 MOV r10,r3
;;;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 ... */
00049c e59f04dc LDR r0,|L1.2432|
0004a0 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0004a4 e3500000 CMP r0,#0
0004a8 0a000005 BEQ |L1.1220|
;;;389 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
0004ac e3a00002 MOV r0,#2
0004b0 e5c50000 STRB r0,[r5,#0]
;;;390 return ((OS_FLAGS)0);
0004b4 e3a00000 MOV r0,#0
|L1.1208|
0004b8 e28dd018 ADD sp,sp,#0x18
0004bc e8bd47f0 POP {r4-r10,lr}
;;;391 }
;;;392 #if OS_ARG_CHK_EN > 0
;;;393 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
;;;394 *err = OS_FLAG_INVALID_PGRP;
;;;395 return ((OS_FLAGS)0);
;;;396 }
;;;397 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
;;;398 *err = OS_ERR_EVENT_TYPE;
;;;399 return ((OS_FLAGS)0);
;;;400 }
;;;401 #endif
;;;402 if (wait_type & OS_FLAG_CONSUME) { /* See if we need to consume the flags */
;;;403 wait_type &= ~OS_FLAG_CONSUME;
;;;404 consume = TRUE;
;;;405 } else {
;;;406 consume = FALSE;
;;;407 }
;;;408 /*$PAGE*/
;;;409 OS_ENTER_CRITICAL();
;;;410 switch (wait_type) {
;;;411 case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
;;;412 flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
;;;413 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
;;;414 if (consume == TRUE) { /* See if we need to consume the flags */
;;;415 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
;;;416 }
;;;417 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
;;;418 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;419 *err = OS_NO_ERR;
;;;420 return (flags_cur);
;;;421 } else { /* Block task until events occur or timeout */
;;;422 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;423 OS_EXIT_CRITICAL();
;;;424 }
;;;425 break;
;;;426
;;;427 case OS_FLAG_WAIT_SET_ANY:
;;;428 flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
;;;429 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
;;;430 if (consume == TRUE) { /* See if we need to consume the flags */
;;;431 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
;;;432 }
;;;433 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
;;;434 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;435 *err = OS_NO_ERR;
;;;436 return (flags_cur);
;;;437 } else { /* Block task until events occur or timeout */
;;;438 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;439 OS_EXIT_CRITICAL();
;;;440 }
;;;441 break;
;;;442
;;;443 #if OS_FLAG_WAIT_CLR_EN > 0
;;;444 case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
;;;445 flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
;;;446 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
;;;447 if (consume == TRUE) { /* See if we need to consume the flags */
;;;448 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
;;;449 }
;;;450 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
;;;451 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;452 *err = OS_NO_ERR;
;;;453 return (flags_cur);
;;;454 } else { /* Block task until events occur or timeout */
;;;455 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;456 OS_EXIT_CRITICAL();
;;;457 }
;;;458 break;
;;;459
;;;460 case OS_FLAG_WAIT_CLR_ANY:
;;;461 flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
;;;462 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
;;;463 if (consume == TRUE) { /* See if we need to consume the flags */
;;;464 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
;;;465 }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?