📄 os_flag.lis
字号:
00AA A222 and R10,R18
00AC .dbline 123
00AC ; if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
00AC 61F0 breq L19
00AE .dbline 123
00AE .dbline 124
00AE ; if (consume == TRUE) { /* See if we need to consume the flags */
00AE 8C2D mov R24,R12
00B0 8130 cpi R24,1
00B2 61F4 brne L20
00B4 .dbline 124
00B4 .dbline 125
00B4 ; pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
00B4 C801 movw R24,R16
00B6 0396 adiw R24,3
00B8 4A2C mov R4,R10
00BA 4094 com R4
00BC FC01 movw R30,R24
00BE 5080 ldd R5,z+0
00C0 5420 and R5,R4
00C2 5082 std z+0,R5
00C4 .dbline 126
00C4 ; }
00C4 .dbline 127
00C4 03C0 xjmp L20
00C6 L19:
00C6 .dbline 127
00C6 ; } else {
00C6 .dbline 128
00C6 ; *err = OS_FLAG_ERR_NOT_RDY;
00C6 88E9 ldi R24,152
00C8 FB01 movw R30,R22
00CA 8083 std z+0,R24
00CC .dbline 129
00CC ; }
00CC L20:
00CC .dbline 130
00CC ; flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
00CC F801 movw R30,R16
00CE 4381 ldd R20,z+3
00D0 .dbline 131
00D0 ; OS_EXIT_CRITICAL();
00D0 0A93 st -y,r16
00D2 0F91 pop r16
00D4 0FBF out 0x3F,r16
00D6 0991 ld r16,y+
00D8 .dbline 131
00D8 .dbline 132
00D8 ; break;
00D8 3BC0 xjmp L11
00DA L23:
00DA .dbline 136
00DA ;
00DA ; #if OS_FLAG_WAIT_CLR_EN > 0
00DA ; case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
00DA ; flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
00DA F801 movw R30,R16
00DC A380 ldd R10,z+3
00DE A094 com R10
00E0 A222 and R10,R18
00E2 .dbline 137
00E2 ; if (flags_rdy == flags) { /* Must match ALL the bits that we want */
00E2 A216 cp R10,R18
00E4 51F4 brne L24
00E6 .dbline 137
00E6 .dbline 138
00E6 ; if (consume == TRUE) { /* See if we need to consume the flags */
00E6 8C2D mov R24,R12
00E8 8130 cpi R24,1
00EA 51F4 brne L25
00EC .dbline 138
00EC .dbline 139
00EC ; pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
00EC C801 movw R24,R16
00EE 0396 adiw R24,3
00F0 FC01 movw R30,R24
00F2 4080 ldd R4,z+0
00F4 4A28 or R4,R10
00F6 4082 std z+0,R4
00F8 .dbline 140
00F8 ; }
00F8 .dbline 141
00F8 03C0 xjmp L25
00FA L24:
00FA .dbline 141
00FA ; } else {
00FA .dbline 142
00FA ; *err = OS_FLAG_ERR_NOT_RDY;
00FA 88E9 ldi R24,152
00FC FB01 movw R30,R22
00FE 8083 std z+0,R24
0100 .dbline 143
0100 ; }
0100 L25:
0100 .dbline 144
0100 ; flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
0100 F801 movw R30,R16
0102 4381 ldd R20,z+3
0104 .dbline 145
0104 ; OS_EXIT_CRITICAL();
0104 0A93 st -y,r16
0106 0F91 pop r16
0108 0FBF out 0x3F,r16
010A 0991 ld r16,y+
010C .dbline 145
010C .dbline 146
010C ; break;
010C 21C0 xjmp L11
010E L28:
010E .dbline 149
010E ;
010E ; case OS_FLAG_WAIT_CLR_ANY:
010E ; flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
010E F801 movw R30,R16
0110 A380 ldd R10,z+3
0112 A094 com R10
0114 A222 and R10,R18
0116 .dbline 150
0116 ; if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
0116 51F0 breq L29
0118 .dbline 150
0118 .dbline 151
0118 ; if (consume == TRUE) { /* See if we need to consume the flags */
0118 8C2D mov R24,R12
011A 8130 cpi R24,1
011C 51F4 brne L30
011E .dbline 151
011E .dbline 152
011E ; pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
011E C801 movw R24,R16
0120 0396 adiw R24,3
0122 FC01 movw R30,R24
0124 4080 ldd R4,z+0
0126 4A28 or R4,R10
0128 4082 std z+0,R4
012A .dbline 153
012A ; }
012A .dbline 154
012A 03C0 xjmp L30
012C L29:
012C .dbline 154
012C ; } else {
012C .dbline 155
012C ; *err = OS_FLAG_ERR_NOT_RDY;
012C 88E9 ldi R24,152
012E FB01 movw R30,R22
0130 8083 std z+0,R24
0132 .dbline 156
0132 ; }
0132 L30:
0132 .dbline 157
0132 ; flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
0132 F801 movw R30,R16
0134 4381 ldd R20,z+3
0136 .dbline 158
0136 ; OS_EXIT_CRITICAL();
0136 0A93 st -y,r16
0138 0F91 pop r16
013A 0FBF out 0x3F,r16
013C 0991 ld r16,y+
013E .dbline 158
013E .dbline 159
013E ; break;
013E 08C0 xjmp L11
0140 L10:
0140 .dbline 163
0140 ; #endif
0140 ;
0140 ; default:
0140 ; OS_EXIT_CRITICAL();
0140 0A93 st -y,r16
0142 0F91 pop r16
0144 0FBF out 0x3F,r16
0146 0991 ld r16,y+
0148 .dbline 163
0148 .dbline 164
0148 ; flags_cur = (OS_FLAGS)0;
0148 4427 clr R20
014A .dbline 165
014A ; *err = OS_FLAG_ERR_WAIT_TYPE;
014A 87E9 ldi R24,151
014C FB01 movw R30,R22
014E 8083 std z+0,R24
0150 .dbline 166
0150 ; break;
0150 L11:
0150 .dbline 168
0150 ; }
0150 ; return (flags_cur);
0150 042F mov R16,R20
0152 .dbline -2
0152 L3:
0152 0E940000 xcall pop_gset4
0156 .dbline 0 ; func end
0156 0895 ret
0158 .dbsym r flags_rdy 10 c
0158 .dbsym r consume 12 c
0158 .dbsym r flags_cur 20 c
0158 .dbsym r err 22 pc
0158 .dbsym r wait_type 20 c
0158 .dbsym r flags 18 c
0158 .dbsym r pgrp 16 pS[.1]
0158 .dbend
0158 .dbfunc e OSFlagCreate _OSFlagCreate fpS[.1]
0158 ; pgrp -> R20,R21
0158 ; err -> R18,R19
0158 ; flags -> R16
.even
0158 _OSFlagCreate::
0158 0E940000 xcall push_gset1
015C .dbline -1
015C .dbline 194
015C ; }
015C ; #endif
015C ;
015C ; /*$PAGE*/
015C ; /*
015C ; *********************************************************************************************************
015C ; * CREATE AN EVENT FLAG
015C ; *
015C ; * Description: This function is called to create an event flag group.
015C ; *
015C ; * Arguments : flags Contains the initial value to store in the event flag group.
015C ; *
015C ; * err is a pointer to an error code which will be returned to your application:
015C ; * OS_NO_ERR if the call was successful.
015C ; * OS_ERR_CREATE_ISR if you attempted to create an Event Flag from an
015C ; * ISR.
015C ; * OS_FLAG_GRP_DEPLETED if there are no more event flag groups
015C ; *
015C ; * Returns : A pointer to an event flag group or a NULL pointer if no more groups are available.
015C ; *
015C ; * Called from: Task ONLY
015C ; *********************************************************************************************************
015C ; */
015C ;
015C ; OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags, INT8U *err)
015C ; {
015C .dbline 201
015C ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
015C ; OS_CPU_SR cpu_sr;
015C ; #endif
015C ; OS_FLAG_GRP *pgrp;
015C ;
015C ;
015C ; if (OSIntNesting > 0) { /* See if called from ISR ... */
015C 2224 clr R2
015E 30900000 lds R3,_OSIntNesting
0162 2314 cp R2,R3
0164 30F4 brsh L34
0166 .dbline 201
0166 .dbline 202
0166 ; *err = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR */
0166 8DE8 ldi R24,141
0168 F901 movw R30,R18
016A 8083 std z+0,R24
016C .dbline 203
016C ; return ((OS_FLAG_GRP *)0);
016C 0027 clr R16
016E 1127 clr R17
0170 2EC0 xjmp L33
0172 L34:
0172 .dbline 205
0172 ; }
0172 ; OS_ENTER_CRITICAL();
0172 0A93 st -y,r16
0174 0FB7 in r16,0x3F
0176 F894 cli
0178 0F93 push r16
017A 0991 ld r16,y+
017C .dbline 205
017C .dbline 206
017C ; pgrp = OSFlagFreeList; /* Get next free event flag */
017C 40910000 lds R20,_OSFlagFreeList
0180 50910100 lds R21,_OSFlagFreeList+1
0184 .dbline 207
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -