📄 os_flag.lst
字号:
228 if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
\ 00000024 0ED0 BEQ.N ??OSFlagCreate_3
229 /* Adjust free list */
230 OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
\ 00000026 5268 LDR R2,[R2, #+4]
\ 00000028 0A60 STR R2,[R1, #+0]
231 pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
\ 0000002A 0521 MOVS R1,#+5
\ 0000002C 2970 STRB R1,[R5, #+0]
232 pgrp->OSFlagFlags = flags; /* Set to desired initial value */
\ 0000002E 2E81 STRH R6,[R5, #+8]
233 pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
\ 00000030 0026 MOVS R6,#+0
\ 00000032 6E60 STR R6,[R5, #+4]
234 #if OS_FLAG_NAME_SIZE > 1
235 pgrp->OSFlagName[0] = '?';
\ 00000034 3F21 MOVS R1,#+63
\ 00000036 A972 STRB R1,[R5, #+10]
236 pgrp->OSFlagName[1] = OS_ASCII_NUL;
\ 00000038 3100 MOVS R1,R6
\ 0000003A E972 STRB R1,[R5, #+11]
237 #endif
238 OS_EXIT_CRITICAL();
\ 0000003C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
239 *perr = OS_ERR_NONE;
\ 00000040 2670 STRB R6,[R4, #+0]
\ 00000042 03E0 B.N ??OSFlagCreate_4
240 } else {
241 OS_EXIT_CRITICAL();
\ ??OSFlagCreate_3:
\ 00000044 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
242 *perr = OS_ERR_FLAG_GRP_DEPLETED;
\ 00000048 7220 MOVS R0,#+114
\ 0000004A 2070 STRB R0,[R4, #+0]
243 }
244 return (pgrp); /* Return pointer to event flag group */
\ ??OSFlagCreate_4:
\ 0000004C 2800 MOVS R0,R5
\ 0000004E 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' */
\ 0000000A 01D1 BNE.N ??OSFlagDel_0
298 return (pgrp);
\ ??OSFlagDel_1:
\ 0000000C 2800 MOVS R0,R5
\ 0000000E 5FE0 B.N ??OSFlagDel_2
299 }
300 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
\ ??OSFlagDel_0:
\ 00000010 002D CMP R5,#+0
\ 00000012 03D1 BNE.N ??OSFlagDel_3
301 *perr = OS_ERR_FLAG_INVALID_PGRP;
\ 00000014 6E20 MOVS R0,#+110
\ 00000016 2070 STRB R0,[R4, #+0]
302 return (pgrp);
\ 00000018 0020 MOVS R0,#+0
\ 0000001A 59E0 B.N ??OSFlagDel_2
303 }
304 #endif
305 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ ??OSFlagDel_3:
\ 0000001C .... LDR.N R0,??DataTable5 ;; OSIntNesting
\ 0000001E 0078 LDRB R0,[R0, #+0]
\ 00000020 0028 CMP R0,#+0
\ 00000022 02D0 BEQ.N ??OSFlagDel_4
306 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 00000024 0F20 MOVS R0,#+15
\ 00000026 2070 STRB R0,[R4, #+0]
\ 00000028 F0E7 B.N ??OSFlagDel_1
307 return (pgrp);
308 }
309 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
\ ??OSFlagDel_4:
\ 0000002A 0126 MOVS R6,#+1
\ 0000002C 2878 LDRB R0,[R5, #+0]
\ 0000002E 0528 CMP R0,#+5
\ 00000030 01D0 BEQ.N ??OSFlagDel_5
310 *perr = OS_ERR_EVENT_TYPE;
\ 00000032 2670 STRB R6,[R4, #+0]
\ 00000034 EAE7 B.N ??OSFlagDel_1
311 return (pgrp);
312 }
313 OS_ENTER_CRITICAL();
\ ??OSFlagDel_5:
\ 00000036 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
\ 0000003A 8046 MOV R8,R0
314 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
\ 0000003C 0020 MOVS R0,#+0
\ 0000003E 8146 MOV R9,R0
\ 00000040 6868 LDR R0,[R5, #+4]
\ 00000042 0028 CMP R0,#+0
\ 00000044 00D1 BNE.N ??OSFlagDel_6
315 tasks_waiting = OS_TRUE; /* Yes */
316 } else {
317 tasks_waiting = OS_FALSE; /* No */
\ 00000046 4E46 MOV R6,R9
318 }
319 switch (opt) {
\ ??OSFlagDel_6:
\ 00000048 .... LDR.N R7,??DataTable3 ;; OSFlagFreeList
\ 0000004A 3F20 MOVS R0,#+63
\ 0000004C 8246 MOV R10,R0
\ 0000004E 5846 MOV R0,R11
\ 00000050 0028 CMP R0,#+0
\ 00000052 02D0 BEQ.N ??OSFlagDel_7
\ 00000054 0128 CMP R0,#+1
\ 00000056 15D0 BEQ.N ??OSFlagDel_8
\ 00000058 34E0 B.N ??OSFlagDel_9
320 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
321 if (tasks_waiting == OS_FALSE) {
\ ??OSFlagDel_7:
\ 0000005A 002E CMP R6,#+0
\ 0000005C 0CD1 BNE.N ??OSFlagDel_10
322 #if OS_FLAG_NAME_SIZE > 1
323 pgrp->OSFlagName[0] = '?'; /* Unknown name */
\ 0000005E 85F80AA0 STRB R10,[R5, #+10]
324 pgrp->OSFlagName[1] = OS_ASCII_NUL;
\ 00000062 E872 STRB R0,[R5, #+11]
325 #endif
326 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
\ 00000064 2870 STRB R0,[R5, #+0]
327 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
\ 00000066 3868 LDR R0,[R7, #+0]
\ 00000068 6860 STR R0,[R5, #+4]
328 pgrp->OSFlagFlags = (OS_FLAGS)0;
\ 0000006A 4846 MOV R0,R9
\ 0000006C 2881 STRH R0,[R5, #+8]
329 OSFlagFreeList = pgrp;
\ 0000006E 3D60 STR R5,[R7, #+0]
330 OS_EXIT_CRITICAL();
\ 00000070 4046 MOV R0,R8
\ 00000072 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
\ 00000076 21E0 B.N ??OSFlagDel_11
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_10:
\ 00000078 4046 MOV R0,R8
\ 0000007A ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
335 *perr = OS_ERR_TASK_WAITING;
\ 0000007E 4920 MOVS R0,#+73
\ 00000080 2070 STRB R0,[R4, #+0]
336 pgrp_return = pgrp;
\ 00000082 24E0 B.N ??OSFlagDel_12
337 }
338 break;
339
340 case OS_DEL_ALWAYS: /* Always delete the event flag group */
341 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -