📄 os_flag.lst
字号:
233 pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
\ 0000002C 0026 MOVS R6,#+0
\ 0000002E 6E60 STR R6,[R5, #+4]
234 #if OS_FLAG_NAME_SIZE > 1
235 pgrp->OSFlagName[0] = '?';
\ 00000030 3F21 MOVS R1,#+63
\ 00000032 A972 STRB R1,[R5, #+10]
236 pgrp->OSFlagName[1] = OS_ASCII_NUL;
\ 00000034 3100 MOVS R1,R6
\ 00000036 E972 STRB R1,[R5, #+11]
237 #endif
238 OS_EXIT_CRITICAL();
\ 00000038 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
239 *perr = OS_ERR_NONE;
\ 0000003C 2670 STRB R6,[R4, #+0]
\ 0000003E 03E0 B.N ??OSFlagCreate_2
240 } else {
241 OS_EXIT_CRITICAL();
\ ??OSFlagCreate_1:
\ 00000040 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
242 *perr = OS_ERR_FLAG_GRP_DEPLETED;
\ 00000044 7220 MOVS R0,#+114
\ 00000046 2070 STRB R0,[R4, #+0]
243 }
244 return (pgrp); /* Return pointer to event flag group */
\ ??OSFlagCreate_2:
\ 00000048 2800 MOVS R0,R5
\ 0000004A 70BD 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 * perr 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 *perr)
286 {
\ OSFlagDel:
\ 00000000 2DE9F04F PUSH {R4-R11,LR}
\ 00000004 8B46 MOV R11,R1
\ 00000006 0500 MOVS R5,R0
\ 00000008 1400 MOVS R4,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;
292 #endif
293
294
295
296 #if OS_ARG_CHK_EN > 0
297 if (perr == (INT8U *)0) { /* Validate 'perr' */
298 return (pgrp);
299 }
300 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
301 *perr = OS_ERR_FLAG_INVALID_PGRP;
302 return (pgrp);
303 }
304 #endif
305 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ 0000000A .... LDR.N R0,??DataTable6 ;; OSIntNesting
\ 0000000C 0078 LDRB R0,[R0, #+0]
\ 0000000E 0028 CMP R0,#+0
\ 00000010 03D0 BEQ.N ??OSFlagDel_0
306 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 00000012 0F20 MOVS R0,#+15
\ 00000014 2070 STRB R0,[R4, #+0]
307 return (pgrp);
\ 00000016 2800 MOVS R0,R5
\ 00000018 53E0 B.N ??OSFlagDel_1
308 }
309 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
\ ??OSFlagDel_0:
\ 0000001A 0126 MOVS R6,#+1
\ 0000001C 2878 LDRB R0,[R5, #+0]
\ 0000001E 0528 CMP R0,#+5
\ 00000020 02D0 BEQ.N ??OSFlagDel_2
310 *perr = OS_ERR_EVENT_TYPE;
\ 00000022 2670 STRB R6,[R4, #+0]
311 return (pgrp);
\ 00000024 2800 MOVS R0,R5
\ 00000026 4CE0 B.N ??OSFlagDel_1
312 }
313 OS_ENTER_CRITICAL();
\ ??OSFlagDel_2:
\ 00000028 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
\ 0000002C 8046 MOV R8,R0
314 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
\ 0000002E 0020 MOVS R0,#+0
\ 00000030 8146 MOV R9,R0
\ 00000032 6868 LDR R0,[R5, #+4]
\ 00000034 0028 CMP R0,#+0
\ 00000036 00D1 BNE.N ??OSFlagDel_3
315 tasks_waiting = OS_TRUE; /* Yes */
316 } else {
317 tasks_waiting = OS_FALSE; /* No */
\ 00000038 4E46 MOV R6,R9
318 }
319 switch (opt) {
\ ??OSFlagDel_3:
\ 0000003A .... LDR.N R7,??DataTable3 ;; OSFlagFreeList
\ 0000003C 3F20 MOVS R0,#+63
\ 0000003E 8246 MOV R10,R0
\ 00000040 5846 MOV R0,R11
\ 00000042 0028 CMP R0,#+0
\ 00000044 02D0 BEQ.N ??OSFlagDel_4
\ 00000046 0128 CMP R0,#+1
\ 00000048 15D0 BEQ.N ??OSFlagDel_5
\ 0000004A 34E0 B.N ??OSFlagDel_6
320 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
321 if (tasks_waiting == OS_FALSE) {
\ ??OSFlagDel_4:
\ 0000004C 002E CMP R6,#+0
\ 0000004E 0CD1 BNE.N ??OSFlagDel_7
322 #if OS_FLAG_NAME_SIZE > 1
323 pgrp->OSFlagName[0] = '?'; /* Unknown name */
\ 00000050 85F80AA0 STRB R10,[R5, #+10]
324 pgrp->OSFlagName[1] = OS_ASCII_NUL;
\ 00000054 E872 STRB R0,[R5, #+11]
325 #endif
326 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
\ 00000056 2870 STRB R0,[R5, #+0]
327 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
\ 00000058 3868 LDR R0,[R7, #+0]
\ 0000005A 6860 STR R0,[R5, #+4]
328 pgrp->OSFlagFlags = (OS_FLAGS)0;
\ 0000005C 4846 MOV R0,R9
\ 0000005E 2881 STRH R0,[R5, #+8]
329 OSFlagFreeList = pgrp;
\ 00000060 3D60 STR R5,[R7, #+0]
330 OS_EXIT_CRITICAL();
\ 00000062 4046 MOV R0,R8
\ 00000064 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
\ 00000068 21E0 B.N ??OSFlagDel_8
331 *perr = OS_ERR_NONE;
332 pgrp_return = (OS_FLAG_GRP *)0; /* Event Flag Group has been deleted */
333 } else {
334 OS_EXIT_CRITICAL();
\ ??OSFlagDel_7:
\ 0000006A 4046 MOV R0,R8
\ 0000006C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
335 *perr = OS_ERR_TASK_WAITING;
\ 00000070 4920 MOVS R0,#+73
\ 00000072 2070 STRB R0,[R4, #+0]
336 pgrp_return = pgrp;
\ 00000074 24E0 B.N ??OSFlagDel_9
337 }
338 break;
339
340 case OS_DEL_ALWAYS: /* Always delete the event flag group */
341 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
\ ??OSFlagDel_5:
\ 00000076 6868 LDR R0,[R5, #+4]
\ 00000078 8346 MOV R11,R0
\ 0000007A 05E0 B.N ??OSFlagDel_10
342 while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags */
343 (void)OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
\ ??OSFlagDel_11:
\ 0000007C 4946 MOV R1,R9
\ 0000007E ........ BL OS_FlagTaskRdy
344 pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
\ 00000082 DBF80000 LDR R0,[R11, #+0]
\ 00000086 8346 MOV R11,R0
345 }
\ ??OSFlagDel_10:
\ 00000088 5846 MOV R0,R11
\ 0000008A 0028 CMP R0,#+0
\ 0000008C F6D1 BNE.N ??OSFlagDel_11
346 #if OS_FLAG_NAME_SIZE > 1
347 pgrp->OSFlagName[0] = '?'; /* Unknown name */
\ 0000008E 85F80AA0 STRB R10,[R5, #+10]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -