STM32 CubeMX (第一步Freertos任务管理:创建、删除、挂起、恢复)

news2024/11/16 10:34:52

STM32 CubeMX Freertos


STM32 CubeMX (Freertos任务:创建、删除、挂起、恢复)

  • STM32 CubeMX Freertos
  • 前言
  • 一、STM32 CubeMX 配置
    • 时钟树配置
    • HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)
    • 使能串口,用于用于检查实验现象
    • 使用STM32 CubeMX 库,配置Freertos
    • 创建任务
  • 二、实验一:创建两个任务,LED闪烁
  • 实验现象
    • 使用 vTaskDelayUntil()绝对延时
  • 三,实验二:删除LED1任务和自身任务
  • 实验现象
  • 四,实验三:任务的挂起和恢复
  • 实验现象
  • 总结


前言

学习使用Freertos第一步
FreeRTOS 任务管理,您需要掌握以下几个关键函数:

1. xTaskCreate():用于创建一个任务,需要指定任务函数、任务名称、任务栈大小和优先级等参数。
2. vTaskDelete():用于删除一个任务,可以由任务自身或其他任务调用。
3. vTaskDelay():用于使当前任务进入阻塞状态,延迟一段时间后再继续执行。
4. vTaskDelayUntil():类似于vTaskDelay(),但是可以实现周期性的延迟,使任务按照指定的时间间隔执行。
5. vTaskSuspend()和vTaskResume():用于暂停和恢复一个任务的执行,暂停后的任务将不会被调度执行。
6. xTaskResumeFromISR():在中断服务程序中恢复一个被挂起(暂停)的任务。
7. uxTaskPriorityGet()和vTaskPrioritySet():用于获取和设置任务的优先级。
8. uxTaskGetStackHighWaterMark():用于获取任务栈的剩余可用空间大小,可以用来检查任务是否使用了过多的栈空间。


一、STM32 CubeMX 配置

时钟树配置

在这里插入图片描述

HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)

在这里插入图片描述

使能串口,用于用于检查实验现象

在这里插入图片描述

使用STM32 CubeMX 库,配置Freertos

选择CMISS_V1接口就可以满足Freertos接口;且代码量比CMISS_V2小(CMISS_V2支持更多的RTOS接口,所以代码量比CMISS_V1多)
在这里插入图片描述

创建任务

请添加图片描述

二、实验一:创建两个任务,LED闪烁

在这里插入图片描述

代码如下(示例):

void LED1Task(void const * argument)
{
  /* USER CODE BEGIN LED1Task */
  /* Infinite loop */
  for(;;)
  {
		 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);
     printf("LED灭\r\n");		// printf输出字符串
     osDelay(1000);
  }
  /* USER CODE END LED1Task */
}

/* USER CODE BEGIN Header_LED2Task */
/**
* @brief Function implementing the LED2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{
  /* USER CODE BEGIN LED2Task */
  /* Infinite loop */
  for(;;)
  {
		 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
		 printf("LED亮\r\n");		// printf输出字符串
     osDelay(2000);
  }
  /* USER CODE END LED2Task */
}

实验现象

请添加图片描述
在这里插入图片描述

使用 vTaskDelayUntil()绝对延时

使能 vTaskDelayUntil函数
在这里插入图片描述

void LED1Task(void const * argument)
{
  /* USER CODE BEGIN LED1Task */
 TickType_t xlaswketime;
	xlaswketime = xTaskGetTickCount();//获取进入的时间
  /* Infinite loop */
  for(;;)
  {
		 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);
     printf("LED灭\r\n");		// printf输出字符串
     vTaskDelayUntil(&xlaswketime,1000);
  }
  /* USER CODE END LED1Task */
}

/* USER CODE BEGIN Header_LED2Task */
/**
* @brief Function implementing the LED2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{
  /* USER CODE BEGIN LED2Task */
	TickType_t xlaswketime;
	xlaswketime = xTaskGetTickCount();//获取进入的时间
  /* Infinite loop */
  for(;;)
  {
		 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
		 printf("LED亮\r\n");		// printf输出字符串
     vTaskDelayUntil(&xlaswketime,2000);
  }
  /* USER CODE END LED2Task */
}


三,实验二:删除LED1任务和自身任务

/* USER CODE END Header_LED1Task */
void LED1Task(void const * argument)
{
  /* USER CODE BEGIN LED1Task */
 TickType_t xlaswketime;
	xlaswketime = xTaskGetTickCount();//获取进入的时间
  /* Infinite loop */
  for(;;)
  {
		 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);
     vTaskDelayUntil(&xlaswketime,500);
		 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
		 vTaskDelayUntil(&xlaswketime,500);
  }
  /* USER CODE END LED1Task */
}

/* USER CODE BEGIN Header_LED2Task */
/**
* @brief Function implementing the LED2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{
  /* USER CODE BEGIN LED2Task */
	TickType_t xlaswketime;
	xlaswketime = xTaskGetTickCount();//获取进入的时间
	printf("5s后删除LED1任务,再5S删除自身任务\r\n");		// printf输出字符串
  /* Infinite loop */
  for(;;)
  {
		
     vTaskDelayUntil(&xlaswketime,5000);//5秒
		 vTaskDelete(LED1Handle);
		 printf("删除LED闪烁任务\r\n");		// printf输出字符串
		 vTaskDelayUntil(&xlaswketime,5000);//5秒
		 printf("删除自身任务\r\n");		// printf输出字符串
	   vTaskDelete(NULL);
		 printf("正常情况不会打印这段话\r\n");		// printf输出字符串

  }
  /* USER CODE END LED2Task */
}

实验现象

在这里插入图片描述

四,实验三:任务的挂起和恢复

void LED1Task(void const * argument)
{
  /* USER CODE BEGIN LED1Task */
 TickType_t xlaswketime;
	xlaswketime = xTaskGetTickCount();//获取进入的时间
  /* Infinite loop */
  for(;;)
  {
		 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);
     vTaskDelayUntil(&xlaswketime,500);
		 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
		 vTaskDelayUntil(&xlaswketime,500);
  }
  /* USER CODE END LED1Task */
}

/* USER CODE BEGIN Header_LED2Task */
/**
* @brief Function implementing the LED2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{
  /* USER CODE BEGIN LED2Task */
	TickType_t xlaswketime;
	xlaswketime = xTaskGetTickCount();//获取进入的时间
	printf("5s后暂停,再5S恢复\r\n");		// printf输出字符串
  /* Infinite loop */
  for(;;)
  {

     vTaskDelayUntil(&xlaswketime,5000);//5秒
	   vTaskSuspend(LED1Handle);
		 printf("暂停LED闪烁任务\r\n");		// printf输出字符串
		 vTaskDelayUntil(&xlaswketime,5000);//5秒
		 vTaskResume(LED1Handle);
		 printf("恢复LED闪烁任务\r\n");		// printf输出字符串
	
   
  }
  /* USER CODE END LED2Task */
}

实验现象

在这里插入图片描述

总结

学会 任务管理: 需要掌握并熟练任务的创建、删除、挂起、恢复和切换等操作,以及任务的优先级和调度机制。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hlang--用Python写个编程语言-判断与循环

文章目录 前言语法描述判断循环词法解析语法解析定义节点生成节点判断节点循环节点解释器处理判断节点循环处理前言 okey,很好,在上一篇文章当中,我们实现了这个基本的逻辑运算,所以的话,在这里,我们将可以实现到我们的这个判断和循环了。由于这里的话,我们的操作其实和…

搭建私有镜像仓库Harbor

目录 系统环境: 安装Docker-Compose 下载并安装Harber 启动Harbor!!! 系统环境: Centos7.9Docker-ce:24 安装Docker-Compose curl -L "https://github.com/docker/compose/releases/download/v2.20…

Debezium日常分享系列之:临时阻塞快照Ad-hoc blocking snapshots

Debezium日常分享系列之:临时阻塞快照Ad-hoc blocking snapshots 一、认识临时阻塞快照二、临时阻塞快照信号格式三、临时阻塞快照效果 一、认识临时阻塞快照 增量快照于大约两年前在 Debezium 1.6 中首次引入,并且在社区中仍然非常受欢迎,用…

【CAM】CAM(Class Activation Mapping)——可视化CNN的特征定位

文章目录 一、CAM(Class Activation Mapping)二、CAM技术实现2.1 网络修改2.2 微调2.2 特征提取 三、总结Reference 完整代码见Github :https://github.com/capsule2077/CAM-Visualization ,如果有用可以点个Star,谢谢! 一、CAM(C…

如何获取全国城市行政区划划分API接口?

随着大数据时代的到来,数据成为了各行各业必不可少的资源。特别是城市行政区划数据,它不仅是政府公共管理的基础,也是地理信息系统数据的基础,更是各行业进行市场调研和商业分析的重要数据资源。本篇文章将介绍一个城市行政区划划…

对象内存布局与对象头

对象内存布局 在Hotspot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头、实例数据、对齐填充。 对象头 在64为系统中,Mark word 占了8个字节,cla ss Pointer 占了8个字节。从jdk1.8开始,存在指针压缩&am…

