📄 os_flag.lst
字号:
212 OS_CPU_SR cpu_sr = 0;
\ 0000000C 0000A0E3 MOV R0,#+0
213 #endif
214
215
216
217 #if OS_ARG_CHK_EN > 0
218 if (err == (INT8U *)0) { /* Validate 'err' */
\ 00000010 000054E3 CMP R4,#+0
\ 00000014 0100001A BNE ??OSFlagCreate_0
219 return ((OS_FLAG_GRP *)0);
\ 00000018 0000A0E3 MOV R0,#+0
\ 0000001C 220000EA B ??OSFlagCreate_1
220 }
221 #endif
222 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ ??OSFlagCreate_0:
\ 00000020 ........ LDR R0,??DataTable9 ;; OSIntNesting
\ 00000024 0000D0E5 LDRB R0,[R0, #+0]
\ 00000028 010050E3 CMP R0,#+1
\ 0000002C 0300003A BCC ??OSFlagCreate_2
223 *err = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR */
\ 00000030 1000A0E3 MOV R0,#+16
\ 00000034 0000C4E5 STRB R0,[R4, #+0]
224 return ((OS_FLAG_GRP *)0);
\ 00000038 0000A0E3 MOV R0,#+0
\ 0000003C 1A0000EA B ??OSFlagCreate_1
225 }
226 OS_ENTER_CRITICAL();
\ ??OSFlagCreate_2:
\ 00000040 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
227 pgrp = OSFlagFreeList; /* Get next free event flag */
\ 00000044 ........ LDR R1,??DataTable34 ;; OSFlagFreeList
\ 00000048 006091E5 LDR R6,[R1, #+0]
228 if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
\ 0000004C 000056E3 CMP R6,#+0
\ 00000050 1100000A BEQ ??OSFlagCreate_3
229 /* Adjust free list */
230 OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
\ 00000054 ........ LDR R1,??DataTable34 ;; OSFlagFreeList
\ 00000058 ........ LDR R2,??DataTable34 ;; OSFlagFreeList
\ 0000005C 002092E5 LDR R2,[R2, #+0]
\ 00000060 042092E5 LDR R2,[R2, #+4]
\ 00000064 002081E5 STR R2,[R1, #+0]
231 pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
\ 00000068 0510A0E3 MOV R1,#+5
\ 0000006C 0010C6E5 STRB R1,[R6, #+0]
232 pgrp->OSFlagFlags = flags; /* Set to desired initial value */
\ 00000070 B850C6E1 STRH R5,[R6, #+8]
233 pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
\ 00000074 0010A0E3 MOV R1,#+0
\ 00000078 041086E5 STR R1,[R6, #+4]
234 #if OS_FLAG_NAME_SIZE > 1
235 pgrp->OSFlagName[0] = '?';
\ 0000007C 3F10A0E3 MOV R1,#+63
\ 00000080 0A10C6E5 STRB R1,[R6, #+10]
236 pgrp->OSFlagName[1] = OS_ASCII_NUL;
\ 00000084 0010A0E3 MOV R1,#+0
\ 00000088 0B10C6E5 STRB R1,[R6, #+11]
237 #endif
238 OS_EXIT_CRITICAL();
\ 0000008C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
239 *err = OS_ERR_NONE;
\ 00000090 0000A0E3 MOV R0,#+0
\ 00000094 0000C4E5 STRB R0,[R4, #+0]
\ 00000098 020000EA B ??OSFlagCreate_4
240 } else {
241 OS_EXIT_CRITICAL();
\ ??OSFlagCreate_3:
\ 0000009C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
242 *err = OS_ERR_FLAG_GRP_DEPLETED;
\ 000000A0 7200A0E3 MOV R0,#+114
\ 000000A4 0000C4E5 STRB R0,[R4, #+0]
243 }
244 return (pgrp); /* Return pointer to event flag group */
\ ??OSFlagCreate_4:
\ 000000A8 0600B0E1 MOVS R0,R6
\ ??OSFlagCreate_1:
\ 000000AC 7080BDE8 POP {R4-R6,PC} ;; return
245 }
246
247 /*$PAGE*/
248 /*
249 *********************************************************************************************************
250 * DELETE AN EVENT FLAG GROUP
251 *
252 * Description: This function deletes an event flag group and readies all tasks pending on the event flag
253 * group.
254 *
255 * Arguments : pgrp is a pointer to the desired event flag group.
256 *
257 * opt determines delete options as follows:
258 * opt == OS_DEL_NO_PEND Deletes the event flag group ONLY if no task pending
259 * opt == OS_DEL_ALWAYS Deletes the event flag group even if tasks are
260 * waiting. In this case, all the tasks pending will be
261 * readied.
262 *
263 * err is a pointer to an error code that can contain one of the following values:
264 * OS_ERR_NONE The call was successful and the event flag group was
265 * deleted
266 * OS_ERR_DEL_ISR If you attempted to delete the event flag group from
267 * an ISR
268 * OS_ERR_FLAG_INVALID_PGRP If 'pgrp' is a NULL pointer.
269 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to an event flag group
270 * OS_ERR_INVALID_OPT An invalid option was specified
271 * OS_ERR_TASK_WAITING One or more tasks were waiting on the event flag
272 * group.
273 *
274 * Returns : pgrp upon error
275 * (OS_EVENT *)0 if the event flag group was successfully deleted.
276 *
277 * Note(s) : 1) This function must be used with care. Tasks that would normally expect the presence of
278 * the event flag group MUST check the return code of OSFlagAccept() and OSFlagPend().
279 * 2) This call can potentially disable interrupts for a long time. The interrupt disable
280 * time is directly proportional to the number of tasks waiting on the event flag group.
281 *********************************************************************************************************
282 */
283
284 #if OS_FLAG_DEL_EN > 0
\ In segment CODE, align 4, keep-with-next
285 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
286 {
\ OSFlagDel:
\ 00000000 F0412DE9 PUSH {R4-R8,LR}
\ 00000004 0040B0E1 MOVS R4,R0
\ 00000008 0160B0E1 MOVS R6,R1
\ 0000000C 0250B0E1 MOVS R5,R2
287 BOOLEAN tasks_waiting;
288 OS_FLAG_NODE *pnode;
289 OS_FLAG_GRP *pgrp_return;
290 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
291 OS_CPU_SR cpu_sr = 0;
\ 00000010 0070A0E3 MOV R7,#+0
292 #endif
293
294
295
296 #if OS_ARG_CHK_EN > 0
297 if (err == (INT8U *)0) { /* Validate 'err' */
\ 00000014 000055E3 CMP R5,#+0
\ 00000018 0100001A BNE ??OSFlagDel_0
298 return (pgrp);
\ 0000001C 0400B0E1 MOVS R0,R4
\ 00000020 5E0000EA B ??OSFlagDel_1
299 }
300 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
\ ??OSFlagDel_0:
\ 00000024 000054E3 CMP R4,#+0
\ 00000028 0300001A BNE ??OSFlagDel_2
301 *err = OS_ERR_FLAG_INVALID_PGRP;
\ 0000002C 6E00A0E3 MOV R0,#+110
\ 00000030 0000C5E5 STRB R0,[R5, #+0]
302 return (pgrp);
\ 00000034 0400B0E1 MOVS R0,R4
\ 00000038 580000EA B ??OSFlagDel_1
303 }
304 #endif
305 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ ??OSFlagDel_2:
\ 0000003C ........ LDR R0,??DataTable9 ;; OSIntNesting
\ 00000040 0000D0E5 LDRB R0,[R0, #+0]
\ 00000044 010050E3 CMP R0,#+1
\ 00000048 0300003A BCC ??OSFlagDel_3
306 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 0000004C 0F00A0E3 MOV R0,#+15
\ 00000050 0000C5E5 STRB R0,[R5, #+0]
307 return (pgrp);
\ 00000054 0400B0E1 MOVS R0,R4
\ 00000058 500000EA B ??OSFlagDel_1
308 }
309 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
\ ??OSFlagDel_3:
\ 0000005C 0000D4E5 LDRB R0,[R4, #+0]
\ 00000060 050050E3 CMP R0,#+5
\ 00000064 0300000A BEQ ??OSFlagDel_4
310 *err = OS_ERR_EVENT_TYPE;
\ 00000068 0100A0E3 MOV R0,#+1
\ 0000006C 0000C5E5 STRB R0,[R5, #+0]
311 return (pgrp);
\ 00000070 0400B0E1 MOVS R0,R4
\ 00000074 490000EA B ??OSFlagDel_1
312 }
313 OS_ENTER_CRITICAL();
\ ??OSFlagDel_4:
\ 00000078 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 0000007C 0070B0E1 MOVS R7,R0
314 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
\ 00000080 040094E5 LDR R0,[R4, #+4]
\ 00000084 000050E3 CMP R0,#+0
\ 00000088 0100000A BEQ ??OSFlagDel_5
315 tasks_waiting = OS_TRUE; /* Yes */
\ 0000008C 0180A0E3 MOV R8,#+1
\ 00000090 000000EA B ??OSFlagDel_6
316 } else {
317 tasks_waiting = OS_FALSE; /* No */
\ ??OSFlagDel_5:
\ 00000094 0080A0E3 MOV R8,#+0
318 }
319 switch (opt) {
\ ??OSFlagDel_6:
\ 00000098 000056E3 CMP R6,#+0
\ 0000009C 0200000A BEQ ??OSFlagDel_7
\ 000000A0 010056E3 CMP R6,#+1
\ 000000A4 1A00000A BEQ ??OSFlagDel_8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -