ucos-ii 之OSTaskDel函数

简介: #if OS_TASK_DEL_EN > 0INT8U OSTaskDel (INT8U prio){#if OS_CRITICAL_METHOD == 3             ...

#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           

 

目录
相关文章
|
5月前
|
人工智能 关系型数据库 MySQL
《深度探秘:解锁开源社区中MySQL与AI集成的资源宝库》
在数据管理与AI融合的前沿领域,MySQL与AI的集成成为开发者和数据科学家关注的焦点。开源社区作为技术爱好者的智慧殿堂,提供了丰富的支持与资源。本文从开源社区的活力生态出发,探讨如何通过专业论坛、代码托管平台及技术博客精准获取资源,并通过深度参与社区互动、筛选整合优质内容,构建个人知识体系。掌握这些方法,不仅能提升技术能力,还能推动MySQL与AI集成在实际项目中的创新应用,为数据驱动的未来贡献力量。
154 26
|
11月前
|
负载均衡 应用服务中间件 网络安全
docker swarm添加更多的服务
【10月更文挑战第16天】
126 6
|
11月前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
221 5
|
应用服务中间件 nginx
nginx配置https和直接访问静态文件的方式
nginx配置https和直接访问静态文件的方式
351 3
|
网络协议 网络安全
使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端
使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端
914 0
|
SQL 关系型数据库 MySQL
MySQL数据库常见报错案例与错误代码说明
MySQL数据库常见报错案例与错误代码说明
988 0
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
1107 0
|
关系型数据库 MySQL Linux
【mysql】MySql主从复制,从原理到实践!
【mysql】MySql主从复制,从原理到实践!
425 0
|
机器学习/深度学习 数据挖掘 PyTorch
使用Python实现长短时记忆网络(LSTM)的博客教程
使用Python实现长短时记忆网络(LSTM)的博客教程
1639 0
|
人工智能 关系型数据库 分布式数据库