📄 os_flag.lst
字号:
220 }
221 #endif
222 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ ??OSFlagCreate_0:
\ 00000024 ........ LDR R0,??DataTable9 ;; OSIntNesting
\ 00000028 0000D0E5 LDRB R0,[R0, #+0]
\ 0000002C 010050E3 CMP R0,#+1
\ 00000030 0300003A BCC ??OSFlagCreate_2
223 *err = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR */
\ 00000034 1000A0E3 MOV R0,#+16
\ 00000038 0000C5E5 STRB R0,[R5, #+0]
224 return ((OS_FLAG_GRP *)0);
\ 0000003C 0000A0E3 MOV R0,#+0
\ 00000040 1E0000EA B ??OSFlagCreate_1
225 }
226 OS_ENTER_CRITICAL();
\ ??OSFlagCreate_2:
\ 00000044 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 00000048 0070B0E1 MOVS R7,R0
227 pgrp = OSFlagFreeList; /* Get next free event flag */
\ 0000004C ........ LDR R0,??DataTable34 ;; OSFlagFreeList
\ 00000050 000090E5 LDR R0,[R0, #+0]
\ 00000054 0060B0E1 MOVS R6,R0
228 if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
\ 00000058 000056E3 CMP R6,#+0
\ 0000005C 1200000A BEQ ??OSFlagCreate_3
229 /* Adjust free list */
230 OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
\ 00000060 ........ LDR R0,??DataTable34 ;; OSFlagFreeList
\ 00000064 ........ LDR R1,??DataTable34 ;; OSFlagFreeList
\ 00000068 001091E5 LDR R1,[R1, #+0]
\ 0000006C 041091E5 LDR R1,[R1, #+4]
\ 00000070 001080E5 STR R1,[R0, #+0]
231 pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
\ 00000074 0500A0E3 MOV R0,#+5
\ 00000078 0000C6E5 STRB R0,[R6, #+0]
232 pgrp->OSFlagFlags = flags; /* Set to desired initial value */
\ 0000007C B840C6E1 STRH R4,[R6, #+8]
233 pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
\ 00000080 0000A0E3 MOV R0,#+0
\ 00000084 040086E5 STR R0,[R6, #+4]
234 #if OS_FLAG_NAME_SIZE > 1
235 pgrp->OSFlagName[0] = '?';
\ 00000088 3F00A0E3 MOV R0,#+63
\ 0000008C 0A00C6E5 STRB R0,[R6, #+10]
236 pgrp->OSFlagName[1] = OS_ASCII_NUL;
\ 00000090 0000A0E3 MOV R0,#+0
\ 00000094 0B00C6E5 STRB R0,[R6, #+11]
237 #endif
238 OS_EXIT_CRITICAL();
\ 00000098 0700B0E1 MOVS R0,R7
\ 0000009C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
239 *err = OS_ERR_NONE;
\ 000000A0 0000A0E3 MOV R0,#+0
\ 000000A4 0000C5E5 STRB R0,[R5, #+0]
\ 000000A8 030000EA B ??OSFlagCreate_4
240 } else {
241 OS_EXIT_CRITICAL();
\ ??OSFlagCreate_3:
\ 000000AC 0700B0E1 MOVS R0,R7
\ 000000B0 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
242 *err = OS_ERR_FLAG_GRP_DEPLETED;
\ 000000B4 7200A0E3 MOV R0,#+114
\ 000000B8 0000C5E5 STRB R0,[R5, #+0]
243 }
244 return (pgrp); /* Return pointer to event flag group */
\ ??OSFlagCreate_4:
\ 000000BC 0600B0E1 MOVS R0,R6
\ ??OSFlagCreate_1:
\ 000000C0 F080BDE8 POP {R4-R7,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 F0472DE9 PUSH {R4-R10,LR}
\ 00000004 00A0B0E1 MOVS R10,R0
\ 00000008 0140B0E1 MOVS R4,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 0000A0E3 MOV R0,#+0
\ 00000014 0090B0E1 MOVS R9,R0
292 #endif
293
294
295
296 #if OS_ARG_CHK_EN > 0
297 if (err == (INT8U *)0) { /* Validate 'err' */
\ 00000018 000055E3 CMP R5,#+0
\ 0000001C 0100001A BNE ??OSFlagDel_0
298 return (pgrp);
\ 00000020 0A00B0E1 MOVS R0,R10
\ 00000024 660000EA B ??OSFlagDel_1
299 }
300 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
\ ??OSFlagDel_0:
\ 00000028 00005AE3 CMP R10,#+0
\ 0000002C 0300001A BNE ??OSFlagDel_2
301 *err = OS_ERR_FLAG_INVALID_PGRP;
\ 00000030 6E00A0E3 MOV R0,#+110
\ 00000034 0000C5E5 STRB R0,[R5, #+0]
302 return (pgrp);
\ 00000038 0A00B0E1 MOVS R0,R10
\ 0000003C 600000EA B ??OSFlagDel_1
303 }
304 #endif
305 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ ??OSFlagDel_2:
\ 00000040 ........ LDR R0,??DataTable9 ;; OSIntNesting
\ 00000044 0000D0E5 LDRB R0,[R0, #+0]
\ 00000048 010050E3 CMP R0,#+1
\ 0000004C 0300003A BCC ??OSFlagDel_3
306 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 00000050 0F00A0E3 MOV R0,#+15
\ 00000054 0000C5E5 STRB R0,[R5, #+0]
307 return (pgrp);
\ 00000058 0A00B0E1 MOVS R0,R10
\ 0000005C 580000EA B ??OSFlagDel_1
308 }
309 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
\ ??OSFlagDel_3:
\ 00000060 0000DAE5 LDRB R0,[R10, #+0]
\ 00000064 050050E3 CMP R0,#+5
\ 00000068 0300000A BEQ ??OSFlagDel_4
310 *err = OS_ERR_EVENT_TYPE;
\ 0000006C 0100A0E3 MOV R0,#+1
\ 00000070 0000C5E5 STRB R0,[R5, #+0]
311 return (pgrp);
\ 00000074 0A00B0E1 MOVS R0,R10
\ 00000078 510000EA B ??OSFlagDel_1
312 }
313 OS_ENTER_CRITICAL();
\ ??OSFlagDel_4:
\ 0000007C ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 00000080 0090B0E1 MOVS R9,R0
314 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
\ 00000084 04009AE5 LDR R0,[R10, #+4]
\ 00000088 000050E3 CMP R0,#+0
\ 0000008C 0200000A BEQ ??OSFlagDel_5
315 tasks_waiting = OS_TRUE; /* Yes */
\ 00000090 0100A0E3 MOV R0,#+1
\ 00000094 0060B0E1 MOVS R6,R0
\ 00000098 010000EA B ??OSFlagDel_6
316 } else {
317 tasks_waiting = OS_FALSE; /* No */
\ ??OSFlagDel_5:
\ 0000009C 0000A0E3 MOV R0,#+0
\ 000000A0 0060B0E1 MOVS R6,R0
318 }
319 switch (opt) {
\ ??OSFlagDel_6:
\ 000000A4 0400B0E1 MOVS R0,R4
\ 000000A8 000050E3 CMP R0,#+0
\ 000000AC 0200000A BEQ ??OSFlagDel_7
\ 000000B0 010050E3 CMP R0,#+1
\ 000000B4 1C00000A BEQ ??OSFlagDel_8
\ 000000B8 3B0000EA B ??OSFlagDel_9
320 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
321 if (tasks_waiting == OS_FALSE) {
\ ??OSFlagDel_7:
\ 000000BC 000056E3 CMP R6,#+0
\ 000000C0 1300001A BNE ??OSFlagDel_10
322 #if OS_FLAG_NAME_SIZE > 1
323 pgrp->OSFlagName[0] = '?'; /* Unknown name */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -