利用STM32CubeMX和keil模拟器,3天入门FreeRTOS(2.0) —— 如何删除任务

前言

(1)FreeRTOS是我一天过完的,由此回忆并且记录一下。个人认为,如果只是入门,利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后,再去学习网上的一些其他课程也许会简单很多。
(2)本系列课程是使用的keil软件仿真平台,所以对于没有开发板的同学也可也进行学习。
(3)叠甲,再次强调,本系列课程仅仅用于入门。学习完之后建议还要再去寻找其他课程加深理解。
(4)本系列博客对应代码仓库:
(5)前面我们已经了解了如何创建任务,但是,如果有些任务我们并不是要一直执行,可能要根据情况进行删除任务。那么本文将会介绍如何如何对任务进行删除,但是需要注意,一般情况,删除任务用到少。因为任务自杀要考虑的方面很多,容易出问题,所以新手小白建议了解即可。

实战

(1)任务删除是非常简单的,但是他需要考虑很多问题,所以我不建议新手小白频繁的删除和创建任务。但是,为了保证知识的完整性,我依旧会对此进行讲解。
(2)在上一篇博客的工程基础上进行调整。

在这里插入图片描述

删除任务要注意的宏定义

(1)如果需要调用删除任务的函数,需要在FreeRTOSConfig.h文件种确认INCLUDE_vTaskDelete这个宏被置1了。

在这里插入图片描述

删除任务

(1)首先,我打算使用让GPIOC14引脚作为任务创建删除的控制引脚,因此需要在STM32CubeMX中将这个引脚设置为下拉输入。

在这里插入图片描述

(2)在StartCubemxTask函数中进行如下补充即可。(按Ctrl+F搜索StartCubemxTask即可找到任务函数)

void StartCubemxTask(void *argument)
{
  /* USER CODE BEGIN StartCubemxTask */
	char *CubemxTaskPrintf = (char *)argument;
	uint8_t Task_Status = 0;
  /* Infinite loop */
  for(;;)
  {
		if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14) == GPIO_PIN_SET)
		{
			printf(CubemxTaskPrintf);
			Task_Status++;
			while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14) == GPIO_PIN_SET);
		}
		switch(Task_Status)
		{
			case 1:
				if(keilTaskHandle != NULL)
				{
					// 删除 keilTask 任务
					vTaskDelete(keilTaskHandle);			
					keilTaskHandle = NULL;
				}					
				break;
			case 2:
				if(keilTaskHandle == NULL)
				{
					// 重新创建 keilTask 任务
					keilTaskHandle = xTaskCreateStatic(StartKeilTask,"KeilTask", 128, NULL, osPriorityLow1, g_pucStackKeilTaskBuff,&g_TCBKeilTask);
					if(keilTaskHandle == NULL)
					{
						printf("KeilTask creation failed\r\n");
					}		
				}					
				break;
			case 3:
				// 任务自杀
				CubemxTaskHandle = NULL;
				vTaskDelete(NULL);				
				break;
			default:
				Task_Status = 0;
				break;
		}
  }
  /* USER CODE END StartCubemxTask */
}

(3)在StartKeilTask函数中进行如下补充即可。(按Ctrl+F搜索Private application code即可找到任务函数)

/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
int fputc(int ch, FILE *f)
{
	unsigned char temp[1]={ch};
	HAL_UART_Transmit(&huart1,temp,1,0xffff);
	return ch;
}
void StartKeilTask(void *argument)
{
	printf("StartKeilTask Creat\r\n");
	while(1)
	{
		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
		HAL_Delay(100);
	}
}
/* USER CODE END Application */

测试结果

keil调试配置

(1)打开微库。

在这里插入图片描述

(2)配置模拟器
DARMSTM.DLL
pSTM32F103C8

在这里插入图片描述

配置虚拟示波器

(1)打开调试界面

在这里插入图片描述

(2)选择逻辑分析仪,检测PC13引脚。为什么下面输入的是PORTC.13,原因很简单,格式为PORTx.yx表示端口,y表示具有引脚数值,注意’.'必须是英文的!

在这里插入图片描述
在这里插入图片描述

配置虚拟串口

(1)如下图

在这里插入图片描述

打开GPIO引脚电平配置界面

(1)因为我们需要模拟一个按下按键的操作,因此可以进行如下操作。

在这里插入图片描述

实测

(1)先全速跑

在这里插入图片描述

(2)勾选上PC14引脚。

在这里插入图片描述

(3)取消勾选PC14。

在这里插入图片描述

(4)勾选上PC14引脚。

在这里插入图片描述

(5)取消勾选PC14。

在这里插入图片描述

(6)再次进行电平翻转工作,之后无论怎么反转PC14的电平,我们会发现,方波会一直存在。因为第三次反转PC14的电平是进行任务自杀,所以最终不会有任何现象发生。

在这里插入图片描述

理论

vTaskDelete()函数介绍

