📄 os_flag.lst
字号:
233 *
234 * Arguments : pgrp is a pointer to the desired event flag group.
235 *
236 * opt determines delete options as follows:
237 * opt == OS_DEL_NO_PEND Deletes the event flag group ONLY if no task pending
238 * opt == OS_DEL_ALWAYS Deletes the event flag group even if tasks are
239 * waiting. In this case, all the tasks pending will be
240 * readied.
241 *
242 * err is a pointer to an error code that can contain one of the following values:
243 * OS_NO_ERR The call was successful and the event flag group was
244 * deleted
245 * OS_ERR_DEL_ISR If you attempted to delete the event flag group from
246 * an ISR
247 * OS_FLAG_INVALID_PGRP If 'pgrp' is a NULL pointer.
248 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to an event flag group
249 * OS_ERR_INVALID_OPT An invalid option was specified
250 * OS_ERR_TASK_WAITING One or more tasks were waiting on the event flag
251 * group.
252 *
253 * Returns : pevent upon error
254 * (OS_EVENT *)0 if the semaphore was successfully deleted.
255 *
256 * Note(s) : 1) This function must be used with care. Tasks that would normally expect the presence of
257 * the event flag group MUST check the return code of OSFlagAccept() and OSFlagPend().
258 * 2) This call can potentially disable interrupts for a long time. The interrupt disable
259 * time is directly proportional to the number of tasks waiting on the event flag group.
260 *********************************************************************************************************
261 */
262
263 #if OS_FLAG_DEL_EN > 0
\ In segment CODE, align 4, keep-with-next
264 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
265 {
\ OSFlagDel:
\ 00000000 F0B5 PUSH {R4-R7,LR}
\ 00000002 81B0 SUB SP,SP,#+4
\ 00000004 0400 MOVS R4,R0
\ 00000006 0F00 MOVS R7,R1
\ 00000008 1500 MOVS R5,R2
266 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
267 OS_CPU_SR cpu_sr;
268 #endif
269 BOOLEAN tasks_waiting;
270 OS_FLAG_NODE *pnode;
271
272
273 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ 0000000A .... LDR R0,??DataTable2 ;; OSIntNesting
\ 0000000C 0078 LDRB R0,[R0, #+0]
\ 0000000E 0028 CMP R0,#+0
\ 00000010 01D0 BEQ ??OSFlagDel_0
274 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 00000012 8C20 MOVS R0,#+140
\ 00000014 52E0 B.N ??OSFlagDel_1
275 return (pgrp);
276 }
277 #if OS_ARG_CHK_EN > 0
278 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
\ ??OSFlagDel_0:
\ 00000016 002C CMP R4,#+0
\ 00000018 03D1 BNE ??OSFlagDel_2
279 *err = OS_FLAG_INVALID_PGRP;
\ 0000001A 9620 MOVS R0,#+150
\ 0000001C 2870 STRB R0,[R5, #+0]
280 return (pgrp);
\ 0000001E 0020 MOVS R0,#+0
\ 00000020 4EE0 B ??OSFlagDel_3
281 }
282 #endif
283 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
\ ??OSFlagDel_2:
\ 00000022 2078 LDRB R0,[R4, #+0]
\ 00000024 0528 CMP R0,#+5
\ 00000026 01D0 BEQ ??OSFlagDel_4
284 *err = OS_ERR_EVENT_TYPE;
\ 00000028 0120 MOVS R0,#+1
\ 0000002A 47E0 B.N ??OSFlagDel_1
285 return (pgrp);
286 }
287 OS_ENTER_CRITICAL();
\ ??OSFlagDel_4:
\ 0000002C ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
\ 00000030 0090 STR R0,[SP, #+0]
288 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
\ 00000032 6068 LDR R0,[R4, #+4]
\ 00000034 0028 CMP R0,#+0
\ 00000036 01D0 BEQ ??OSFlagDel_5
289 tasks_waiting = TRUE; /* Yes */
\ 00000038 0126 MOVS R6,#+1
\ 0000003A 00E0 B ??OSFlagDel_6
290 } else {
291 tasks_waiting = FALSE; /* No */
\ ??OSFlagDel_5:
\ 0000003C 0026 MOVS R6,#+0
292 }
293 switch (opt) {
\ ??OSFlagDel_6:
\ 0000003E 002F CMP R7,#+0
\ 00000040 02D0 BEQ ??OSFlagDel_7
\ 00000042 012F CMP R7,#+1
\ 00000044 19D0 BEQ ??OSFlagDel_8
\ 00000046 35E0 B ??OSFlagDel_9
294 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
295 if (tasks_waiting == FALSE) {
\ ??OSFlagDel_7:
\ 00000048 002E CMP R6,#+0
\ 0000004A 11D1 BNE ??OSFlagDel_10
296 #if OS_FLAG_NAME_SIZE > 1
297 pgrp->OSFlagName[0] = '?'; /* Unknown name */
\ 0000004C 3F20 MOVS R0,#+63
\ 0000004E A072 STRB R0,[R4, #+10]
298 pgrp->OSFlagName[1] = OS_ASCII_NUL;
\ 00000050 0020 MOVS R0,#+0
\ 00000052 E072 STRB R0,[R4, #+11]
299 #endif
300 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
\ 00000054 2070 STRB R0,[R4, #+0]
301 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
\ 00000056 .... LDR R0,??DataTable6 ;; OSFlagFreeList
\ 00000058 0068 LDR R0,[R0, #+0]
\ 0000005A 6060 STR R0,[R4, #+4]
302 pgrp->OSFlagFlags = (OS_FLAGS)0;
\ 0000005C 0020 MOVS R0,#+0
\ 0000005E 2081 STRH R0,[R4, #+8]
303 OSFlagFreeList = pgrp;
\ 00000060 .... LDR R0,??DataTable6 ;; OSFlagFreeList
\ 00000062 0460 STR R4,[R0, #+0]
304 OS_EXIT_CRITICAL();
\ 00000064 0098 LDR R0,[SP, #+0]
\ 00000066 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
305 *err = OS_NO_ERR;
\ ??OSFlagDel_11:
\ 0000006A 0020 MOVS R0,#+0
\ 0000006C 2870 STRB R0,[R5, #+0]
306 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
\ 0000006E 27E0 B ??OSFlagDel_3
307 } else {
308 OS_EXIT_CRITICAL();
\ ??OSFlagDel_10:
\ 00000070 0098 LDR R0,[SP, #+0]
\ 00000072 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
309 *err = OS_ERR_TASK_WAITING;
\ 00000076 0820 MOVS R0,#+8
\ 00000078 20E0 B.N ??OSFlagDel_1
310 return (pgrp);
311 }
312
313 case OS_DEL_ALWAYS: /* Always delete the event flag group */
314 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
\ ??OSFlagDel_8:
\ 0000007A 0700 MOVS R7,R0
\ 0000007C 06D0 BEQ ??OSFlagDel_12
315 while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags */
316 OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
\ ??OSFlagDel_13:
\ 0000007E 0021 MOVS R1,#+0
\ 00000080 3800 MOVS R0,R7
\ 00000082 ........ BL OS_FlagTaskRdy
317 pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
\ 00000086 3F68 LDR R7,[R7, #+0]
318 }
\ 00000088 002F CMP R7,#+0
\ 0000008A F8D1 BNE ??OSFlagDel_13
319 #if OS_EVENT_NAME_SIZE > 1
320 pgrp->OSFlagName[0] = '?'; /* Unknown name */
\ ??OSFlagDel_12:
\ 0000008C 3F20 MOVS R0,#+63
\ 0000008E A072 STRB R0,[R4, #+10]
321 pgrp->OSFlagName[1] = OS_ASCII_NUL;
\ 00000090 0020 MOVS R0,#+0
\ 00000092 E072 STRB R0,[R4, #+11]
322 #endif
323 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
\ 00000094 2070 STRB R0,[R4, #+0]
324 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list */
\ 00000096 .... LDR R0,??DataTable6 ;; OSFlagFreeList
\ 00000098 0068 LDR R0,[R0, #+0]
\ 0000009A 6060 STR R0,[R4, #+4]
325 pgrp->OSFlagFlags = (OS_FLAGS)0;
\ 0000009C 0020 MOVS R0,#+0
\ 0000009E 2081 STRH R0,[R4, #+8]
326 OSFlagFreeList = pgrp;
\ 000000A0 .... LDR R0,??DataTable6 ;; OSFlagFreeList
\ 000000A2 0460 STR R4,[R0, #+0]
327 OS_EXIT_CRITICAL();
\ 000000A4 0098 LDR R0,[SP, #+0]
\ 000000A6 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
328 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
\ 000000AA 012E CMP R6,#+1
\ 000000AC DDD1 BNE ??OSFlagDel_11
329 OS_Sched(); /* Find highest priority task ready to run */
\ 000000AE ........ _BLF OS_Sched,??OS_Sched??rT
330 }
331 *err = OS_NO_ERR;
\ ??OSFlagDel_14:
\ 000000B2 DAE7 B.N ??OSFlagDel_11
332 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
333
334 default:
335 OS_EXIT_CRITICAL();
\ ??OSFlagDel_9:
\ 000000B4 0098 LDR R0,[SP, #+0]
\ 000000B6 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
336 *err = OS_ERR_INVALID_OPT;
\ 000000BA 0720 MOVS R0,#+7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -