ucos-ii 之OSTaskDel函数

#if OS_TASK_DEL_EN > 0

INT8U OSTaskDel (INT8U prio)

{

#if OS_CRITICAL_METHOD == 3                 

    OS_CPU_SR     cpu_sr;

#endif

#if OS_EVENT_EN > 0

    OS_EVENT     *pevent;

#endif   

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)

    OS_FLAG_NODE *pnode;

#endif

    OS_TCB       *ptcb;

(说明:OSIntNesting用来记录是否有中断服务程序正在运行。OSIntNesting0表示没有,非0数表示有中断在运行。则返回OS_TASK_DEL_ISR

if (OSIntNesting > 0) {                         

        return (OS_TASK_DEL_ISR);

    }

#if OS_ARG_CHK_EN > 0

(说明:以下是对优先级的各种可能情况作判断)

    if (prio == OS_IDLE_PRIO) {                         //不能删除空闲任务

    return (OS_TASK_DEL_IDLE);

    }

if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { //非法的优先级

        return (OS_PRIO_INVALID);

    }

#endif

    OS_ENTER_CRITICAL();

if (prio == OS_PRIO_SELF) {                              

        prio = OSTCBCur->OSTCBPrio;      //获得当前任务的优先级的值

}

//就绪表删除任务

if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) {         

        if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) {

            OSRdyGrp &= ~ptcb->OSTCBBitY;

        }

(说明:以下是对事件控制块的操作,会在以后的章节介绍)

#if OS_EVENT_EN > 0

        pevent = ptcb->OSTCBEventPtr;

        if (pevent != (OS_EVENT *)0) {                          /* If task is waiting on event         */

            if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* ... remove task from */

                pevent->OSEventGrp &= ~ptcb->OSTCBBitY;                        /* ... event ctrl block */

            }

        }

#endif

(说明:以下是对事件标志结点的操作,以后的章节会介绍)

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)

        pnode = ptcb->OSTCBFlagNode;

        if (pnode != (OS_FLAG_NODE *)0) {                     

            OS_FlagUnlink(pnode);                             

        }

#endif                                                             

(说明:OSTCBDlyTCB控制块的元素。当需要把任务延时若干时钟节拍时,或者需要把任务挂起一段时间以等待某事件的发生时,须用到这个变量。表示任务允许等待事件发生的最多时钟节拍数。如果为0,表示任务不延时或者表示等待事件发生的时间没有限制。OSTCBStat表示任务的状态。OS_STAT_RDY表示就绪状态。可以设置的各种状态可以参见P79-4-2

        ptcb->OSTCBDly = 0;                                   //延时设置为0

        ptcb->OSTCBStat = OS_STAT_RDY;                        //状态设置为就绪

(说明:为了用户可对调度器的工作进行控制,提供了两个系统函数OSSchedLock()OSSchedUnlock()。前者实现的功能是为调度器上锁,后者的作用是位调度器解锁。OSLockNesting为全局变量。加锁时,OSLockNesting1,解锁时,OS LockNesting-1。每次调度器在判断是否进行调度时,查看OSLockNesting的值是否为0,非0则不能调度)

              if (OSLockNesting < 255) {

            OSLockNesting++;

              }

(说明:为了尽量减少中断的执行时间,在这里开中断。可以使其他任务执行)

      OS_EXIT_CRITICAL();                                 //关中断

(说明:OS_Dummy()没有进行实质性的操作。目的是保证处理器在中断开着的情况下至少执行一条指令。许多处理器开中断后,CPU会强制执行下一条指令,然后才开中断。也就是说,直到执行完下一条指令后,才会真正开中断。)

        OS_Dummy();                                          

        OS_ENTER_CRITICAL();                                //开中断

               if (OSLockNesting > 0) {

            OSLockNesting--;

                 }

        OSTaskDelHook(ptcb);                               //调用OSTaskDelHook(),实行用户删除时的处理

        OSTaskCtr--;                                        //任务计数器-1

(说明:以下实现删除任务控制块。需要修改的包括:OSTCBPrioTbl[prio]OSTCBNextOSTCBPrevOSTCBFreeListOSTCBList)

        OSTCBPrioTbl[prio] = (OS_TCB *)0;                   

        if (ptcb->OSTCBPrev == (OS_TCB *)0) {                 

            ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;

            OSTCBList                  = ptcb->OSTCBNext;

        } else {

            ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;

            ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;

        }

        ptcb->OSTCBNext = OSTCBFreeList;                       

        OSTCBFreeList   = ptcb;

        OS_EXIT_CRITICAL();

        OS_Sched();                              //任务调度,找到新的最高优先级任务

        return (OS_NO_ERR);

    }

    OS_EXIT_CRITICAL();

    return (OS_TASK_DEL_ERR);

}

#endif           

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于UCOSII实时操作系统 第一讲 初识uCOSII 4 1、uCOSII任务实验: 4 2、uCOSII任务实验: 6 3、任务状态之间的转换: 9 4、空闲任务和统计任务简介: 9 5、任务的三要件: 9 程序代码、私有堆栈、任务控制块 9 6、任务控制块TCB(P80) 9 7、创建任务 9 8、任务的栈空间 10 9、栈的增长方向: 10 第二讲 调度运行机制 11 1、任务挂起和恢复 11 2、任务挂起、恢复的状态转换 13 3、时钟节拍ISR 15 4、时钟节拍函数OSTimtick() 16 5、延时系统调用 16 第三讲 任务管理uCOSII 17 1、任务删除 17 2、任务请求删除实验 19 3、在源码中增加打印信息一般步骤 24 4、OSTaskDelReq()函数理解流程图 25 第四讲 互斥性信号量管理 26 1、优先级反转 26 2、信号量SEM使用 26 3、互斥信号量Mutux使用 29 4、关于信号量程序分析 32 5、关于互斥信号量分析 32 6、OSMutexPend()函数流程图 33 7、OSMutexPost()函数流程图 33 第五讲 消息邮箱 34 1、基本概念 34 2、对于OSMboxPend()理解 34 3、对于OSMboxPost()理解 34 4、消息邮箱管理一般程序 35 5、使用OSMboxQuery() 38 6、OSMboxPend()函数Timeout等待超时程序 38 7、OSMboxPost()函数邮箱状态为FUll程序 40 8、关于OSTimeTickHook(void)使用 41 第六讲 信号量集 43 1、信号量集案例 43 2、OSFlagPend()源码 46 3、OSFlagPost()源码 51 第七讲 动态内存 54 1、内存管理基本概念 54 2、内存管理基本概念 54 3、内存管理案例 54 4、案例分析 69 5、教学案例: 71
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值