(1)这个任务使用起来还是很容易的,只需要传入一个任务句柄即可。不过需要注意的是,删除任务有两种方式,第一种是删除其他的任务,第二种是任务自杀。
<1>删除其他任务:当你需要在任务A中删除任务B,只需要在任务A中调用任务B的句柄即可。如果任务B在创建的时候,任务句柄传入的是NULL,那么任务B将只能自杀,无法被其他任务杀死。
<2>任务自杀:任务自杀只需要传入一个NULL即可。

/**
 * @brief  RTOS 内核管理中移除任务
 *
 * @param  要移除任务的任务句柄,如果是任务自杀,传入NULL
 *
 * @return 无
 */
void vTaskDelete( TaskHandle_t xTaskToDelete );

两种任务删除要注意的点

(1)任务自杀通常由任务自己主动发起,而删除其他任务是由系统中的某个任务请求删除另一个任务。
(2)在实际应用中,需要根据具体的需求和设计来选择使用哪种方法。在任何情况下,都需要确保在删除任务之前,已经合理地释放了任务占用的资源,以避免资源泄漏和系统不稳定性。删除任务释放的资源要考虑以下内容:

  • 避免删除正在执行的任务:尽量避免删除正在执行的任务,因为这可能导致未定义的行为。通常,应该在目标任务主动结束执行或者在任务的代码中检查某些条件后再请求删除。
  • 处理资源释放:确保在删除任务之前释放任务使用的资源。这包括释放动态分配的内存、关闭文件句柄、释放占用的硬件资源等。如果任务在删除时仍然占用资源,可能会导致资源泄漏或系统不稳定。
  • 处理同步和互斥:如果目标任务与其他任务之间存在同步或互斥关系,确保在删除任务之前解除这些关系,以免引起竞态条件或死锁。
  • 避免删除空闲任务:在 FreeRTOS 中,空闲任务(Idle Task)用于在系统没有其他任务需要执行时运行。删除空闲任务可能导致系统无法正常工作,应该谨慎使用。例如,任务删除之后的堆栈释放,是在空闲任务中执行,当空闲任务删除之后,堆栈将需要通过其他任务手动释放,这样将会增加工作量。

重新创建任务需要注意的点

(1)其实从实操中已经知道了,当我们重新创建任务的时候。任务会从头执行,因此这里我们将能够看到两次StartKeilTask Creat到底字符数据打印。

在这里插入图片描述

参考

(1)FreeRTOS官方文档:vTaskDelete函数介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/341613.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WPF多值转换器

背景&#xff1a;实现Slider拖动可以调整rgb 单转换器&#xff1a;WPF中数据绑定转换器Converter-CSDN博客 在View中&#xff1a; <StackPanel Orientation"Vertical"><Slider x:Name"slider_R" Minimum"0" Maximum"255" Wi…

Python爬虫采集下载中国知网《出版来源导航》PDF文档

时隔一年&#xff0c;很久没更新博客了。今天给大家带来一个采集 &#xff1a;出版来源导航 这个是网址是中国知网的&#xff0c;以下代码仅限于此URL&#xff08;出版来源导航&#xff09;采集&#xff0c;知网的其他网页路径采集不一定行&#xff0c;大家可以试试。 以下代码…

《绝地求生大逃杀》怎么买衣服 Steam商店服装购买方法

《绝地求生大逃杀》怎么买衣服&#xff1f;游戏中好看的服装有不少&#xff0c;大家可能开箱并没开出来&#xff0c;想买却不知具体的入手途径&#xff0c;今天闲游盒带来《绝地求生大逃杀》怎么买衣服 Steam商店服装购买方法&#xff0c;希望对各位有帮助。 打开Steam&#xf…

ffmpeg和opencv一些容易影响图片清晰度的操作

ffmpeg 转视频或者图片&#xff0c;不指定码率清晰度会下降 ffmpeg -i xxx.png xxx.mp4 码率也叫比特率&#xff08;Bit rate&#xff09;(也叫数据率)是一个确定整体视频/音频质量的参数&#xff0c;秒为单位处理的字节数&#xff0c;码率和视频质量成正比&#xff0c;在视频…

高效办公-电脑的基本组成

作为一位网络工程师在公司内部混久了也兼职了桌面运维了&#xff0c;感觉做网管也是有一些坑的&#xff0c;所以记录一下吧。然后忽然觉得公众号内容有点专业了&#xff0c;那就增加一点办公常识吧&#xff0c;主要是一些电脑使用方面的设置和简单优化&#xff0c;利人利己。 一…

RAR分卷压缩文件可以合并成一个吗?推荐2个方法!

有时候文件太大&#xff0c;我们在压缩RAR文件时会选择压缩成分卷文件&#xff0c;这样更便于传送。如果后续只想要一个压缩包&#xff0c;如何把RAR分卷压缩文件合并起来呢&#xff1f;下面小编分享2个方法&#xff0c;不清楚的小伙伴一起来看看吧&#xff01; 方法一&#xf…

linux安装docker(入门一)

环境&#xff1a;centos 7(linux) 网站 官网: https://docs.docker.com/ Docker Hub 网站: https://hub.docker.com/ 容器官方概述 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立软件包 &…

[分章:阅读]《我的第一本算法书》

第一章数据结构 1.链表 1、数据结构之一&#xff0c;线性排列数据&#xff0c;指针链接数据&#xff1b;访问O&#xff08;n&#xff09;&#xff0c;删除/添加O&#xff08;1&#xff09; 2、类似链条。 2.数组 1、线性排列数据&#xff0c;含数据下标&#xff08;即索引&…

Linux忘记密码

1.服务器启动界面出现3秒倒计时内&#xff0c;按一下“e”键 2.向右移动光标到ro\这个位置后边&#xff0c;插入&#xff1a;rw init/sysroot/bin/sh_ 切记sh_的下划线后边不要有空格&#xff0c;不然会报错 3.修改完成直接按CtrlX启动系统 4.输入 chroot /sysroot切换进去 5.…

Xftp连接不上Linux虚拟机的原因解决方法

前言&#xff1a; 在当今数字化时代&#xff0c;远程连接到Linux虚拟机是许多开发者和系统管理员日常工作的一部分。然而&#xff0c;有时候&#xff0c;面对Xftp连接不上Linux虚拟机的问题&#xff0c;我们可能感到困惑和无措。这个看似小问题可能导致工作中断&#xff0c;因…

【wu-framework-parent 1.2.2-JDK17-SNAPSHOT 新版本中的 ACW】

版本: 1.2.2-JDK17-SNAPSHOT 项目地址&#xff1a;https://gitee.com/wujiawei1207537021/wu-framework-parent/tree/master/wu-smart-intergration/wu-smart-acw 演示地址&#xff1a;http://124.222.48.62:30193/wu-smart-acw-ui/#/login admin/admin docker启动 docker …

移动CRM系统是什么?能帮企业做哪些事情?

移动CRM&#xff0c;即移动客户关系管理&#xff0c;是一种利用移动设备进行客户关系管理的工具。随着移动技术的飞速发展&#xff0c;移动CRM在商业领域得到了广泛应用。本文将对移动CRM的概念、功能和作用、价格等方面进行详细介绍。 1.移动crm的概念 移动CRM是基于客户关系…

Facebook的可访问性使命:构建无障碍社交空间

在当今数字时代&#xff0c;社交媒体不仅是人们交流、分享和连接的平台&#xff0c;更是构建开放、包容社交环境的关键。Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;积极推动着可访问性使命&#xff0c;致力于构建一个无障碍的社交空间&#xff0c;使每个…

2 - 部署Redis集群架构

部署Redis集群架构 部署Redis集群部署管理主机第一步 准备ruby脚本的运行环境第二步 创建脚本第三步 查看脚本帮助信息 配置6台Redis服务器第一步 修改配置文件启用集群功能第二步 重启redis服务第三步 查看Redis-server进程状态&#xff08;看到服务使用2个端口号为成功&#…

Intel Atom + Artix-7 100T FPGA,CompactRIO单板控制器

模拟和数字I/O&#xff0c;RMC&#xff0c;DisplayPort&#xff0c;1.33 GHz双核CPU&#xff0c;1 GB DRAM&#xff0c;4 GB存储容量&#xff0c;Artix-7 100T FPGA&#xff0c;CompactRIO单板控制器 CompactRIO控制器是搭载了实时处理器和用户可编程FPGA的嵌入式控制器。其产…

OSPF协议LSDB同步过程和邻居状态机

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

C#winform上位机开发学习笔记7-串口助手的波特率参数设置功能添加

1.功能描述 上位机与下位机进行通讯时需要用到波特率设置功能&#xff0c;以及尝试与下位机实体进行通讯。 2.代码部分 步骤1&#xff1a;串口开启按钮事件中添加代码 serialPort1.BaudRate Convert.ToInt32(comboBox14.Text, 10);//将十进制的文本转换为32位整型赋值给串…

docker配置node项目

首先在项目根目录创建Dockerfile FROM node:18.19RUN mkdir /appCOPY . /appWORKDIR /appRUN npm installEXPOSE 8081CMD ["npm","run","start"]添加.dockerignore文件 /dist /node_moduleslogs *.log npm-debug.log* yarn-debug.log* yarn-er…

《WebKit 技术内幕》学习之九(4): JavaScript引擎

4 实践——高效的JavaScript代码 4.1 编程方式 关于如何使用JavaScript语言来编写高效的代码&#xff0c;有很多铺天盖地的经验分享&#xff0c;以及很多特别好的建议&#xff0c;读者可以搜索相关的词条&#xff0c;就能获得一些你可能需要的结果。同时&#xff0c;本节希望…

10.1 MyBatis基础(❤❤❤❤)

10. MyBatis入门 1. 框架的作用1. MyBatis简介2. 使用细则3. 1. 框架的作用 1. MyBatis简介 2. 使用细则 3.