windows 下使用 nvm use切换无效

问题描述:windows 下使用 nvm use切换无效,其他例如nvm list,nvm install...却能够成功使用。 解决办法:修改用户变量和环境变量中NVM_SYMLINK的路径为你想要修改的版本所在路径。 例如: (想修改的目标版本所在路径&am…

若依项目的介绍(前后端分离版本)

目录 一、若依介绍 (一)简单介绍 (二)若依版本 (三)Git远程拉取步骤 二、项目的技术介绍 (一)后端技术 1.spring boot 2.Spring Security安全控制 3.MyBatis 4.MySQL和R…

Android学习之路(5) UI控件之Button (按钮)与 ImageButton (图像按钮)

本节引言: 今天给大家介绍的Android基本控件中的两个按钮控件,Button普通按钮和ImageButton图像按钮; 其实ImageButton和Button的用法基本类似,至于与图片相关的则和后面ImageView相同,所以本节 只对Button进行讲解&am…

黑客、骇客、红蓝对抗中几百种渗透测试工具集合全精华最新整理以及各类CTF资料

黑客、骇客、红蓝对抗中几百种渗透测试工具集合全精华最新整理以及各类CTF资料。 WebGoat漏洞练习平台 https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台 https://github.com/WebGoat/WebGoat-Legacy zvuldirll漏洞练习平台 https://github.com/710leo/ZVul…

OJ练习第153题——加油站

加油站 力扣链接:134. 加油站 题目描述 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xf…

Postman软件基本用法:浏览器复制请求信息并导入到软件从而测试、发送请求

本文介绍在浏览器中,获取网页中的某一个请求信息,并将其导入到Postman软件,并进行API请求测试的方法。 Postman是一款流行的API开发和测试工具,它提供了一个用户友好的界面,用于创建、测试、调试和文档化API。本文就介…

最强自动化测试框架Playwright(37)-网络

介绍 Playwright 提供 API 来监控和修改浏览器网络流量,包括 HTTP 和 HTTPS。页面执行的任何请求,包括 XHR 和获取请求,都可以被跟踪、修改和处理。 模拟接口 查看我们的 API 模拟指南,了解有关如何 模拟 API 请求&#xff0c…

Python_11 类的方法

一、查缺补漏 1. 实例方法必须用类实例化对象()来调用,用类来调用时会执行,但是self中不是实例化类地址而是传的字符串 二、类中的方法 1. 实例方法 1. 定义在类里面的普通方法(函数) 2. 第一个参数必须是类实例,在方法调用的时候会自动…

RHCE——一、安装部署及例行性工作

RHCE 一、网络服务1、准备工作2、RHEL9操作系统的安装部署3、配置并优化RHEL9操作系统4、网络配置5、修改网络连接 二、例行性工作1、单一执行的例行性工作2、循环执行的例行性工作 三、书写定时任务的注意事项四、系统级别的计划任务五、实验1、实验一:编写脚本tes…

OJ练习第152题——分割回文串 II

分割回文串 II 力扣链接:132. 分割回文串 II 题目描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 Java代码 class Solution {public int minCut(String s) {int n s.leng…

python基础5——正则、数据库操作

文章目录 一、数据库编程1.1 connect()函数1.2 命令参数1.3 常用语句 二、正则表达式2.1 匹配方式2.2 字符匹配2.3 数量匹配2.4 边界匹配2.5 分组匹配2.6 贪婪模式&非贪婪模式2.7 标志位 一、数据库编程 可以使用python脚本对数据库进行操作,比如获取数据库数据…

C++系列-引用

引用 引用的基本使用引用的起源引用的语法引用的本质引用的注意事项引用和指针 引用作为函数参数引用作为函数的返回值常量引用其它用返回值方式调用函数(case 1)用函数的返回值初始化引用的方式调用函数(case 2)用返回引用的方式…

No113.精选前端面试题,享受每天的挑战和学习

文章目录 怎样理解 Vue 的单向数据流说下MVVM说下cookieVue 的性能优化Cookie、localStorage 和 sessionStorageVue中的computed属性和watch属性有什么区别? 怎样理解 Vue 的单向数据流 在Vue中,单向数据流是指数据在Vue组件中的传递方向是有限制的&…

使用Vscode调试shell脚本

在vcode中安装bash dug插件 在vcode中添加launch.json配置,默认就好 参考:http://www.rply.cn/news/73966.html 推荐插件: shellman(支持shell,智能提示) shellcheck(shell语法检查) shell-format(shell格式化)