📄 os_task.lst
字号:
370:os/source/os_task.c ****
371:os/source/os_task.c **** if (OSIntNesting > 0) { /* See if trying to delete from ISR
372:os/source/os_task.c **** return (OS_TASK_DEL_ISR);
373:os/source/os_task.c **** }
374:os/source/os_task.c **** #if OS_ARG_CHK_EN > 0
375:os/source/os_task.c **** if (prio == OS_IDLE_PRIO) { /* Not allowed to delete idle task
376:os/source/os_task.c **** return (OS_TASK_DEL_IDLE);
377:os/source/os_task.c **** }
378:os/source/os_task.c **** if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ?
379:os/source/os_task.c **** return (OS_PRIO_INVALID);
380:os/source/os_task.c **** }
381:os/source/os_task.c **** #endif
382:os/source/os_task.c **** OS_ENTER_CRITICAL();
383:os/source/os_task.c **** if (prio == OS_PRIO_SELF) { /* See if requesting to delete self
384:os/source/os_task.c **** prio = OSTCBCur->OSTCBPrio; /* Set priority to delete to curren
385:os/source/os_task.c **** }
386:os/source/os_task.c **** if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) { /* Task to delete must exist
387:os/source/os_task.c **** if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) { /* Make task not ready
388:os/source/os_task.c **** OSRdyGrp &= ~ptcb->OSTCBBitY;
389:os/source/os_task.c **** }
390:os/source/os_task.c **** #if OS_EVENT_EN > 0
391:os/source/os_task.c **** pevent = ptcb->OSTCBEventPtr;
392:os/source/os_task.c **** if (pevent != (OS_EVENT *)0) { /* If task is waiting on event
393:os/source/os_task.c **** if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* ... remove task f
394:os/source/os_task.c **** pevent->OSEventGrp &= ~ptcb->OSTCBBitY; /* ... event ctrl bl
395:os/source/os_task.c **** }
396:os/source/os_task.c **** }
397:os/source/os_task.c **** #endif
398:os/source/os_task.c **** #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
399:os/source/os_task.c **** pnode = ptcb->OSTCBFlagNode;
400:os/source/os_task.c **** if (pnode != (OS_FLAG_NODE *)0) { /* If task is waiting on event flag
401:os/source/os_task.c **** OS_FlagUnlink(pnode); /* Remove from wait list
402:os/source/os_task.c **** }
403:os/source/os_task.c **** #endif
404:os/source/os_task.c **** ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from updati
405:os/source/os_task.c **** ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed
406:os/source/os_task.c **** if (OSLockNesting < 255) {
407:os/source/os_task.c **** OSLockNesting++;
408:os/source/os_task.c **** }
409:os/source/os_task.c **** OS_EXIT_CRITICAL(); /* Enabling INT. ignores next instr
410:os/source/os_task.c **** OS_Dummy(); /* ... Dummy ensures that INTs will
411:os/source/os_task.c **** OS_ENTER_CRITICAL(); /* ... disabled HERE!
412:os/source/os_task.c **** if (OSLockNesting > 0) {
413:os/source/os_task.c **** OSLockNesting--;
414:os/source/os_task.c **** }
415:os/source/os_task.c **** OSTaskDelHook(ptcb); /* Call user defined hook
416:os/source/os_task.c **** OSTaskCtr--; /* One less task being managed
417:os/source/os_task.c **** OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Clear old priority entry
418:os/source/os_task.c **** if (ptcb->OSTCBPrev == (OS_TCB *)0) { /* Remove from TCB chain
419:os/source/os_task.c **** ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
420:os/source/os_task.c **** OSTCBList = ptcb->OSTCBNext;
421:os/source/os_task.c **** } else {
422:os/source/os_task.c **** ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
423:os/source/os_task.c **** ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
424:os/source/os_task.c **** }
425:os/source/os_task.c **** ptcb->OSTCBNext = OSTCBFreeList; /* Return TCB to free TCB list
426:os/source/os_task.c **** OSTCBFreeList = ptcb;
427:os/source/os_task.c **** OS_EXIT_CRITICAL();
428:os/source/os_task.c **** OS_Sched(); /* Find new highest priority task
429:os/source/os_task.c **** return (OS_NO_ERR);
430:os/source/os_task.c **** }
431:os/source/os_task.c **** OS_EXIT_CRITICAL();
432:os/source/os_task.c **** return (OS_TASK_DEL_ERR);
433:os/source/os_task.c **** }
434:os/source/os_task.c **** #endif
435:os/source/os_task.c **** /*$PAGE*/
436:os/source/os_task.c **** /*
437:os/source/os_task.c **** ***************************************************************************************************
438:os/source/os_task.c **** * REQUEST THAT A TASK DELETE ITSELF
439:os/source/os_task.c **** *
440:os/source/os_task.c **** * Description: This function is used to:
441:os/source/os_task.c **** * a) notify a task to delete itself.
442:os/source/os_task.c **** * b) to see if a task requested that the current task delete itself.
443:os/source/os_task.c **** * This function is a little tricky to understand. Basically, you have a task that nee
444:os/source/os_task.c **** * to be deleted however, this task has resources that it has allocated (memory buffers
445:os/source/os_task.c **** * semaphores, mailboxes, queues etc.). The task cannot be deleted otherwise these
446:os/source/os_task.c **** * resources would not be freed. The requesting task calls OSTaskDelReq() to indicate
447:os/source/os_task.c **** * the task needs to be deleted. Deleting of the task is however, deferred to the task
448:os/source/os_task.c **** * be deleted. For example, suppose that task #10 needs to be deleted. The requesting
449:os/source/os_task.c **** * example, task #5, would call OSTaskDelReq(10). When task #10 gets to execute, it ca
450:os/source/os_task.c **** * this function by specifying OS_PRIO_SELF and monitors the returned value. If the re
451:os/source/os_task.c **** * value is OS_TASK_DEL_REQ, another task requested a task delete. Task #10 would look
452:os/source/os_task.c **** * this:
453:os/source/os_task.c **** *
454:os/source/os_task.c **** * void Task(void *data)
455:os/source/os_task.c **** * {
456:os/source/os_task.c **** * .
457:os/source/os_task.c **** * .
458:os/source/os_task.c **** * while (1) {
459:os/source/os_task.c **** * OSTimeDly(1);
460:os/source/os_task.c **** * if (OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ) {
461:os/source/os_task.c **** * Release any owned resources;
462:os/source/os_task.c **** * De-allocate any dynamic memory;
463:os/source/os_task.c **** * OSTaskDel(OS_PRIO_SELF);
464:os/source/os_task.c **** * }
465:os/source/os_task.c **** * }
466:os/source/os_task.c **** * }
467:os/source/os_task.c **** *
468:os/source/os_task.c **** * Arguments : prio is the priority of the task to request the delete from
469:os/source/os_task.c **** *
470:os/source/os_task.c **** * Returns : OS_NO_ERR if the task exist and the request has been registered
471:os/source/os_task.c **** * OS_TASK_NOT_EXIST if the task has been deleted. This allows the caller to know whe
472:os/source/os_task.c **** * the request has been executed.
473:os/source/os_task.c **** * OS_TASK_DEL_IDLE if you requested to delete uC/OS-II's idle task
474:os/source/os_task.c **** * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
475:os/source/os_task.c **** * (i.e. >= OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.
476:os/source/os_task.c **** * OS_TASK_DEL_REQ if a task (possibly another task) requested that the running task
477:os/source/os_task.c **** * deleted.
478:os/source/os_task.c **** ***************************************************************************************************
479:os/source/os_task.c **** */
480:os/source/os_task.c **** /*$PAGE*/
481:os/source/os_task.c **** #if OS_TASK_DEL_EN > 0
482:os/source/os_task.c **** INT8U OSTaskDelReq (INT8U prio)
483:os/source/os_task.c **** {
484:os/source/os_task.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
485:os/source/os_task.c **** OS_CPU_SR cpu_sr;
486:os/source/os_task.c **** #endif
487:os/source/os_task.c **** BOOLEAN stat;
488:os/source/os_task.c **** INT8U err;
489:os/source/os_task.c **** OS_TCB *ptcb;
490:os/source/os_task.c ****
491:os/source/os_task.c ****
492:os/source/os_task.c **** #if OS_ARG_CHK_EN > 0
493:os/source/os_task.c **** if (prio == OS_IDLE_PRIO) { /* Not allowed to delete idle task
494:os/source/os_task.c **** return (OS_TASK_DEL_IDLE);
495:os/source/os_task.c **** }
496:os/source/os_task.c **** if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ?
497:os/source/os_task.c **** return (OS_PRIO_INVALID);
498:os/source/os_task.c **** }
499:os/source/os_task.c **** #endif
500:os/source/os_task.c **** if (prio == OS_PRIO_SELF) { /* See if a task is requesting to .
501:os/source/os_task.c **** OS_ENTER_CRITICAL(); /* ... this task to delete itself
502:os/source/os_task.c **** stat = OSTCBCur->OSTCBDelReq; /* Return request status to caller
503:os/source/os_task.c **** OS_EXIT_CRITICAL();
504:os/source/os_task.c **** return (stat);
505:os/source/os_task.c **** }
506:os/source/os_task.c **** OS_ENTER_CRITICAL();
507:os/source/os_task.c **** if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) { /* Task to delete must exist
508:os/source/os_task.c **** ptcb->OSTCBDelReq = OS_TASK_DEL_REQ; /* Set flag indicating task to be D
509:os/source/os_task.c **** err = OS_NO_ERR;
510:os/source/os_task.c **** } else {
511:os/source/os_task.c **** err = OS_TASK_NOT_EXIST; /* Task must be deleted
512:os/source/os_task.c **** }
513:os/source/os_task.c **** OS_EXIT_CRITICAL();
514:os/source/os_task.c **** return (err);
515:os/source/os_task.c **** }
516:os/source/os_task.c **** #endif
517:os/source/os_task.c **** /*$PAGE*/
518:os/source/os_task.c **** /*
519:os/source/os_task.c **** ***************************************************************************************************
520:os/source/os_task.c **** * RESUME A SUSPENDED TASK
521:os/source/os_task.c **** *
522:os/source/os_task.c **** * Description: This function is called to resume a previously suspended task. This is the only cal
523:os/source/os_task.c **** * will remove an explicit task suspension.
524:os/source/os_task.c **** *
525:os/source/os_task.c **** * Arguments : prio is the priority of the task to resume.
526:os/source/os_task.c **** *
527:os/source/os_task.c **** * Returns : OS_NO_ERR if the requested task is resumed
528:os/source/os_task.c **** * OS_PRIO_INVALID if the priority you specify is higher that the maximum allo
529:os/source/os_task.c **** * (i.e. >= OS_LOWEST_PRIO)
530:os/source/os_task.c **** * OS_TASK_RESUME_PRIO if the task to resume does not exist
531:os/source/os_task.c **** * OS_TASK_NOT_SUSPENDED if the task to resume has not been suspended
532:os/source/os_task.c **** ***************************************************************************************************
533:os/source/os_task.c **** */
534:os/source/os_task.c ****
535:os/source/os_task.c **** #if OS_TASK_SUSPEND_EN > 0
536:os/source/os_task.c **** INT8U OSTaskResume (INT8U prio)
537:os/source/os_task.c **** {
538:os/source/os_task.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
539:os/source/os_task.c **** OS_CPU_SR cpu_sr;
540:os/source/os_task.c **** #endif
541:os/source/os_task.c **** OS_TCB *ptcb;
542:os/source/os_task.c ****
543:os/source/os_task.c ****
544:os/source/os_task.c **** #if OS_ARG_CHK_EN > 0
545:os/source/os_task.c **** if (prio >= OS_LOWEST_PRIO) { /* Make sure task priority is valid
546:os/source/os_task.c **** return (OS_PRIO_INVALID);
547:os/source/os_task.c **** }
548:os/source/os_task.c **** #endif
549:os/source/os_task.c **** OS_ENTER_CRITICAL();
550:os/source/os_task.c **** if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) { /* Task to suspend must exist
551:os/source/os_task.c **** OS_EXIT_CRITICAL();
552:os/source/os_task.c **** return (OS_TASK_RESUME_PRIO);
553:os/source/os_task.c **** }
554:os/source/os_task.c **** if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != 0x00) { /* Task must be suspende
555:os/source/os_task.c **** if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) && /* Remove suspension
556:os/source/os_task.c **** (ptcb->OSTCBDly == 0)) { /* Must not be delayed
557:os/source/os_task.c **** OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to ru
558:os/source/os_task.c **** OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
559:os/source/os_task.c **** OS_EXIT_CRITICAL();
560:os/source/os_task.c **** OS_Sched();
561:os/source/os_task.c **** } else {
562:os/source/os_task.c **** OS_EXIT_CRITICAL();
563:os/source/os_task.c **** }
564:os/source/os_task.c **** return (OS_NO_ERR);
565:os/source/os_task.c **** }
566:os/source/os_task.c **** OS_EXIT_CRITICAL();
567:os/source/os_task.c **** return (OS_TASK_NOT_SUSPENDED);
568:os/source/os_task.c **** }
569:os/source/os_task.c **** #endif
570:os/source/os_task.c **** /*$PAGE*/
571:os/source/os_task.c **** /*
572:os/source/os_task.c **** ***************************************************************************************************
573:os/source/os_task.c **** * STACK CHECKING
574:os/source/os_task.c **** *
575:os/source/os_task.c **** * Description: This function is called to check the amount of free memory left on the specified tas
576:os/source/os_task.c **** * stack.
577:os/source/os_task.c **** *
578:os/source/os_task.c **** * Arguments : prio is the task priority
579:os/source/os_task.c **** *
580:os/source/os_task.c **** * pdata is a pointer to a data structure of type OS_STK_DATA.
581:os/source/os_task.c **** *
582:os/source/os_task.c **** * Returns : OS_NO_ERR upon success
583:os/source/os_task.c **** * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
584:os/source/os_task.c **** * (i.e. > OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.
585:os/source/os_task.c **** * OS_TASK_NOT_EXIST if the desired task has not been created
586:os/source/os_task.c **** * OS_TASK_OPT_ERR if you did NOT specified OS_TASK_OPT_STK_CHK when the task was c
587:os/source/os_task.c **** ***************************************************************************************************
588:os/source/os_task.c **** */
589:os/source/os_task.c **** #if OS_TASK_CREATE_EXT_EN > 0
590:os/source/os_task.c **** INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata)
591:os/source/os_task.c **** {
797 .LM79:
798 /* prologue: frame size=0 */
799 0324 CF93 push r28
800 0326 DF93 push r29
8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -