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

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.hqwc.cn/news/74003.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.RocketMQ之索引文件ConsumeQueue

本文着重分析为consumequeue/topic/queueId目录下的索引文件。 1.ConsumeQueueStore public class ConsumeQueueStore {protected final ConcurrentMap<String>, ConcurrentMap<Integer>, ConsumeQueueInterface>> consumeQueueTable;public boolean load(…

git权限问题解决方法Access denied fatal: Authentication failed

文章目录 遇到Access denied 的权限问题解决方法1、git的密码修改过&#xff0c;但是本地没更新。2、确定问题&#xff0c;然后增加配置① 查询用户信息②如果名称和email不对&#xff0c;设置名称&#xff1a;③ 检查ssh-add是否链接正常④ 设置不要每次都输入用户名密码 3、配…

[Mac软件]MacCleaner 3 PRO 3.2.1应用程序清理和卸载

应用介绍 MacCleaner PRO是一个应用程序包&#xff0c;将帮助您清除磁盘空间并加快Mac的速度&#xff01; MacCleaner PRO - 让您的Mac始终快速、干净和有条理。 App Cleaner & Uninstaller PRO - 完全删除未使用的应用程序并管理Mac扩展。 磁盘空间分析仪PRO-分析磁盘空…

无涯教程-Perl - setnetent函数

描述 该函数应在第一次调用getnetent之前调用。 STAYOPEN参数是可选的,在大多数系统上未使用。当getnetent()从网络数据库的下一行检索信息时,setnetent会将枚举设置(或重置)为主机条目集的开头。 语法 以下是此函数的简单语法- setnetent STAYOPEN返回值 此函数不返回任何…

基于安防监控EasyCVR视频汇聚融合技术的运输管理系统的分析

一、项目背景 近年来&#xff0c;随着物流行业迅速发展&#xff0c;物流运输费用高、运输过程不透明、货损货差率高、供应链协同能力差等问题不断涌现&#xff0c;严重影响了物流作业效率&#xff0c;市场对于运输管理数字化需求愈发迫切。当前运输行业存在的难题如下&#xf…

css学习1

1、样式定义如何显示元素。 2、样式通常保存至外部的css文件中。 3、样式可以使内容与表现分离。 4、css主要有两部分组成&#xff1a;选择器与一条或多条声明。 选择器通常为要改变的html元素&#xff0c;每条声明由一个属性和一个值组成。每个属性有一个值&#xff0c;属性…

WebStorm运行vue项目

WebStorm运行vue项目&#xff08;vue2&#xff09; 1.安装webstorm 2. 需要安装node.js 环境&#xff0c;可以去官网下载 https://nodejs.org/en 3. 安装完需要查看 按winr 输入cmd进入 输入命令node -v 和npm -v 查看&#xff0c;会出现相应的版本号,代表安装成功 vue官网安…

CF 1354 C1 C2 Polygon Embedding(求奇偶正多边形的外接最小正方形的边长)

CF 1354 C1 / C2 Polygon Embedding(求奇偶正多边形的外接最小正方形的边长) Problem - C1 - Codeforces Problem - C2 - Codeforces EASY &#xff1a; 大意&#xff1a;给出一个偶数 n &#xff0c; 求 正 (2 * n) 边形的最小外接正方形的边长。 可以想出两种最直观的情况…

Qt扫盲-Qt Paint System 概述

Qt Paint System 概述 一、概述二、绘图设备和后端1. Widget2. Image3. Pixmap4. OpenGL绘制设备5. Picture6. 自定义绘制后端 三、绘图与填充1. Drawing2. 填充 Filling 四、坐标系统1. 渲染Window-Viewport转换 五、读写图像文件1. QMovie 六、绘图相关设备 一、概述 Qt的pa…

生成国密SM2密钥对

在线生成国密密钥对 生成的密钥对要妥善保管&#xff0c;丢失是无法找回的。

Windows小记

一、域控制器升级的先决条件验证失败。 新建域时&#xff0c;本地 Administrator 帐户将成为域 Administrator 帐户。无法新建域&#xff0c;因为本地 Administrator 帐户密码不符合要求。 目前&#xff0c;本地 Administrator 帐户不需要密码。我们建议你使用网络用户命令行工…

linux 查看文件被那个进程所调用

使用lsof 命令 显示文件被哪个进程所占用 lsof /var/log/messagesCOMMAND&#xff1a;进程的名称PID&#xff1a;进程标识符USER&#xff1a;进程所有者FD&#xff1a;文件描述符&#xff0c;应用程序通过文件描述符识别该文件。如cwd、txt等TYPE&#xff1a;文件类型&#…