📄 os_flag.lst
字号:
246 * OS_ERR_TASK_WAITING One or more tasks were waiting on the event flag
247 * group.
248 *
249 * Returns : pevent upon error
250 * (OS_EVENT *)0 if the semaphore was successfully deleted.
251 *
252 * Note(s) : 1) This function must be used with care. Tasks that would normally expect the presence of
253 * the event flag group MUST check the return code of OSFlagAccept() and OSFlagPend().
254 * 2) This call can potentially disable interrupts for a long time. The interrupt disable
255 * time is directly proportional to the number of tasks waiting on the event flag group.
256 *********************************************************************************************************
257 */
258
259 #if OS_FLAG_DEL_EN > 0
260 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
261 {
\ 0130 0A12 PUSH R10
\ 0132 0B12 PUSH R11
\ 0134 0812 PUSH R8
\ 0136 0912 PUSH R9
\ 0138 084C MOV R12,R8
\ 013A 19410A00 MOV 10(SP),R9
262 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
263 OS_CPU_SR cpu_sr;
264 #endif
265 BOOLEAN tasks_waiting;
266 OS_FLAG_NODE *pnode;
267
268
269 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ 013E C2930000 CMP.B #0,&OSIntNesting
\ 0142 0524 JEQ (?0099)
270 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 0144 F9408C00 MOV.B #140,0(R9)
\ 0148 0000
271 return (pgrp);
\ 014A 0C48 MOV R8,R12
272 }
\ 014C 4D3C JMP (?0118)
\ 014E ?0099:
273 #if OS_ARG_CHK_EN > 0
274 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
\ 014E 0893 CMP #0,R8
\ 0150 0520 JNE (?0101)
275 *err = OS_FLAG_INVALID_PGRP;
\ 0152 F9409600 MOV.B #150,0(R9)
\ 0156 0000
276 return (pgrp);
\ 0158 0C43 MOV #0,R12
277 }
\ 015A 463C JMP (?0118)
\ 015C ?0101:
278 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
\ 015C 7C400500 MOV.B #5,R12
\ 0160 6C98 CMP.B @R8,R12
\ 0162 0424 JEQ (?0103)
279 *err = OS_ERR_EVENT_TYPE;
\ 0164 D9430000 MOV.B #1,0(R9)
280 return (pgrp);
\ 0168 0C48 MOV R8,R12
281 }
\ 016A 3E3C JMP (?0118)
\ 016C ?0103:
282 #endif
283 OS_ENTER_CRITICAL();
\ 016C 32C2 DINT
284 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
\ 016E 88930200 CMP #0,2(R8)
\ 0172 0224 JEQ (?0105)
285 tasks_waiting = TRUE; /* Yes */
\ 0174 5B43 MOV.B #1,R11
286 } else {
\ 0176 013C JMP (?0106)
\ 0178 ?0105:
287 tasks_waiting = FALSE; /* No */
\ 0178 4B43 MOV.B #0,R11
\ 017A ?0106:
288 }
289 switch (opt) {
\ 017A 4E83 SUB.B #0,R14
\ 017C 0324 JEQ (?0108)
\ 017E 5E83 SUB.B #1,R14
\ 0180 1424 JEQ (?0111)
\ 0182 2D3C JMP (?0117)
\ 0184 ?0108:
290 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
291 if (tasks_waiting == FALSE) {
\ 0184 4B93 CMP.B #0,R11
\ 0186 0C20 JNE (?0110)
292 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
\ 0188 C8430000 MOV.B #0,0(R8)
293 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
\ 018C 98420000 MOV &OSFlagFreeList,2(R8)
\ 0190 0200
294 OSFlagFreeList = pgrp;
\ 0192 82480000 MOV R8,&OSFlagFreeList
295 OS_EXIT_CRITICAL();
\ 0196 32D2 EINT
296 *err = OS_NO_ERR;
\ 0198 C9430000 MOV.B #0,0(R9)
297 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
\ 019C 0C43 MOV #0,R12
298 } else {
\ 019E 243C JMP (?0118)
\ 01A0 ?0110:
299 OS_EXIT_CRITICAL();
\ 01A0 32D2 EINT
300 *err = OS_ERR_TASK_WAITING;
\ 01A2 F9420000 MOV.B #8,0(R9)
301 return (pgrp);
\ 01A6 0C48 MOV R8,R12
302 }
\ 01A8 1F3C JMP (?0118)
\ 01AA ?0111:
303
304 case OS_DEL_ALWAYS: /* Always delete the event flag group */
305 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
\ 01AA 1A480200 MOV 2(R8),R10
\ 01AE ?0113:
306 while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags */
\ 01AE 0A93 CMP #0,R10
\ 01B0 0624 JEQ (?0112)
307 OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
\ 01B2 0E43 MOV #0,R14
\ 01B4 0C4A MOV R10,R12
\ 01B6 B0129805 CALL #OS_FlagTaskRdy
308 pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
\ 01BA 2A4A MOV @R10,R10
\ 01BC F83F JMP (?0113)
\ 01BE ?0112:
309 }
310 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
\ 01BE C8430000 MOV.B #0,0(R8)
311 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list */
\ 01C2 98420000 MOV &OSFlagFreeList,2(R8)
\ 01C6 0200
312 OSFlagFreeList = pgrp;
\ 01C8 82480000 MOV R8,&OSFlagFreeList
313 OS_EXIT_CRITICAL();
\ 01CC 32D2 EINT
314 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
\ 01CE 5B93 CMP.B #1,R11
\ 01D0 0220 JNE (?0116)
315 OS_Sched(); /* Find highest priority task ready to run */
\ 01D2 B0120000 CALL #OS_Sched
\ 01D6 ?0116:
316 }
317 *err = OS_NO_ERR;
\ 01D6 C9430000 MOV.B #0,0(R9)
318 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
\ 01DA 0C43 MOV #0,R12
319
320 default:
\ 01DC 053C JMP (?0118)
\ 01DE ?0117:
321 OS_EXIT_CRITICAL();
\ 01DE 32D2 EINT
322 *err = OS_ERR_INVALID_OPT;
\ 01E0 F9400700 MOV.B #7,0(R9)
\ 01E4 0000
323 return (pgrp);
\ 01E6 0C48 MOV R8,R12
324 }
\ 01E8 ?0118:
\ 01E8 3941 POP R9
\ 01EA 3841 POP R8
\ 01EC 3B41 POP R11
\ 01EE 3A41 POP R10
\ 01F0 3041 RET
\ 01F2 ?0107:
325 }
\ 01F2 OSFlagPend:
326 #endif
327 /*$PAGE*/
328 /*
329 *********************************************************************************************************
330 * WAIT ON AN EVENT FLAG GROUP
331 *
332 * Description: This function is called to wait for a combination of bits to be set in an event flag
333 * group. Your application can wait for ANY bit to be set or ALL bits to be set.
334 *
335 * Arguments : pgrp is a pointer to the desired event flag group.
336 *
337 * flags Is a bit pattern indicating which bit(s) (i.e. flags) you wish to wait for.
338 * The bits you want are specified by setting the corresponding bits in
339 * 'flags'. e.g. if your application wants to wait for bits 0 and 1 then
340 * 'flags' would contain 0x03.
341 *
342 * wait_type specifies whether you want ALL bits to be set or ANY of the bits to be set.
343 * You can specify the following argument:
344 *
345 * OS_FLAG_WAIT_CLR_ALL You will wait for ALL bits in 'mask' to be clear (0)
346 * OS_FLAG_WAIT_SET_ALL You will wait for ALL bits in 'mask' to be set (1)
347 * OS_FLAG_WAIT_CLR_ANY You will wait for ANY bit in 'mask' to be clear (0)
348 * OS_FLAG_WAIT_SET_ANY You will wait for ANY bit in 'mask' to be set (1)
349 *
350 * NOTE: Add OS_FLAG_CONSUME if you want the event flag to be 'consumed' by
351 * the call. Example, to wait for any flag in a group AND then clear
352 * the flags that are present, set 'wait_type' to:
353 *
354 * OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME
355 *
356 * timeout is an optional timeout (in clock ticks) that your task will wait for the
357 * desired bit combination. If you specify 0, however, your task will wait
358 * forever at the specified event flag group or, until a message arrives.
359 *
360 * err is a pointer to an error code and can be:
361 * OS_NO_ERR The desired bits have been set within the specified
362 * 'timeout'.
363 * OS_ERR_PEND_ISR If you tried to PEND from an ISR
364 * OS_FLAG_INVALID_PGRP If 'pgrp' is a NULL pointer.
365 * OS_ERR_EVENT_TYPE You are not pointing to an event flag group
366 * OS_TIMEOUT The bit(s) have not been set in the specified
367 * 'timeout'.
368 * OS_FLAG_ERR_WAIT_TYPE You didn't specify a proper 'wait_type' argument.
369 *
370 * Returns : The new state of the flags in the event flag group when the task is resumed or,
371 * 0 if a timeout or an error occurred.
372 *
373 * Called from: Task ONLY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -