📄 os_flag.lst
字号:
234 OS_SAFETY_CRITICAL_EXCEPTION();
235 return ((OS_FLAG_GRP *)0);
236 }
237 #endif
238
239 if (OSIntNesting > 0u) { /* See if called from ISR ... */
\ 00000008 ........ LDR.W R0,??DataTable9_1
\ 0000000C 0078 LDRB R0,[R0, #+0]
\ 0000000E 0028 CMP R0,#+0
\ 00000010 03D0 BEQ.N ??OSFlagCreate_0
240 *perr = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR */
\ 00000012 1020 MOVS R0,#+16
\ 00000014 2870 STRB R0,[R5, #+0]
241 return ((OS_FLAG_GRP *)0);
\ 00000016 0020 MOVS R0,#+0
\ 00000018 22E0 B.N ??OSFlagCreate_1
242 }
243 OS_ENTER_CRITICAL();
\ ??OSFlagCreate_0:
\ 0000001A ........ BL OS_CPU_SR_Save
\ 0000001E 0700 MOVS R7,R0
244 pgrp = OSFlagFreeList; /* Get next free event flag */
\ 00000020 ........ LDR.W R0,??DataTable9_2
\ 00000024 0068 LDR R0,[R0, #+0]
\ 00000026 0600 MOVS R6,R0
245 if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
\ 00000028 002E CMP R6,#+0
\ 0000002A 13D0 BEQ.N ??OSFlagCreate_2
246 /* Adjust free list */
247 OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
\ 0000002C ........ LDR.W R0,??DataTable9_2
\ 00000030 0068 LDR R0,[R0, #+0]
\ 00000032 4068 LDR R0,[R0, #+4]
\ 00000034 ........ LDR.W R1,??DataTable9_2
\ 00000038 0860 STR R0,[R1, #+0]
248 pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
\ 0000003A 0520 MOVS R0,#+5
\ 0000003C 3070 STRB R0,[R6, #+0]
249 pgrp->OSFlagFlags = flags; /* Set to desired initial value */
\ 0000003E 3481 STRH R4,[R6, #+8]
250 pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
\ 00000040 0020 MOVS R0,#+0
\ 00000042 7060 STR R0,[R6, #+4]
251 #if OS_FLAG_NAME_EN > 0u
252 pgrp->OSFlagName = (INT8U *)(void *)"?";
\ 00000044 .... ADR.N R0,??DataTable4 ;; "\?"
\ 00000046 F060 STR R0,[R6, #+12]
253 #endif
254 OS_EXIT_CRITICAL();
\ 00000048 3800 MOVS R0,R7
\ 0000004A ........ BL OS_CPU_SR_Restore
255 *perr = OS_ERR_NONE;
\ 0000004E 0020 MOVS R0,#+0
\ 00000050 2870 STRB R0,[R5, #+0]
\ 00000052 04E0 B.N ??OSFlagCreate_3
256 } else {
257 OS_EXIT_CRITICAL();
\ ??OSFlagCreate_2:
\ 00000054 3800 MOVS R0,R7
\ 00000056 ........ BL OS_CPU_SR_Restore
258 *perr = OS_ERR_FLAG_GRP_DEPLETED;
\ 0000005A 7220 MOVS R0,#+114
\ 0000005C 2870 STRB R0,[R5, #+0]
259 }
260 return (pgrp); /* Return pointer to event flag group */
\ ??OSFlagCreate_3:
\ 0000005E 3000 MOVS R0,R6
\ ??OSFlagCreate_1:
\ 00000060 F2BD POP {R1,R4-R7,PC} ;; return
261 }
262
263 /*$PAGE*/
264 /*
265 *********************************************************************************************************
266 * DELETE AN EVENT FLAG GROUP
267 *
268 * Description: This function deletes an event flag group and readies all tasks pending on the event flag
269 * group.
270 *
271 * Arguments : pgrp is a pointer to the desired event flag group.
272 *
273 * opt determines delete options as follows:
274 * opt == OS_DEL_NO_PEND Deletes the event flag group ONLY if no task pending
275 * opt == OS_DEL_ALWAYS Deletes the event flag group even if tasks are
276 * waiting. In this case, all the tasks pending will be
277 * readied.
278 *
279 * perr is a pointer to an error code that can contain one of the following values:
280 * OS_ERR_NONE The call was successful and the event flag group was
281 * deleted
282 * OS_ERR_DEL_ISR If you attempted to delete the event flag group from
283 * an ISR
284 * OS_ERR_FLAG_INVALID_PGRP If 'pgrp' is a NULL pointer.
285 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to an event flag group
286 * OS_ERR_INVALID_OPT An invalid option was specified
287 * OS_ERR_TASK_WAITING One or more tasks were waiting on the event flag
288 * group.
289 *
290 * Returns : pgrp upon error
291 * (OS_EVENT *)0 if the event flag group was successfully deleted.
292 *
293 * Note(s) : 1) This function must be used with care. Tasks that would normally expect the presence of
294 * the event flag group MUST check the return code of OSFlagAccept() and OSFlagPend().
295 * 2) This call can potentially disable interrupts for a long time. The interrupt disable
296 * time is directly proportional to the number of tasks waiting on the event flag group.
297 *********************************************************************************************************
298 */
299
300 #if OS_FLAG_DEL_EN > 0u
\ In section .text, align 2, keep-with-next
301 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp,
302 INT8U opt,
303 INT8U *perr)
304 {
\ OSFlagDel:
\ 00000000 2DE9F047 PUSH {R4-R10,LR}
\ 00000004 0400 MOVS R4,R0
\ 00000006 0D00 MOVS R5,R1
\ 00000008 1600 MOVS R6,R2
305 BOOLEAN tasks_waiting;
306 OS_FLAG_NODE *pnode;
307 OS_FLAG_GRP *pgrp_return;
308 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
309 OS_CPU_SR cpu_sr = 0u;
\ 0000000A 5FF0000A MOVS R10,#+0
310 #endif
311
312
313
314 #ifdef OS_SAFETY_CRITICAL
315 if (perr == (INT8U *)0) {
316 OS_SAFETY_CRITICAL_EXCEPTION();
317 return ((OS_FLAG_GRP *)0);
318 }
319 #endif
320
321 #if OS_ARG_CHK_EN > 0u
322 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
323 *perr = OS_ERR_FLAG_INVALID_PGRP;
324 return (pgrp);
325 }
326 #endif
327 if (OSIntNesting > 0u) { /* See if called from ISR ... */
\ 0000000E ........ LDR.W R0,??DataTable9_1
\ 00000012 0078 LDRB R0,[R0, #+0]
\ 00000014 0028 CMP R0,#+0
\ 00000016 03D0 BEQ.N ??OSFlagDel_0
328 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 00000018 0F20 MOVS R0,#+15
\ 0000001A 3070 STRB R0,[R6, #+0]
329 return (pgrp);
\ 0000001C 2000 MOVS R0,R4
\ 0000001E 63E0 B.N ??OSFlagDel_1
330 }
331 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
\ ??OSFlagDel_0:
\ 00000020 2078 LDRB R0,[R4, #+0]
\ 00000022 0528 CMP R0,#+5
\ 00000024 03D0 BEQ.N ??OSFlagDel_2
332 *perr = OS_ERR_EVENT_TYPE;
\ 00000026 0120 MOVS R0,#+1
\ 00000028 3070 STRB R0,[R6, #+0]
333 return (pgrp);
\ 0000002A 2000 MOVS R0,R4
\ 0000002C 5CE0 B.N ??OSFlagDel_1
334 }
335 OS_ENTER_CRITICAL();
\ ??OSFlagDel_2:
\ 0000002E ........ BL OS_CPU_SR_Save
\ 00000032 8246 MOV R10,R0
336 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
\ 00000034 6068 LDR R0,[R4, #+4]
\ 00000036 0028 CMP R0,#+0
\ 00000038 02D0 BEQ.N ??OSFlagDel_3
337 tasks_waiting = OS_TRUE; /* Yes */
\ 0000003A 0120 MOVS R0,#+1
\ 0000003C 0700 MOVS R7,R0
\ 0000003E 01E0 B.N ??OSFlagDel_4
338 } else {
339 tasks_waiting = OS_FALSE; /* No */
\ ??OSFlagDel_3:
\ 00000040 0020 MOVS R0,#+0
\ 00000042 0700 MOVS R7,R0
340 }
341 switch (opt) {
\ ??OSFlagDel_4:
\ 00000044 EDB2 UXTB R5,R5 ;; ZeroExt R5,R5,#+24,#+24
\ 00000046 002D CMP R5,#+0
\ 00000048 02D0 BEQ.N ??OSFlagDel_5
\ 0000004A 012D CMP R5,#+1
\ 0000004C 1FD0 BEQ.N ??OSFlagDel_6
\ 0000004E 44E0 B.N ??OSFlagDel_7
342 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
343 if (tasks_waiting == OS_FALSE) {
\ ??OSFlagDel_5:
\ 00000050 FFB2 UXTB R7,R7 ;; ZeroExt R7,R7,#+24,#+24
\ 00000052 002F CMP R7,#+0
\ 00000054 14D1 BNE.N ??OSFlagDel_8
344 #if OS_FLAG_NAME_EN > 0u
345 pgrp->OSFlagName = (INT8U *)(void *)"?";
\ 00000056 .... ADR.N R0,??DataTable4 ;; "\?"
\ 00000058 E060 STR R0,[R4, #+12]
346 #endif
347 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
\ 0000005A 0020 MOVS R0,#+0
\ 0000005C 2070 STRB R0,[R4, #+0]
348 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
\ 0000005E ........ LDR.W R0,??DataTable9_2
\ 00000062 0068 LDR R0,[R0, #+0]
\ 00000064 6060 STR R0,[R4, #+4]
349 pgrp->OSFlagFlags = (OS_FLAGS)0;
\ 00000066 0020 MOVS R0,#+0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -