📄 os_flag.lst
字号:
210 pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
\ 0000002C 0521 MOVS R1,#+5
\ 0000002E 3170 STRB R1,[R6, #+0]
211 pgrp->OSFlagFlags = flags; /* Set to desired initial value */
\ 00000030 3481 STRH R4,[R6, #+8]
212 pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
\ 00000032 0021 MOVS R1,#+0
\ 00000034 7160 STR R1,[R6, #+4]
213 #if OS_FLAG_NAME_SIZE > 1
214 pgrp->OSFlagName[0] = '?';
\ 00000036 3F21 MOVS R1,#+63
\ 00000038 B172 STRB R1,[R6, #+10]
215 pgrp->OSFlagName[1] = OS_ASCII_NUL;
\ 0000003A 0021 MOVS R1,#+0
\ 0000003C F172 STRB R1,[R6, #+11]
216 #endif
217 OS_EXIT_CRITICAL();
\ 0000003E ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
218 *err = OS_NO_ERR;
\ 00000042 0020 MOVS R0,#+0
\ 00000044 2870 STRB R0,[R5, #+0]
\ 00000046 03E0 B ??OSFlagCreate_3
219 } else {
220 OS_EXIT_CRITICAL();
\ ??OSFlagCreate_2:
\ 00000048 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
221 *err = OS_FLAG_GRP_DEPLETED;
\ 0000004C 9A20 MOVS R0,#+154
\ 0000004E 2870 STRB R0,[R5, #+0]
222 }
223 return (pgrp); /* Return pointer to event flag group */
\ ??OSFlagCreate_3:
\ 00000050 3000 MOVS R0,R6
\ ??OSFlagCreate_1:
\ 00000052 70BC POP {R4-R6}
\ 00000054 02BC POP {R1}
\ 00000056 0847 BX R1 ;; return
224 }
225
226 /*$PAGE*/
227 /*
228 *********************************************************************************************************
229 * DELETE AN EVENT FLAG GROUP
230 *
231 * Description: This function deletes an event flag group and readies all tasks pending on the event flag
232 * group.
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 F2B5 PUSH {R1,R4-R7,LR}
\ 00000002 81B0 SUB SP,SP,#+4
\ 00000004 0400 MOVS R4,R0
\ 00000006 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 ... */
\ 00000008 .... LDR R0,??DataTable4 ;; OSIntNesting
\ 0000000A 0078 LDRB R0,[R0, #+0]
\ 0000000C 0128 CMP R0,#+1
\ 0000000E 03D3 BCC ??OSFlagDel_0
274 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 00000010 8C20 MOVS R0,#+140
\ 00000012 2870 STRB R0,[R5, #+0]
275 return (pgrp);
\ 00000014 2000 MOVS R0,R4
\ 00000016 64E0 B ??OSFlagDel_1
276 }
277 #if OS_ARG_CHK_EN > 0
278 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
\ ??OSFlagDel_0:
\ 00000018 002C CMP R4,#+0
\ 0000001A 03D1 BNE ??OSFlagDel_2
279 *err = OS_FLAG_INVALID_PGRP;
\ 0000001C 9620 MOVS R0,#+150
\ 0000001E 2870 STRB R0,[R5, #+0]
280 return (pgrp);
\ 00000020 2000 MOVS R0,R4
\ 00000022 5EE0 B ??OSFlagDel_1
281 }
282 #endif
283 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
\ ??OSFlagDel_2:
\ 00000024 2078 LDRB R0,[R4, #+0]
\ 00000026 0528 CMP R0,#+5
\ 00000028 03D0 BEQ ??OSFlagDel_3
284 *err = OS_ERR_EVENT_TYPE;
\ 0000002A 0120 MOVS R0,#+1
\ 0000002C 2870 STRB R0,[R5, #+0]
285 return (pgrp);
\ 0000002E 2000 MOVS R0,R4
\ 00000030 57E0 B ??OSFlagDel_1
286 }
287 OS_ENTER_CRITICAL();
\ ??OSFlagDel_3:
\ 00000032 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
\ 00000036 0600 MOVS R6,R0
288 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
\ 00000038 6068 LDR R0,[R4, #+4]
\ 0000003A 0028 CMP R0,#+0
\ 0000003C 01D0 BEQ ??OSFlagDel_4
289 tasks_waiting = TRUE; /* Yes */
\ 0000003E 0127 MOVS R7,#+1
\ 00000040 00E0 B ??OSFlagDel_5
290 } else {
291 tasks_waiting = FALSE; /* No */
\ ??OSFlagDel_4:
\ 00000042 0027 MOVS R7,#+0
292 }
293 switch (opt) {
\ ??OSFlagDel_5:
\ 00000044 6846 MOV R0,SP
\ 00000046 0079 LDRB R0,[R0, #+4]
\ 00000048 0028 CMP R0,#+0
\ 0000004A 02D0 BEQ ??OSFlagDel_6
\ 0000004C 0128 CMP R0,#+1
\ 0000004E 1DD0 BEQ ??OSFlagDel_7
\ 00000050 41E0 B ??OSFlagDel_8
294 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
295 if (tasks_waiting == FALSE) {
\ ??OSFlagDel_6:
\ 00000052 002F CMP R7,#+0
\ 00000054 13D1 BNE ??OSFlagDel_9
296 #if OS_FLAG_NAME_SIZE > 1
297 pgrp->OSFlagName[0] = '?'; /* Unknown name */
\ 00000056 3F20 MOVS R0,#+63
\ 00000058 A072 STRB R0,[R4, #+10]
298 pgrp->OSFlagName[1] = OS_ASCII_NUL;
\ 0000005A 0020 MOVS R0,#+0
\ 0000005C E072 STRB R0,[R4, #+11]
299 #endif
300 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
\ 0000005E 0020 MOVS R0,#+0
\ 00000060 2070 STRB R0,[R4, #+0]
301 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
\ 00000062 .... LDR R0,??DataTable8 ;; OSFlagFreeList
\ 00000064 0068 LDR R0,[R0, #+0]
\ 00000066 6060 STR R0,[R4, #+4]
302 pgrp->OSFlagFlags = (OS_FLAGS)0;
\ 00000068 0020 MOVS R0,#+0
\ 0000006A 2081 STRH R0,[R4, #+8]
303 OSFlagFreeList = pgrp;
\ 0000006C .... LDR R0,??DataTable8 ;; OSFlagFreeList
\ 0000006E 0460 STR R4,[R0, #+0]
304 OS_EXIT_CRITICAL();
\ 00000070 3000 MOVS R0,R6
\ 00000072 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
305 *err = OS_NO_ERR;
\ 00000076 0020 MOVS R0,#+0
\ 00000078 2870 STRB R0,[R5, #+0]
306 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
\ 0000007A 0020 MOVS R0,#+0
\ 0000007C 31E0 B ??OSFlagDel_1
307 } else {
308 OS_EXIT_CRITICAL();
\ ??OSFlagDel_9:
\ 0000007E 3000 MOVS R0,R6
\ 00000080 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
309 *err = OS_ERR_TASK_WAITING;
\ 00000084 0820 MOVS R0,#+8
\ 00000086 2870 STRB R0,[R5, #+0]
310 return (pgrp);
\ 00000088 2000 MOVS R0,R4
\ 0000008A 2AE0 B ??OSFlagDel_1
311 }
312
313 case OS_DEL_ALWAYS: /* Always delete the event flag group */
314 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
\ ??OSFlagDel_7:
\ 0000008C 6068 LDR R0,[R4, #+4]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -