📄 os_flag.lst
字号:
\ 00000060 000050E3 CMP R0,#+0
\ 00000064 0200000A BEQ ??OSFlagAccept_5
118 wait_type &= ~OS_FLAG_CONSUME;
\ 00000068 7F7017E2 ANDS R7,R7,#0x7F
119 consume = OS_TRUE;
\ 0000006C 0180A0E3 MOV R8,#+1
\ 00000070 000000EA B ??OSFlagAccept_6
120 } else {
121 consume = OS_FALSE;
\ ??OSFlagAccept_5:
\ 00000074 0080A0E3 MOV R8,#+0
122 }
123 /*$PAGE*/
124 *err = OS_ERR_NONE; /* Assume NO error until proven otherwise. */
\ ??OSFlagAccept_6:
\ 00000078 0000A0E3 MOV R0,#+0
\ 0000007C 0000C4E5 STRB R0,[R4, #+0]
125 OS_ENTER_CRITICAL();
\ 00000080 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
126 switch (wait_type) {
\ 00000084 030057E3 CMP R7,#+3
\ 00000088 4300008A BHI ??OSFlagAccept_7
\ 0000008C 011F8FE2 ADR R1,??OSFlagAccept_0
\ 00000090 0710D1E7 LDRB R1,[R1, R7]
\ 00000094 01F18FE0 ADD PC,PC,R1, LSL #+2
\ ??OSFlagAccept_0:
\ 00000098 20300010 DC8 +32,+48,+0,+16
127 case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
128 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
\ ??OSFlagAccept_8:
\ 0000009C B810D5E1 LDRH R1,[R5, #+8]
\ 000000A0 017016E0 ANDS R7,R6,R1
129 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
\ 000000A4 0778A0E1 MOV R7,R7, LSL #+16
\ 000000A8 2778B0E1 MOVS R7,R7, LSR #+16
\ 000000AC 060057E1 CMP R7,R6
\ 000000B0 0500001A BNE ??OSFlagAccept_9
130 if (consume == OS_TRUE) { /* See if we need to consume the flags */
\ 000000B4 010058E3 CMP R8,#+1
\ 000000B8 0500001A BNE ??OSFlagAccept_10
131 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
\ 000000BC B810D5E1 LDRH R1,[R5, #+8]
\ 000000C0 0710D1E1 BICS R1,R1,R7
\ 000000C4 B810C5E1 STRH R1,[R5, #+8]
\ 000000C8 010000EA B ??OSFlagAccept_10
132 }
133 } else {
134 *err = OS_ERR_FLAG_NOT_RDY;
\ ??OSFlagAccept_9:
\ 000000CC 7010A0E3 MOV R1,#+112
\ 000000D0 0010C4E5 STRB R1,[R4, #+0]
135 }
136 OS_EXIT_CRITICAL();
\ ??OSFlagAccept_10:
\ 000000D4 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
\ 000000D8 330000EA B ??OSFlagAccept_11
137 break;
138
139 case OS_FLAG_WAIT_SET_ANY:
140 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
\ ??OSFlagAccept_12:
\ 000000DC B810D5E1 LDRH R1,[R5, #+8]
\ 000000E0 017016E0 ANDS R7,R6,R1
141 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
\ 000000E4 0778A0E1 MOV R7,R7, LSL #+16
\ 000000E8 2778B0E1 MOVS R7,R7, LSR #+16
\ 000000EC 000057E3 CMP R7,#+0
\ 000000F0 0500000A BEQ ??OSFlagAccept_13
142 if (consume == OS_TRUE) { /* See if we need to consume the flags */
\ 000000F4 010058E3 CMP R8,#+1
\ 000000F8 0500001A BNE ??OSFlagAccept_14
143 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
\ 000000FC B810D5E1 LDRH R1,[R5, #+8]
\ 00000100 0710D1E1 BICS R1,R1,R7
\ 00000104 B810C5E1 STRH R1,[R5, #+8]
\ 00000108 010000EA B ??OSFlagAccept_14
144 }
145 } else {
146 *err = OS_ERR_FLAG_NOT_RDY;
\ ??OSFlagAccept_13:
\ 0000010C 7010A0E3 MOV R1,#+112
\ 00000110 0010C4E5 STRB R1,[R4, #+0]
147 }
148 OS_EXIT_CRITICAL();
\ ??OSFlagAccept_14:
\ 00000114 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
\ 00000118 230000EA B ??OSFlagAccept_11
149 break;
150
151 #if OS_FLAG_WAIT_CLR_EN > 0
152 case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
153 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
\ ??OSFlagAccept_15:
\ 0000011C B810D5E1 LDRH R1,[R5, #+8]
\ 00000120 0170D6E1 BICS R7,R6,R1
154 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
\ 00000124 0778A0E1 MOV R7,R7, LSL #+16
\ 00000128 2778B0E1 MOVS R7,R7, LSR #+16
\ 0000012C 060057E1 CMP R7,R6
\ 00000130 0500001A BNE ??OSFlagAccept_16
155 if (consume == OS_TRUE) { /* See if we need to consume the flags */
\ 00000134 010058E3 CMP R8,#+1
\ 00000138 0500001A BNE ??OSFlagAccept_17
156 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
\ 0000013C B810D5E1 LDRH R1,[R5, #+8]
\ 00000140 011097E1 ORRS R1,R7,R1
\ 00000144 B810C5E1 STRH R1,[R5, #+8]
\ 00000148 010000EA B ??OSFlagAccept_17
157 }
158 } else {
159 *err = OS_ERR_FLAG_NOT_RDY;
\ ??OSFlagAccept_16:
\ 0000014C 7010A0E3 MOV R1,#+112
\ 00000150 0010C4E5 STRB R1,[R4, #+0]
160 }
161 OS_EXIT_CRITICAL();
\ ??OSFlagAccept_17:
\ 00000154 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
\ 00000158 130000EA B ??OSFlagAccept_11
162 break;
163
164 case OS_FLAG_WAIT_CLR_ANY:
165 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
\ ??OSFlagAccept_18:
\ 0000015C B810D5E1 LDRH R1,[R5, #+8]
\ 00000160 0170D6E1 BICS R7,R6,R1
166 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
\ 00000164 0778A0E1 MOV R7,R7, LSL #+16
\ 00000168 2778B0E1 MOVS R7,R7, LSR #+16
\ 0000016C 000057E3 CMP R7,#+0
\ 00000170 0500000A BEQ ??OSFlagAccept_19
167 if (consume == OS_TRUE) { /* See if we need to consume the flags */
\ 00000174 010058E3 CMP R8,#+1
\ 00000178 0500001A BNE ??OSFlagAccept_20
168 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
\ 0000017C B810D5E1 LDRH R1,[R5, #+8]
\ 00000180 011097E1 ORRS R1,R7,R1
\ 00000184 B810C5E1 STRH R1,[R5, #+8]
\ 00000188 010000EA B ??OSFlagAccept_20
169 }
170 } else {
171 *err = OS_ERR_FLAG_NOT_RDY;
\ ??OSFlagAccept_19:
\ 0000018C 7010A0E3 MOV R1,#+112
\ 00000190 0010C4E5 STRB R1,[R4, #+0]
172 }
173 OS_EXIT_CRITICAL();
\ ??OSFlagAccept_20:
\ 00000194 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
\ 00000198 030000EA B ??OSFlagAccept_11
174 break;
175 #endif
176
177 default:
178 OS_EXIT_CRITICAL();
\ ??OSFlagAccept_7:
\ 0000019C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
179 flags_rdy = (OS_FLAGS)0;
\ 000001A0 0070A0E3 MOV R7,#+0
180 *err = OS_ERR_FLAG_WAIT_TYPE;
\ 000001A4 6F00A0E3 MOV R0,#+111
\ 000001A8 0000C4E5 STRB R0,[R4, #+0]
181 break;
182 }
183 return (flags_rdy);
\ ??OSFlagAccept_11:
\ 000001AC 0700B0E1 MOVS R0,R7
\ 000001B0 0008A0E1 MOV R0,R0, LSL #+16
\ 000001B4 2008B0E1 MOVS R0,R0, LSR #+16
\ ??OSFlagAccept_2:
\ 000001B8 F081BDE8 POP {R4-R8,PC} ;; return
184 }
185 #endif
186
187 /*$PAGE*/
188 /*
189 *********************************************************************************************************
190 * CREATE AN EVENT FLAG
191 *
192 * Description: This function is called to create an event flag group.
193 *
194 * Arguments : flags Contains the initial value to store in the event flag group.
195 *
196 * err is a pointer to an error code which will be returned to your application:
197 * OS_ERR_NONE if the call was successful.
198 * OS_ERR_CREATE_ISR if you attempted to create an Event Flag from an
199 * ISR.
200 * OS_ERR_FLAG_GRP_DEPLETED if there are no more event flag groups
201 *
202 * Returns : A pointer to an event flag group or a NULL pointer if no more groups are available.
203 *
204 * Called from: Task ONLY
205 *********************************************************************************************************
206 */
207
\ In segment CODE, align 4, keep-with-next
208 OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags, INT8U *err)
209 {
\ OSFlagCreate:
\ 00000000 70402DE9 PUSH {R4-R6,LR}
\ 00000004 0050B0E1 MOVS R5,R0
\ 00000008 0140B0E1 MOVS R4,R1
210 OS_FLAG_GRP *pgrp;
211 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -