📄 os_flag.lis
字号:
.module OS_FLAG.C
.area text(rom, con, rel)
0000 .dbfile E:\study\ucos_ii\ucos2_iccavr\iccavr\ucos2_without_cpu\OS_FLAG.C
0000 .dbfunc e OSFlagAccept _OSFlagAccept fc
0000 .dbstruct 0 4 .1
0000 .dbfield 0 OSFlagType c
0000 .dbfield 1 OSFlagWaitList pV
0000 .dbfield 3 OSFlagFlags c
0000 .dbend
0000 ; flags_rdy -> R10
0000 ; consume -> R12
0000 ; flags_cur -> R20
0000 ; err -> R22,R23
0000 ; wait_type -> R20
0000 ; flags -> R18
0000 ; pgrp -> R16,R17
.even
0000 _OSFlagAccept::
0000 0E940000 xcall push_gset4
0004 4885 ldd R20,y+8
0006 6A85 ldd R22,y+10
0008 7B85 ldd R23,y+11
000A .dbline -1
000A .dbline 79
000A ; /*
000A ; *********************************************************************************************************
000A ; * uC/OS-II
000A ; * The Real-Time Kernel
000A ; * EVENT FLAG MANAGEMENT
000A ; *
000A ; * (c) Copyright 2001-2002, Jean J. Labrosse, Weston, FL
000A ; * All Rights Reserved
000A ; *
000A ; * File : OS_FLAG.C
000A ; * By : Jean J. Labrosse
000A ; *********************************************************************************************************
000A ; */
000A ;
000A ; #ifndef OS_MASTER_FILE
000A ; #include "..\ucos2_application\INCLUDES.H"
000A ; #endif
000A ;
000A ; #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
000A ; /*
000A ; *********************************************************************************************************
000A ; * LOCAL PROTOTYPES
000A ; *********************************************************************************************************
000A ; */
000A ;
000A ; static void OS_FlagBlock(OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout);
000A ; static BOOLEAN OS_FlagTaskRdy(OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy);
000A ;
000A ; /*$PAGE*/
000A ; /*
000A ; *********************************************************************************************************
000A ; * CHECK THE STATUS OF FLAGS IN AN EVENT FLAG GROUP
000A ; *
000A ; * Description: This function is called to check the status of a combination of bits to be set or cleared
000A ; * in an event flag group. Your application can check for ANY bit to be set/cleared or ALL
000A ; * bits to be set/cleared.
000A ; *
000A ; * This call does not block if the desired flags are not present.
000A ; *
000A ; * Arguments : pgrp is a pointer to the desired event flag group.
000A ; *
000A ; * flags Is a bit pattern indicating which bit(s) (i.e. flags) you wish to check.
000A ; * The bits you want are specified by setting the corresponding bits in
000A ; * 'flags'. e.g. if your application wants to wait for bits 0 and 1 then
000A ; * 'flags' would contain 0x03.
000A ; *
000A ; * wait_type specifies whether you want ALL bits to be set/cleared or ANY of the bits
000A ; * to be set/cleared.
000A ; * You can specify the following argument:
000A ; *
000A ; * OS_FLAG_WAIT_CLR_ALL You will check ALL bits in 'flags' to be clear (0)
000A ; * OS_FLAG_WAIT_CLR_ANY You will check ANY bit in 'flags' to be clear (0)
000A ; * OS_FLAG_WAIT_SET_ALL You will check ALL bits in 'flags' to be set (1)
000A ; * OS_FLAG_WAIT_SET_ANY You will check ANY bit in 'flags' to be set (1)
000A ; *
000A ; * NOTE: Add OS_FLAG_CONSUME if you want the event flag to be 'consumed' by
000A ; * the call. Example, to wait for any flag in a group AND then clear
000A ; * the flags that are present, set 'wait_type' to:
000A ; *
000A ; * OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME
000A ; *
000A ; * err is a pointer to an error code and can be:
000A ; * OS_NO_ERR No error
000A ; * OS_ERR_EVENT_TYPE You are not pointing to an event flag group
000A ; * OS_FLAG_ERR_WAIT_TYPE You didn't specify a proper 'wait_type' argument.
000A ; * OS_FLAG_INVALID_PGRP You passed a NULL pointer instead of the event flag
000A ; * group handle.
000A ; * OS_FLAG_ERR_NOT_RDY The desired flags you are waiting for are not
000A ; * available.
000A ; *
000A ; * Returns : The state of the flags in the event flag group.
000A ; *
000A ; * Called from: Task or ISR
000A ; *********************************************************************************************************
000A ; */
000A ;
000A ; #if OS_FLAG_ACCEPT_EN > 0
000A ; OS_FLAGS OSFlagAccept (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *err)
000A ; {
000A .dbline 89
000A ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
000A ; OS_CPU_SR cpu_sr;
000A ; #endif
000A ; OS_FLAGS flags_cur;
000A ; OS_FLAGS flags_rdy;
000A ; BOOLEAN consume;
000A ;
000A ;
000A ; #if OS_ARG_CHK_EN > 0
000A ; if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
000A 0030 cpi R16,0
000C 0107 cpc R16,R17
000E 29F4 brne L4
0010 X0:
0010 .dbline 89
0010 .dbline 90
0010 ; *err = OS_FLAG_INVALID_PGRP;
0010 86E9 ldi R24,150
0012 FB01 movw R30,R22
0014 8083 std z+0,R24
0016 .dbline 91
0016 ; return ((OS_FLAGS)0);
0016 0027 clr R16
0018 9CC0 xjmp L3
001A L4:
001A .dbline 93
001A ; }
001A ; if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
001A F801 movw R30,R16
001C 8081 ldd R24,z+0
001E 8530 cpi R24,5
0020 29F0 breq L6
0022 .dbline 93
0022 .dbline 94
0022 ; *err = OS_ERR_EVENT_TYPE;
0022 81E0 ldi R24,1
0024 FB01 movw R30,R22
0026 8083 std z+0,R24
0028 .dbline 95
0028 ; return ((OS_FLAGS)0);
0028 0027 clr R16
002A 93C0 xjmp L3
002C L6:
002C .dbline 98
002C ; }
002C ; #endif
002C ; if (wait_type & OS_FLAG_CONSUME) { /* See if we need to consume the flags */
002C 47FF sbrs R20,7
002E 04C0 rjmp L8
0030 .dbline 98
0030 .dbline 99
0030 ; wait_type &= ~OS_FLAG_CONSUME;
0030 4F77 andi R20,127
0032 .dbline 100
0032 ; consume = TRUE;
0032 CC24 clr R12
0034 C394 inc R12
0036 .dbline 101
0036 01C0 xjmp L9
0038 L8:
0038 .dbline 101
0038 ; } else {
0038 .dbline 102
0038 ; consume = FALSE;
0038 CC24 clr R12
003A .dbline 103
003A ; }
003A L9:
003A .dbline 105
003A ; /*$PAGE*/
003A ; *err = OS_NO_ERR; /* Assume NO error until proven otherwise. */
003A 2224 clr R2
003C FB01 movw R30,R22
003E 2082 std z+0,R2
0040 .dbline 106
0040 ; OS_ENTER_CRITICAL();
0040 0A93 st -y,r16
0042 0FB7 in r16,0x3F
0044 F894 cli
0046 0F93 push r16
0048 0991 ld r16,y+
004A .dbline 106
004A .dbline 107
004A 5527 clr R21
004C 4030 cpi R20,0
004E 4507 cpc R20,R21
0050 09F4 brne X3
0052 43C0 xjmp L23
0054 X3:
0054 X1:
0054 4130 cpi R20,1
0056 E0E0 ldi R30,0
0058 5E07 cpc R21,R30
005A 09F4 brne X4
005C 58C0 xjmp L28
005E X4:
005E 4230 cpi R20,2
0060 E0E0 ldi R30,0
0062 5E07 cpc R21,R30
0064 29F0 breq L13
0066 4330 cpi R20,3
0068 E0E0 ldi R30,0
006A 5E07 cpc R21,R30
006C E1F0 breq L18
006E 68C0 xjmp L10
0070 X2:
0070 .dbline 107
0070 ; switch (wait_type) {
0070 L13:
0070 .dbline 109
0070 ; case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
0070 ; flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
0070 F801 movw R30,R16
0072 A380 ldd R10,z+3
0074 A222 and R10,R18
0076 .dbline 110
0076 ; if (flags_rdy == flags) { /* Must match ALL the bits that we want */
0076 A216 cp R10,R18
0078 61F4 brne L14
007A .dbline 110
007A .dbline 111
007A ; if (consume == TRUE) { /* See if we need to consume the flags */
007A 8C2D mov R24,R12
007C 8130 cpi R24,1
007E 61F4 brne L15
0080 .dbline 111
0080 .dbline 112
0080 ; pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
0080 C801 movw R24,R16
0082 0396 adiw R24,3
0084 4A2C mov R4,R10
0086 4094 com R4
0088 FC01 movw R30,R24
008A 5080 ldd R5,z+0
008C 5420 and R5,R4
008E 5082 std z+0,R5
0090 .dbline 113
0090 ; }
0090 .dbline 114
0090 03C0 xjmp L15
0092 L14:
0092 .dbline 114
0092 ; } else {
0092 .dbline 115
0092 ; *err = OS_FLAG_ERR_NOT_RDY;
0092 88E9 ldi R24,152
0094 FB01 movw R30,R22
0096 8083 std z+0,R24
0098 .dbline 116
0098 ; }
0098 L15:
0098 .dbline 117
0098 ; flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
0098 F801 movw R30,R16
009A 4381 ldd R20,z+3
009C .dbline 118
009C ; OS_EXIT_CRITICAL();
009C 0A93 st -y,r16
009E 0F91 pop r16
00A0 0FBF out 0x3F,r16
00A2 0991 ld r16,y+
00A4 .dbline 118
00A4 .dbline 119
00A4 ; break;
00A4 55C0 xjmp L11
00A6 L18:
00A6 .dbline 122
00A6 ;
00A6 ; case OS_FLAG_WAIT_SET_ANY:
00A6 ; flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
00A6 F801 movw R30,R16
00A8 A380 ldd R10,z+3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -