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

Freertos系列教学(删除函数的使用)

如果不想看的可以直接使用git把我的代码下载出来,里面工程挺全的,后期会慢慢的补注释之类的

码云地址:stm32学习笔记: stm32学习笔记源码

如果不会使用git快速下载可以选择直接下载压缩包或者去看看git的使用

Git入门教程-CSDN博客

目录

一 函数讲解

二 删除任务的流程​编辑

三 实际测试

3.1 中断直接删除其他任务

3.2 通过任务2来删除任务1

3.3 通过计数删除本身


一 函数讲解

函数说明:vTaskDelete 传入任务句柄即可,如果要删除本身填写NULL即可,任务会在任务执行结束后删除本身。

二 删除任务的流程

宏INCLUDE_vTaskDelete 配置为 1将 INCLUDE_vTaskDelete 定义为 1,就可以使用 vTaskDelete 函数来删除任务。

内部流程:获取要删除的任务控制块->将传入的任务移除所在列表->判断要删除的任务是其他任务还是本身,如果是其他任务就删除,如果是本身则需要添加到等待列表,之后再空闲任务执行删除->最后更新阻塞时间,方式下一个任务是被删除任务导致死机

三 实际测试

3.1 中断直接删除其他任务

PS:函数的整体在前面一章创建函数内有,这里直接只讲删除任务了哦。

首先我们粘贴一个按钮的驱动:这里使用按键去删除一个任务(在操作系统中,中断一般只发送信号量,不去处理复杂的程序,我们这里只是因为做测试使用了一下问题不大,后面到了信号量之类的会用到中断之类的)

移植按钮中断驱动大家应该都会把= =这里就不加赘述了哦。

任务还是之前两个:

void task1( void * pvParameters )
{while (1){printf("task 1\r\n");vTaskDelay(pdMS_TO_TICKS(500));}
}void task2( void * pvParameters )
{while (1){printf("task 2\r\n");vTaskDelay(pdMS_TO_TICKS(500));}
}

这里使用中断的方式直接删除

void KEY1_IRQHandler(void)
{//确保是否产生了EXTI Line中断if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) {taskENTER_CRITICAL();vTaskDelete(task2_handler);taskEXIT_CRITICAL();//清除中断标志位EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     }  
}

为了避免在删除任务过程中出现数据不一致或其他竞态条件(中断被更高优先级的任务打断),先进入临界区。在 FreeRTOS 中可以使用 taskENTER_CRITICAL() 来实现,不担心被高优先级的打断可以不进入临界区。

中断完成后,在退出临界区

看看正常运行的效果

之后我们按下按钮任务直接被删除了

3.2 通过任务2来删除任务1

代码如下:

通过计数来删除任务1,这里需要注意,我们需要判断task1handler不为空,如果为空还去删除它,我们的程序会死机的。

void task1( void * pvParameters )
{while (1){printf("task 1\r\n");vTaskDelay(pdMS_TO_TICKS(500));}
}void task2( void * pvParameters )
{u8 i=0;while (1){printf("task 2\r\n");i++;// 只在 task1 未被删除时执行删除操作if (task1_handler != NULL && i==10) {vTaskDelete(task1_handler);task1_handler = NULL;  // 标记句柄失效,避免重复删除}vTaskDelay(pdMS_TO_TICKS(500));}
}

可以看出来,我们的任务会被正常删除:那么如果我们一直让task2运行不去释放CPU,并且在task2中删除自己,能够成功吗?

3.3 通过计数删除本身

不释放CPU

void task2( void * pvParameters )
{u8 i=0;u32 j=0;while (1){printf("task 2\r\n");i++;for(j=0;j<10000000;j++){}// 只在 task1 未被删除时执行删除操作if (task2_handler != NULL && i==10) {vTaskDelete(NULL);task1_handler = NULL;  // 标记句柄失效,避免重复删除}//vTaskDelay(pdMS_TO_TICKS(500));}
}

这里很明显:task2被成功删除了,之前说过,任务删除会在任务结束后进行,那么我们这里任务明明没有释放CPU也被删除了,是delete直接终止了任务吗?

测试一下:

void task2( void * pvParameters )
{u8 i=0;u32 j=0;while (1){printf("task 2\r\n");i++;// 只在 task1 未被删除时执行删除操作if (task2_handler != NULL && i==10) {vTaskDelete(NULL);task1_handler = NULL;  // 标记句柄失效,避免重复删除}printf("task 11111\r\n");vTaskDelay(pdMS_TO_TICKS(500));}
}

这里正常打印应该是2 11111 1  之后删除掉task2   这里删除之前只打印出来了2  删除任务2  1

很明显,这里任务直接没了:所以说在调用函数的时候任务直接被删除了,但是内存会在任务结束之后有空闲任务去清除。这里看看官方文档。这里没有明说,但是确实是调用之后,就被从所有的列表删除掉了。

http://www.dtcms.com/a/389504.html

相关文章:

  • DevOps平台建设 - 总体设计文档的核心架构与关键技术实践
  • 系统中间件与云虚拟化-云数据库与数据库访问中间件ORM框架-Sannic-非实验
  • DTC BluSDR™系列-满足您所有的无人机通信需求
  • 【猛犸AI科技】深度强化学习SCI/EI/CCF/中文核心一站式辅导
  • 美创科技闪耀亚洲教育装备博览会,以数据安全护航教育数字化
  • 1.css的几种定位方式
  • 【C#】对比两个坐标点是否相同的多种方法
  • Ubuntu之旅-03 InfluxDB
  • IEEE出版,稳定检索!|2025年智能制造、机器人与自动化国际学术会议 (IMRA 2025)
  • iOS 上架流程详细指南 苹果应用发布步骤、ipa 文件上传 打包上架实战经验
  • MessageBus 通信组件库
  • 性能测试-jmeter12-万能插件包管理器jmeter-plugins
  • 工地项目管理系统有什么强大功能?工程企业实现数字化的步骤
  • 【开题答辩全过程】以 “萌崽”宠物社交小程序为例,包含答辩的问题和答案
  • Spring Cloud Alibaba微服务架构深度解析:基于Nacos、Gateway、OpenFeign与Sentinel的现代化实践
  • 大模型-Attention面试
  • Hadoop3.3.5搭建指南(简约版)
  • Python运算符与表达式
  • “双碳”目标下,塔能科技如何用“物联网精准节能”重塑城市能源生态?
  • 格恩朗气体涡轮流量计:精准计量每一方气,守护能源高效利用
  • 从感知机到多层感知机:深度学习入门核心知识解析
  • 从Java ArrayList 学习泛型设计
  • 【Amber报错1】 Amber/Miniconda 与系统 Bash 的 libtinfo.so.6冲突
  • AI智慧能力的核心引擎,自注意力机制
  • 35、模型量化与压缩实践
  • LeetCode 16.最接近的三数之和
  • 深入解析Redis集群模式:构建高可用与可扩展的缓存系统
  • 小麦病害检测识别数据集:1k图像,4类,yolo标注
  • Python读取excel表格并写入数据库
  • 【LeetCode 每日一题】1317. 将整数转换为两个无零整数的和