📄 os_flag.txt
字号:
|L1.1420|
00058c e28dd01c ADD sp,sp,#0x1c
;;;392 }
;;;393 #if OS_ARG_CHK_EN > 0
;;;394 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
;;;395 *err = OS_FLAG_INVALID_PGRP;
;;;396 return ((OS_FLAGS)0);
;;;397 }
;;;398 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
;;;399 *err = OS_ERR_EVENT_TYPE;
;;;400 return ((OS_FLAGS)0);
;;;401 }
;;;402 #endif
;;;403 if (wait_type & OS_FLAG_CONSUME) { /* See if we need to consume the flags */
;;;404 wait_type &= ~OS_FLAG_CONSUME;
;;;405 consume = TRUE;
;;;406 } else {
;;;407 consume = FALSE;
;;;408 }
;;;409 /*$PAGE*/
;;;410 OS_ENTER_CRITICAL();
;;;411 switch (wait_type) {
;;;412 case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
;;;413 flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
;;;414 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
;;;415 if (consume == TRUE) { /* See if we need to consume the flags */
;;;416 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
;;;417 }
;;;418 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
;;;419 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;420 *err = OS_NO_ERR;
;;;421 return (flags_cur);
;;;422 } else { /* Block task until events occur or timeout */
;;;423 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;424 OS_EXIT_CRITICAL();
;;;425 }
;;;426 break;
;;;427
;;;428 case OS_FLAG_WAIT_SET_ANY:
;;;429 flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
;;;430 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
;;;431 if (consume == TRUE) { /* See if we need to consume the flags */
;;;432 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
;;;433 }
;;;434 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
;;;435 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;436 *err = OS_NO_ERR;
;;;437 return (flags_cur);
;;;438 } else { /* Block task until events occur or timeout */
;;;439 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;440 OS_EXIT_CRITICAL();
;;;441 }
;;;442 break;
;;;443
;;;444 #if OS_FLAG_WAIT_CLR_EN > 0
;;;445 case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
;;;446 flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
;;;447 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
;;;448 if (consume == TRUE) { /* See if we need to consume the flags */
;;;449 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
;;;450 }
;;;451 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
;;;452 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;453 *err = OS_NO_ERR;
;;;454 return (flags_cur);
;;;455 } else { /* Block task until events occur or timeout */
;;;456 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;457 OS_EXIT_CRITICAL();
;;;458 }
;;;459 break;
;;;460
;;;461 case OS_FLAG_WAIT_CLR_ANY:
;;;462 flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
;;;463 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
;;;464 if (consume == TRUE) { /* See if we need to consume the flags */
;;;465 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
;;;466 }
;;;467 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
;;;468 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;469 *err = OS_NO_ERR;
;;;470 return (flags_cur);
;;;471 } else { /* Block task until events occur or timeout */
;;;472 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;473 OS_EXIT_CRITICAL();
;;;474 }
;;;475 break;
;;;476 #endif
;;;477
;;;478 default:
;;;479 OS_EXIT_CRITICAL();
;;;480 flags_cur = (OS_FLAGS)0;
;;;481 *err = OS_FLAG_ERR_WAIT_TYPE;
;;;482 return (flags_cur);
;;;483 }
;;;484 OS_Sched(); /* Find next HPT ready to run */
;;;485 OS_ENTER_CRITICAL();
;;;486 if (OSTCBCur->OSTCBStat & OS_STAT_FLAG) { /* Have we timed-out? */
;;;487 OS_FlagUnlink(&node);
;;;488 OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Yes, make task ready-to-run */
;;;489 OS_EXIT_CRITICAL();
;;;490 flags_cur = (OS_FLAGS)0;
;;;491 *err = OS_TIMEOUT; /* Indicate that we timed-out waiting */
;;;492 } else {
;;;493 if (consume == TRUE) { /* See if we need to consume the flags */
;;;494 switch (wait_type) {
;;;495 case OS_FLAG_WAIT_SET_ALL:
;;;496 case OS_FLAG_WAIT_SET_ANY: /* Clear ONLY the flags we got */
;;;497 pgrp->OSFlagFlags &= ~OSTCBCur->OSTCBFlagsRdy;
;;;498 break;
;;;499
;;;500 #if OS_FLAG_WAIT_CLR_EN > 0
;;;501 case OS_FLAG_WAIT_CLR_ALL:
;;;502 case OS_FLAG_WAIT_CLR_ANY: /* Set ONLY the flags we got */
;;;503 pgrp->OSFlagFlags |= OSTCBCur->OSTCBFlagsRdy;
;;;504 break;
;;;505 #endif
;;;506 }
;;;507 }
;;;508 flags_cur = pgrp->OSFlagFlags;
;;;509 OS_EXIT_CRITICAL();
;;;510 *err = OS_NO_ERR; /* Event(s) must have occurred */
;;;511 }
;;;512 return (flags_cur);
;;;513 }
000590 e8bd8ff0 POP {r4-r11,pc}
|L1.1428|
000594 e3540000 CMP r4,#0 ;394
000598 1a000003 BNE |L1.1452| ;394
00059c e3a00096 MOV r0,#0x96 ;395
0005a0 e5c80000 STRB r0,[r8,#0] ;395
0005a4 e3a00000 MOV r0,#0 ;396
0005a8 eafffff7 B |L1.1420| ;396
|L1.1452|
0005ac e5d40000 LDRB r0,[r4,#0] ;398
0005b0 e3500005 CMP r0,#5 ;398
0005b4 0a000003 BEQ |L1.1480| ;398
0005b8 e3a00001 MOV r0,#1 ;399
0005bc e5c80000 STRB r0,[r8,#0] ;399
0005c0 e3a00000 MOV r0,#0 ;400
0005c4 eafffff0 B |L1.1420| ;400
|L1.1480|
0005c8 e3160080 TST r6,#0x80 ;403
0005cc 0a000002 BEQ |L1.1500| ;403
0005d0 e3c66080 BIC r6,r6,#0x80 ;404
0005d4 e3a0b001 MOV r11,#1 ;405
0005d8 ea000000 B |L1.1504| ;405
|L1.1500|
0005dc e3a0b000 MOV r11,#0 ;407
|L1.1504|
0005e0 ef000002 SVC 0x2 ; formerly SWI ;410
0005e4 e3560000 CMP r6,#0 ;411
0005e8 0a000036 BEQ |L1.1736| ;411
0005ec e3560001 CMP r6,#1 ;411
0005f0 0a00004e BEQ |L1.1840| ;411
0005f4 e3560002 CMP r6,#2 ;411
0005f8 0a000002 BEQ |L1.1544| ;411
0005fc e3560003 CMP r6,#3 ;411
000600 1a000064 BNE |L1.1944| ;411
000604 ea000017 B |L1.1640| ;411
|L1.1544|
000608 e1a00000 MOV r0,r0 ;412
00060c e1d400b8 LDRH r0,[r4,#8] ;413
000610 e000a005 AND r10,r0,r5 ;413
000614 e15a0005 CMP r10,r5 ;414
000618 1a00000a BNE |L1.1608| ;414
00061c e35b0001 CMP r11,#1 ;415
000620 1a000002 BNE |L1.1584| ;415
000624 e1d400b8 LDRH r0,[r4,#8] ;416
000628 e1c0000a BIC r0,r0,r10 ;416
00062c e1c400b8 STRH r0,[r4,#8] ;416
|L1.1584|
000630 e1d490b8 LDRH r9,[r4,#8] ;418
000634 ef000003 SVC 0x3 ; formerly SWI ;419
000638 e3a00000 MOV r0,#0 ;420
00063c e5c80000 STRB r0,[r8,#0] ;420
000640 e1a00009 MOV r0,r9 ;421
000644 eaffffd0 B |L1.1420| ;421
|L1.1608|
000648 e1a03006 MOV r3,r6 ;423
00064c e1a02005 MOV r2,r5 ;423
000650 e58d7000 STR r7,[sp,#0] ;423
000654 e28d1008 ADD r1,sp,#8 ;423
000658 e1a00004 MOV r0,r4 ;423
00065c ebfffffe BL OS_FlagBlock ;423
000660 ef000003 SVC 0x3 ; formerly SWI ;424
000664 ea000052 B |L1.1972| ;426
|L1.1640|
000668 e1a00000 MOV r0,r0 ;428
00066c e1d400b8 LDRH r0,[r4,#8] ;429
000670 e000a005 AND r10,r0,r5 ;429
000674 e35a0000 CMP r10,#0 ;430
000678 0a00000a BEQ |L1.1704| ;430
00067c e35b0001 CMP r11,#1 ;431
000680 1a000002 BNE |L1.1680| ;431
000684 e1d400b8 LDRH r0,[r4,#8] ;432
000688 e1c0000a BIC r0,r0,r10 ;432
00068c e1c400b8 STRH r0,[r4,#8] ;432
|L1.1680|
000690 e1d490b8 LDRH r9,[r4,#8] ;434
000694 ef000003 SVC 0x3 ; formerly SWI ;435
000698 e3a00000 MOV r0,#0 ;436
00069c e5c80000 STRB r0,[r8,#0] ;436
0006a0 e1a00009 MOV r0,r9 ;437
0006a4 eaffffb8 B |L1.1420| ;437
|L1.1704|
0006a8 e1a03006 MOV r3,r6 ;439
0006ac e1a02005 MOV r2,r5 ;439
0006b0 e58d7000 STR r7,[sp,#0] ;439
0006b4 e28d1008 ADD r1,sp,#8 ;439
0006b8 e1a00004 MOV r0,r4 ;439
0006bc ebfffffe BL OS_FlagBlock ;439
0006c0 ef000003 SVC 0x3 ; formerly SWI ;440
0006c4 ea00003a B |L1.1972| ;442
|L1.1736|
0006c8 e1a00000 MOV r0,r0 ;445
0006cc e1d400b8 LDRH r0,[r4,#8] ;446
0006d0 e1c50000 BIC r0,r5,r0 ;446
0006d4 e1a0a800 LSL r10,r0,#16 ;446
0006d8 e1a0a82a LSR r10,r10,#16 ;446
0006dc e15a0005 CMP r10,r5 ;447
0006e0 1a00000a BNE |L1.1808| ;447
0006e4 e35b0001 CMP r11,#1 ;448
0006e8 1a000002 BNE |L1.1784| ;448
0006ec e1d400b8 LDRH r0,[r4,#8] ;449
0006f0 e180000a ORR r0,r0,r10 ;449
0006f4 e1c400b8 STRH r0,[r4,#8] ;449
|L1.1784|
0006f8 e1d490b8 LDRH r9,[r4,#8] ;451
0006fc ef000003 SVC 0x3 ; formerly SWI ;452
000700 e3a00000 MOV r0,#0 ;453
000704 e5c80000 STRB r0,[r8,#0] ;453
000708 e1a00009 MOV r0,r9 ;454
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -