当前位置: 首页 > article >正文

(学习日记)2024.03.16:UCOSIII第十八节:任务的删除

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。


点击此处进入学习日记的总目录

2024.03.16

  • 三十二、UCOSIII:任务的删除
    • 1、实现任务删除
    • 2、main()函数

三十二、UCOSIII:任务的删除

1、实现任务删除

任务删除函数OSTaskDel()函数用于删除一个指定的任务,也可以删除自身,在os_task.c中定义

#if OS_CFG_TASK_DEL_EN > 0u			//(1)
void  OSTaskDel (OS_TCB  *p_tcb,
                OS_ERR  *p_err)
{
    CPU_SR_ALLOC();

    /* 不允许删除空闲任务 */			//(2)
    if (p_tcb == &OSIdleTaskTCB)
    {
        *p_err = OS_ERR_TASK_DEL_IDLE;
         return;
    }

    /* 删除自己 */
    if (p_tcb == (OS_TCB *)0) 			//(3)
    {
        CPU_CRITICAL_ENTER();
        p_tcb  = OSTCBCurPtr;
        CPU_CRITICAL_EXIT();
    }

    OS_CRITICAL_ENTER();

    /* 根据任务的状态来决定删除的动作 */
    switch (p_tcb->TaskState)
    {
        case OS_TASK_STATE_RDY:			//(4)
        OS_RdyListRemove(p_tcb);
        break;

        case OS_TASK_STATE_SUSPENDED:			//(5)
        break;

        /* 任务只是在延时,并没有在任何等待列表*/
        case OS_TASK_STATE_DLY:			//(6)
        case OS_TASK_STATE_DLY_SUSPENDED:
                OS_TickListRemove(p_tcb);
        break;

        case OS_TASK_STATE_PEND:			//(7)
        case OS_TASK_STATE_PEND_SUSPENDED:
        case OS_TASK_STATE_PEND_TIMEOUT:
        case OS_TASK_STATE_PEND_TIMEOUT_SUSPENDED:
                OS_TickListRemove(p_tcb);

#if 0/* 目前我们还没有实现等待列表,暂时先把这部分代码注释 */
    /* 看看在等待什么 */
    switch (p_tcb->PendOn) {
        case OS_TASK_PEND_ON_NOTHING:
        /* 任务信号量和队列没有等待队列,直接退出 */
        case OS_TASK_PEND_ON_TASK_Q:
        case OS_TASK_PEND_ON_TASK_SEM:
        break;

        /* 从等待列表移除 */
        case OS_TASK_PEND_ON_FLAG:
        case OS_TASK_PEND_ON_MULTI:
        case OS_TASK_PEND_ON_MUTEX:
        case OS_TASK_PEND_ON_Q:
        case OS_TASK_PEND_ON_SEM:
                    OS_PendListRemove(p_tcb);
        break;

        default:
        break;
                }
        break;
        #endif
        default:
                OS_CRITICAL_EXIT();
                *p_err = OS_ERR_STATE_INVALID;
        return;
    }

    /* 初始化TCB为默认值 */
    OS_TaskInitTCB(p_tcb);			//(8)
    /* 修改任务的状态为删除态,即处于休眠 */
    p_tcb->TaskState = (OS_STATE)OS_TASK_STATE_DEL;			//(9)

    OS_CRITICAL_EXIT_NO_SCHED();
    /* 任务切换,寻找最高优先级的任务 */
    OSSched();(10)

    *p_err = OS_ERR_NONE;
}
#endif/* OS_CFG_TASK_DEL_EN > 0u */
  • (1):任务删除是一个可选功能,由OS_CFG_TASK_DEL_EN控制,该宏在os_cfg.h中定义。
  • (2):空闲任务不能被删除。系统必须至少有一个任务在运行,当没有其他用户任务运行的时候,系统就会运行空闲任务。
  • (3):删除自己。
  • (4):任务只在就绪态,则从就绪列表移除。
  • (5):任务只是被挂起,则退出返回,不用做什么。
  • (6):任务在延时或者是延时加挂起,则从时基列表移除。
  • (7):任务在多种状态,但只要有一种是等待状态,就需要从等待列表移除。如果任务等待是任务自身的信号量和消息, 则直接退出返回,因为任务信号量和消息是没有等待列表的。等待列表我们暂时还没实现,所以暂时将等待部分相关的代码用条件编译屏蔽掉。
  • (8):初始化TCB为默认值。
  • (9):修改任务的状态为删除态,即处于休眠。
  • (10):任务调度,寻找优先级最高的任务来运行。

2、main()函数

本章main()函数没有添加新的测试代码,只需理解章节内容即可。


http://www.kler.cn/a/274171.html

相关文章:

  • C语言-结构体内存大小
  • 24 go语言(golang) - gorm框架安装及使用案例详解
  • QT-基础-1-Qt 中的字符串处理与常见数据类型
  • 保护模式基本概念
  • 【C++】模板与泛型编程(一):定义模板,成员模板
  • JAVA HTTP压缩数据
  • 数据结构奇妙旅程之红黑树
  • 大语言模型(LLM)Token 概念
  • SpringBoot集成Jasypt实现敏感信息加密
  • python连接mysql数据库步骤
  • nfs介绍与配置
  • 2024年企业经济管理与大数据国际会议(ICEEMBD 2024)
  • 【React 】如何提高组件的渲染效率?在React中如何避免不必要的render?
  • CTF题型 SSTI(2) Flask-SSTI典型题巩固
  • 【代码】YOLOv8标注信息验证
  • Flutter 事件传递简单概述、事件冒泡、事件穿透
  • 第十三届蓝桥杯(C/C++ 大学B组)
  • easyexcel读和写excel
  • gitlab仓库使用流程(开发)
  • jQuery 常用API
  • 【考研数学】张宇各阶段用书详细指南
  • 【图解物联网】第2章 物联网的架构
  • ByteArrayOutputStream流
  • AMRT 3D 数字孪生引擎(轻量化图形引擎、GIS/BIM/3D融合引擎):智慧城市、智慧工厂、智慧建筑、智慧校园。。。
  • 电子科技大学链时代工作室招新题C语言部分---题号G
  • 精密星历解析