📄 os_flag.lst
字号:
389 00ee 8091 0000 lds r24,OSIntNesting
390 00f2 8823 tst r24
391 00f4 29F0 breq .L28
223:../OSsrc/os_flag.c **** *perr = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR
393 .LM53:
394 00f6 80E1 ldi r24,lo8(16)
395 00f8 8C93 st X,r24
224:../OSsrc/os_flag.c **** return ((OS_FLAG_GRP *)0);
397 .LM54:
398 00fa 60E0 ldi r22,lo8(0)
399 00fc 70E0 ldi r23,hi8(0)
400 00fe 1CC0 rjmp .L26
401 .L28:
225:../OSsrc/os_flag.c **** }
226:../OSsrc/os_flag.c **** OS_ENTER_CRITICAL();
403 .LM55:
404 /* #APP */
405 0100 F894 cli
227:../OSsrc/os_flag.c **** pgrp = OSFlagFreeList; /* Get next free event flag
407 .LM56:
408 /* #NOAPP */
409 0102 E091 0000 lds r30,OSFlagFreeList
410 0106 F091 0000 lds r31,(OSFlagFreeList)+1
228:../OSsrc/os_flag.c **** if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available
412 .LM57:
413 010a 3097 sbiw r30,0
414 010c 89F0 breq .L29
229:../OSsrc/os_flag.c **** /* Adjust free list
230:../OSsrc/os_flag.c **** OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
416 .LM58:
417 010e 8181 ldd r24,Z+1
418 0110 9281 ldd r25,Z+2
419 0112 9093 0000 sts (OSFlagFreeList)+1,r25
420 0116 8093 0000 sts OSFlagFreeList,r24
231:../OSsrc/os_flag.c **** pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type
422 .LM59:
423 011a 85E0 ldi r24,lo8(5)
424 011c 8083 st Z,r24
232:../OSsrc/os_flag.c **** pgrp->OSFlagFlags = flags; /* Set to desired initial value
426 .LM60:
427 011e 2383 std Z+3,r18
233:../OSsrc/os_flag.c **** pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags
429 .LM61:
430 0120 1282 std Z+2,__zero_reg__
431 0122 1182 std Z+1,__zero_reg__
234:../OSsrc/os_flag.c **** #if OS_FLAG_NAME_SIZE > 1
235:../OSsrc/os_flag.c **** pgrp->OSFlagName[0] = '?';
433 .LM62:
434 0124 8FE3 ldi r24,lo8(63)
435 0126 8483 std Z+4,r24
236:../OSsrc/os_flag.c **** pgrp->OSFlagName[1] = OS_ASCII_NUL;
437 .LM63:
438 0128 1582 std Z+5,__zero_reg__
237:../OSsrc/os_flag.c **** #endif
238:../OSsrc/os_flag.c **** OS_EXIT_CRITICAL();
440 .LM64:
441 /* #APP */
442 012a 7894 sei
239:../OSsrc/os_flag.c **** *perr = OS_ERR_NONE;
444 .LM65:
445 /* #NOAPP */
446 012c 1C92 st X,__zero_reg__
447 012e 03C0 rjmp .L30
448 .L29:
240:../OSsrc/os_flag.c **** } else {
241:../OSsrc/os_flag.c **** OS_EXIT_CRITICAL();
450 .LM66:
451 /* #APP */
452 0130 7894 sei
242:../OSsrc/os_flag.c **** *perr = OS_ERR_FLAG_GRP_DEPLETED;
454 .LM67:
455 /* #NOAPP */
456 0132 82E7 ldi r24,lo8(114)
457 0134 8C93 st X,r24
458 .L30:
243:../OSsrc/os_flag.c **** }
244:../OSsrc/os_flag.c **** return (pgrp); /* Return pointer to event flag group
460 .LM68:
461 0136 BF01 movw r22,r30
462 .L26:
245:../OSsrc/os_flag.c **** }
464 .LM69:
465 0138 CB01 movw r24,r22
466 /* epilogue: frame size=0 */
467 013a 0895 ret
468 /* epilogue end (size=1) */
469 /* function OSFlagCreate size 47 (46) */
474 .Lscope1:
479 .global OSFlagNameGet
481 OSFlagNameGet:
246:../OSsrc/os_flag.c ****
247:../OSsrc/os_flag.c **** /*$PAGE*/
248:../OSsrc/os_flag.c **** /*
249:../OSsrc/os_flag.c **** ***************************************************************************************************
250:../OSsrc/os_flag.c **** * DELETE AN EVENT FLAG GROUP
251:../OSsrc/os_flag.c **** *
252:../OSsrc/os_flag.c **** * Description: This function deletes an event flag group and readies all tasks pending on the event
253:../OSsrc/os_flag.c **** * group.
254:../OSsrc/os_flag.c **** *
255:../OSsrc/os_flag.c **** * Arguments : pgrp is a pointer to the desired event flag group.
256:../OSsrc/os_flag.c **** *
257:../OSsrc/os_flag.c **** * opt determines delete options as follows:
258:../OSsrc/os_flag.c **** * opt == OS_DEL_NO_PEND Deletes the event flag group ONLY if no task p
259:../OSsrc/os_flag.c **** * opt == OS_DEL_ALWAYS Deletes the event flag group even if tasks are
260:../OSsrc/os_flag.c **** * waiting. In this case, all the tasks pending
261:../OSsrc/os_flag.c **** * readied.
262:../OSsrc/os_flag.c **** *
263:../OSsrc/os_flag.c **** * perr is a pointer to an error code that can contain one of the following va
264:../OSsrc/os_flag.c **** * OS_ERR_NONE The call was successful and the event flag g
265:../OSsrc/os_flag.c **** * deleted
266:../OSsrc/os_flag.c **** * OS_ERR_DEL_ISR If you attempted to delete the event flag gr
267:../OSsrc/os_flag.c **** * an ISR
268:../OSsrc/os_flag.c **** * OS_ERR_FLAG_INVALID_PGRP If 'pgrp' is a NULL pointer.
269:../OSsrc/os_flag.c **** * OS_ERR_EVENT_TYPE If you didn't pass a pointer to an event fla
270:../OSsrc/os_flag.c **** * OS_ERR_INVALID_OPT An invalid option was specified
271:../OSsrc/os_flag.c **** * OS_ERR_TASK_WAITING One or more tasks were waiting on the event
272:../OSsrc/os_flag.c **** * group.
273:../OSsrc/os_flag.c **** *
274:../OSsrc/os_flag.c **** * Returns : pgrp upon error
275:../OSsrc/os_flag.c **** * (OS_EVENT *)0 if the event flag group was successfully deleted.
276:../OSsrc/os_flag.c **** *
277:../OSsrc/os_flag.c **** * Note(s) : 1) This function must be used with care. Tasks that would normally expect the prese
278:../OSsrc/os_flag.c **** * the event flag group MUST check the return code of OSFlagAccept() and OSFlagPend(
279:../OSsrc/os_flag.c **** * 2) This call can potentially disable interrupts for a long time. The interrupt disa
280:../OSsrc/os_flag.c **** * time is directly proportional to the number of tasks waiting on the event flag gr
281:../OSsrc/os_flag.c **** ***************************************************************************************************
282:../OSsrc/os_flag.c **** */
283:../OSsrc/os_flag.c ****
284:../OSsrc/os_flag.c **** #if OS_FLAG_DEL_EN > 0
285:../OSsrc/os_flag.c **** OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *perr)
286:../OSsrc/os_flag.c **** {
287:../OSsrc/os_flag.c **** BOOLEAN tasks_waiting;
288:../OSsrc/os_flag.c **** OS_FLAG_NODE *pnode;
289:../OSsrc/os_flag.c **** OS_FLAG_GRP *pgrp_return;
290:../OSsrc/os_flag.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status regis
291:../OSsrc/os_flag.c **** OS_CPU_SR cpu_sr = 0;
292:../OSsrc/os_flag.c **** #endif
293:../OSsrc/os_flag.c ****
294:../OSsrc/os_flag.c ****
295:../OSsrc/os_flag.c ****
296:../OSsrc/os_flag.c **** #if OS_ARG_CHK_EN > 0
297:../OSsrc/os_flag.c **** if (perr == (INT8U *)0) { /* Validate 'perr'
298:../OSsrc/os_flag.c **** return (pgrp);
299:../OSsrc/os_flag.c **** }
300:../OSsrc/os_flag.c **** if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp'
301:../OSsrc/os_flag.c **** *perr = OS_ERR_FLAG_INVALID_PGRP;
302:../OSsrc/os_flag.c **** return (pgrp);
303:../OSsrc/os_flag.c **** }
304:../OSsrc/os_flag.c **** #endif
305:../OSsrc/os_flag.c **** if (OSIntNesting > 0) { /* See if called from ISR ...
306:../OSsrc/os_flag.c **** *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR
307:../OSsrc/os_flag.c **** return (pgrp);
308:../OSsrc/os_flag.c **** }
309:../OSsrc/os_flag.c **** if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type
310:../OSsrc/os_flag.c **** *perr = OS_ERR_EVENT_TYPE;
311:../OSsrc/os_flag.c **** return (pgrp);
312:../OSsrc/os_flag.c **** }
313:../OSsrc/os_flag.c **** OS_ENTER_CRITICAL();
314:../OSsrc/os_flag.c **** if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event fla
315:../OSsrc/os_flag.c **** tasks_waiting = OS_TRUE; /* Yes
316:../OSsrc/os_flag.c **** } else {
317:../OSsrc/os_flag.c **** tasks_waiting = OS_FALSE; /* No
318:../OSsrc/os_flag.c **** }
319:../OSsrc/os_flag.c **** switch (opt) {
320:../OSsrc/os_flag.c **** case OS_DEL_NO_PEND: /* Delete group if no task waiting
321:../OSsrc/os_flag.c **** if (tasks_waiting == OS_FALSE) {
322:../OSsrc/os_flag.c **** #if OS_FLAG_NAME_SIZE > 1
323:../OSsrc/os_flag.c **** pgrp->OSFlagName[0] = '?'; /* Unknown name
324:../OSsrc/os_flag.c **** pgrp->OSFlagName[1] = OS_ASCII_NUL;
325:../OSsrc/os_flag.c **** #endif
326:../OSsrc/os_flag.c **** pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
327:../OSsrc/os_flag.c **** pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list
328:../OSsrc/os_flag.c **** pgrp->OSFlagFlags = (OS_FLAGS)0;
329:../OSsrc/os_flag.c **** OSFlagFreeList = pgrp;
330:../OSsrc/os_flag.c **** OS_EXIT_CRITICAL();
331:../OSsrc/os_flag.c **** *perr = OS_ERR_NONE;
332:../OSsrc/os_flag.c **** pgrp_return = (OS_FLAG_GRP *)0; /* Event Flag Group has been deleted
333:../OSsrc/os_flag.c **** } else {
334:../OSsrc/os_flag.c **** OS_EXIT_CRITICAL();
335:../OSsrc/os_flag.c **** *perr = OS_ERR_TASK_WAITING;
336:../OSsrc/os_flag.c **** pgrp_return = pgrp;
337:../OSsrc/os_flag.c **** }
338:../OSsrc/os_flag.c **** break;
339:../OSsrc/os_flag.c ****
340:../OSsrc/os_flag.c **** case OS_DEL_ALWAYS: /* Always delete the event flag group
341:../OSsrc/os_flag.c **** pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
342:../OSsrc/os_flag.c **** while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags
343:../OSsrc/os_flag.c **** (void)OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
344:../OSsrc/os_flag.c **** pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
345:../OSsrc/os_flag.c **** }
346:../OSsrc/os_flag.c **** #if OS_FLAG_NAME_SIZE > 1
347:../OSsrc/os_flag.c **** pgrp->OSFlagName[0] = '?'; /* Unknown name
348:../OSsrc/os_flag.c **** pgrp->OSFlagName[1] = OS_ASCII_NUL;
349:../OSsrc/os_flag.c **** #endif
350:../OSsrc/os_flag.c **** pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
351:../OSsrc/os_flag.c **** pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list
352:../OSsrc/os_flag.c **** pgrp->OSFlagFlags = (OS_FLAGS)0;
353:../OSsrc/os_flag.c **** OSFlagFreeList = pgrp;
354:../OSsrc/os_flag.c **** OS_EXIT_CRITICAL();
355:../OSsrc/os_flag.c **** if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiti
356:../OSsrc/os_flag.c **** OS_Sched(); /* Find highest priority task ready to r
357:../OSsrc/os_flag.c **** }
358:../OSsrc/os_flag.c **** *perr = OS_ERR_NONE;
359:../OSsrc/os_flag.c **** pgrp_return = (OS_FLAG_GRP *)0; /* Event Flag Group has been deleted
360:../OSsrc/os_flag.c **** break;
361:../OSsrc/os_flag.c ****
362:../OSsrc/os_flag.c **** default:
363:../OSsrc/os_flag.c **** OS_EXIT_CRITICAL();
364:../OSsrc/os_flag.c **** *perr = OS_ERR_INVALID_OPT;
365:../OSsrc/os_flag.c **** pgrp_return = pgrp;
366:../OSsrc/os_flag.c **** break;
367:../OSsrc/os_flag.c **** }
368:../OSsrc/os_flag.c **** return (pgrp_return);
369:../OSsrc/os_flag.c **** }
370:../OSsrc/os_flag.c **** #endif
371:../OSsrc/os_flag.c **** /*$PAGE*/
372:../OSsrc/os_flag.c **** /*
373:../OSsrc/os_flag.c **** ***************************************************************************************************
374:../OSsrc/os_flag.c **** * GET THE NAME OF AN EVENT FLAG GROUP
375:../OSsrc/os_flag.c **** *
376:../OSsrc/os_flag.c **** * Description: This function is used to obtain the name assigned to an event flag group
377:../OSsrc/os_flag.c **** *
378:../OSsrc/os_flag.c **** * Arguments : pgrp is a pointer to the event flag group.
379:../OSsrc/os_flag.c **** *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -