📄 os_flag.lst
字号:
\ 0318 8BDD0400 BIS R13,4(R11)
\ 031C ?0148:
465 }
466 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
\ 031C 1C4B0400 MOV 4(R11),R12
467 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
\ 0320 32D2 EINT
468 *err = OS_NO_ERR;
\ 0322 C8430000 MOV.B #0,0(R8)
469 return (flags_cur);
470 } else { /* Block task until events occur or timeout */
\ 0326 463C JMP (?0152)
\ 0328 ?0146:
471 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
\ 0328 0C12 PUSH R12
\ 032A 4A12 PUSH.B R10
\ 032C 0E12 PUSH R14
\ 032E 0E41 MOV SP,R14
\ 0330 3E500600 ADD #6,R14
\ 0334 0C4B MOV R11,R12
\ 0336 B012F204 CALL #OS_FlagBlock
\ 033A 31500600 ADD #6,SP
472 OS_EXIT_CRITICAL();
\ 033E 32D2 EINT
473 }
474 break;
\ 0340 063C JMP (?0128)
\ 0342 ?0149:
475 #endif
476
477 default:
478 OS_EXIT_CRITICAL();
\ 0342 32D2 EINT
479 flags_cur = (OS_FLAGS)0;
\ 0344 0C43 MOV #0,R12
480 *err = OS_FLAG_ERR_WAIT_TYPE;
\ 0346 F8409700 MOV.B #151,0(R8)
\ 034A 0000
481 return (flags_cur);
482 }
\ 034C 333C JMP (?0152)
\ 034E ?0128:
483 OS_Sched(); /* Find next HPT ready to run */
\ 034E B0120000 CALL #OS_Sched
484 OS_ENTER_CRITICAL();
\ 0352 32C2 DINT
485 if (OSTCBCur->OSTCBStat & OS_STAT_FLAG) { /* Have we timed-out? */
\ 0354 1C420000 MOV &OSTCBCur,R12
\ 0358 FCB02000 BIT.B #32,28(R12)
\ 035C 1C00
\ 035E 0D24 JEQ (?0151)
486 OS_FlagUnlink(&node);
\ 0360 0C41 MOV SP,R12
\ 0362 B012D205 CALL #OS_FlagUnlink
487 OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Yes, make task ready-to-run */
\ 0366 1C420000 MOV &OSTCBCur,R12
\ 036A CC431C00 MOV.B #0,28(R12)
488 OS_EXIT_CRITICAL();
\ 036E 32D2 EINT
489 flags_cur = (OS_FLAGS)0;
\ 0370 0C43 MOV #0,R12
490 *err = OS_TIMEOUT; /* Indicate that we timed-out waiting */
\ 0372 F8400A00 MOV.B #10,0(R8)
\ 0376 0000
491 } else {
\ 0378 1D3C JMP (?0152)
\ 037A ?0151:
492 if (consume == TRUE) { /* See if we need to consume the flags */
\ 037A 5993 CMP.B #1,R9
\ 037C 1620 JNE (?0155)
493 switch (wait_type) {
\ 037E 2A92 CMP #4,R10
\ 0380 142C JC (?0155)
\ 0382 0A5A ADD R10,R10
\ 0384 104A8803 BR ?0219(R10)
\ 0388 ?0219:
\ 0388 A003 DW ?0157
\ 038A A003 DW ?0157
\ 038C 9003 DW ?0156
\ 038E 9003 DW ?0156
\ 0390 ?0156:
494 case OS_FLAG_WAIT_SET_ALL:
495 case OS_FLAG_WAIT_SET_ANY: /* Clear ONLY the flags we got */
496 pgrp->OSFlagFlags &= ~OSTCBCur->OSTCBFlagsRdy;
\ 0390 1C420000 MOV &OSTCBCur,R12
\ 0394 1C4C1800 MOV 24(R12),R12
\ 0398 3CE3 XOR #-1,R12
\ 039A 8BFC0400 AND R12,4(R11)
497 break;
\ 039E 053C JMP (?0155)
\ 03A0 ?0157:
498
499 #if OS_FLAG_WAIT_CLR_EN > 0
500 case OS_FLAG_WAIT_CLR_ALL:
501 case OS_FLAG_WAIT_CLR_ANY: /* Set ONLY the flags we got */
502 pgrp->OSFlagFlags |= OSTCBCur->OSTCBFlagsRdy;
\ 03A0 1C420000 MOV &OSTCBCur,R12
\ 03A4 9BDC1800 BIS 24(R12),4(R11)
\ 03A8 0400
503 break;
\ 03AA ?0155:
504 #endif
505 }
506 }
507 flags_cur = pgrp->OSFlagFlags;
\ 03AA 1C4B0400 MOV 4(R11),R12
508 OS_EXIT_CRITICAL();
\ 03AE 32D2 EINT
509 *err = OS_NO_ERR; /* Event(s) must have occurred */
\ 03B0 C8430000 MOV.B #0,0(R8)
\ 03B4 ?0152:
510 }
511 return (flags_cur);
512 }
\ 03B4 31500C00 ADD #12,SP
\ 03B8 3941 POP R9
\ 03BA 3841 POP R8
\ 03BC 3B41 POP R11
\ 03BE 3A41 POP R10
\ 03C0 3041 RET
\ 03C2 OSFlagPost:
513 /*$PAGE*/
514 /*
515 *********************************************************************************************************
516 * POST EVENT FLAG BIT(S)
517 *
518 * Description: This function is called to set or clear some bits in an event flag group. The bits to
519 * set or clear are specified by a 'bit mask'.
520 *
521 * Arguments : pgrp is a pointer to the desired event flag group.
522 *
523 * flags If 'opt' (see below) is OS_FLAG_SET, each bit that is set in 'flags' will
524 * set the corresponding bit in the event flag group. e.g. to set bits 0, 4
525 * and 5 you would set 'flags' to:
526 *
527 * 0x31 (note, bit 0 is least significant bit)
528 *
529 * If 'opt' (see below) is OS_FLAG_CLR, each bit that is set in 'flags' will
530 * CLEAR the corresponding bit in the event flag group. e.g. to clear bits 0,
531 * 4 and 5 you would specify 'flags' as:
532 *
533 * 0x31 (note, bit 0 is least significant bit)
534 *
535 * opt indicates whether the flags will be:
536 * set (OS_FLAG_SET) or
537 * cleared (OS_FLAG_CLR)
538 *
539 * err is a pointer to an error code and can be:
540 * OS_NO_ERR The call was successfull
541 * OS_FLAG_INVALID_PGRP You passed a NULL pointer
542 * OS_ERR_EVENT_TYPE You are not pointing to an event flag group
543 * OS_FLAG_INVALID_OPT You specified an invalid option
544 *
545 * Returns : the new value of the event flags bits that are still set.
546 *
547 * Called From: Task or ISR
548 *
549 * WARNING(s) : 1) The execution time of this function depends on the number of tasks waiting on the event
550 * flag group.
551 * 2) The amount of time interrupts are DISABLED depends on the number of tasks waiting on
552 * the event flag group.
553 *********************************************************************************************************
554 */
555 OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *err)
556 {
\ 03C2 0A12 PUSH R10
\ 03C4 0B12 PUSH R11
\ 03C6 0812 PUSH R8
\ 03C8 0912 PUSH R9
\ 03CA 0A4C MOV R12,R10
\ 03CC 5C410A00 MOV.B 10(SP),R12
\ 03D0 1B410C00 MOV 12(SP),R11
557 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
558 OS_CPU_SR cpu_sr;
559 #endif
560 OS_FLAG_NODE *pnode;
561 BOOLEAN sched;
562 OS_FLAGS flags_cur;
563 OS_FLAGS flags_rdy;
564
565
566 #if OS_ARG_CHK_EN > 0
567 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
\ 03D4 0A93 CMP #0,R10
\ 03D6 0520 JNE (?0160)
568 *err = OS_FLAG_INVALID_PGRP;
\ 03D8 FB409600 MOV.B #150,0(R11)
\ 03DC 0000
569 return ((OS_FLAGS)0);
\ 03DE 0C43 MOV #0,R12
570 }
\ 03E0 6D3C JMP (?0193)
\ 03E2 ?0160:
571 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Make sure we are pointing to an event flag grp */
\ 03E2 7D400500 MOV.B #5,R13
\ 03E6 6D9A CMP.B @R10,R13
\ 03E8 0424 JEQ (?0162)
572 *err = OS_ERR_EVENT_TYPE;
\ 03EA DB430000 MOV.B #1,0(R11)
573 return ((OS_FLAGS)0);
\ 03EE 0C43 MOV #0,R12
574 }
\ 03F0 653C JMP (?0193)
\ 03F2 ?0162:
575 #endif
576 /*$PAGE*/
577 OS_ENTER_CRITICAL();
\ 03F2 32C2 DINT
578 switch (opt) {
\ 03F4 4C83 SUB.B #0,R12
\ 03F6 0324 JEQ (?0164)
\ 03F8 5C83 SUB.B #1,R12
\ 03FA 0524 JEQ (?0165)
\ 03FC 073C JMP (?0166)
\ 03FE ?0164:
579 case OS_FLAG_CLR:
580 pgrp->OSFlagFlags &= ~flags;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -