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 */
}
实验现象

总结
学会 任务管理: 需要掌握并熟练任务的创建、删除、挂起、恢复和切换等操作,以及任务的优先级和调度机制。
相关文章:
STM32 CubeMX (第一步Freertos任务管理:创建、删除、挂起、恢复)
STM32 CubeMX Freertos STM32 CubeMX (Freertos任务:创建、删除、挂起、恢复) STM32 CubeMX Freertos前言一、STM32 CubeMX 配置时钟树配置HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)…...
0101读写分离测试-jdbc-shardingsphere-中间件
文章目录 1 前言2、创建SpringBoot程序2.1、创建项目2.2、添加依赖2.3、生成实体类、service与Mapper1.5、配置读写分离 2、测试2.1、读写分离测试2.2、事务测试2.3、负载均衡测试 结语 1 前言 shardingshpere-jdbc定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的…...
sqlite3将词典导入数据库
使用sqlite3代码实现将词典导入数据库中 #include <head.h> #include <sqlite3.h> #include <strings.h> #include <unistd.h> int main(int argc, const char *argv[]) {sqlite3 *db NULL;if(sqlite3_open("./dict.db",&db) ! SQLITE…...
浏览器 - 事件循环机制详解
目录 1,浏览器进程模型进程线程浏览器的进程和线程1,浏览器进程2,网络进程3,渲染进程 2,渲染主线程事件循环异步同步 JS 为什么会阻塞渲染任务优先级 3,常见面试题1,如何理解 js 的异步2&#x…...
析构函数中不应该抛出异常(摘录)
析构函数中抛出异常时概括性总结 从语法上面讲,析构函数抛出异常是可以的,C并没有禁止析构函数引发异常,但是C不推荐这一做法,从析构函数中抛出异常是及其危险的。 如果析构函数抛出异常,则异常点之后的程序不会执行&a…...
Windows定时任务计划无法显示任务程序界面的问题解决
笔者这两天写了一个python脚本程序,用来自动从公司的主数据系统获取数据,并按格式编制成excel。脚本程序编写一切顺利,运行结果很是完美,笔者很是舒心。但在最后一步,用上班的电脑每天早上定时运行它时,出了…...
【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求
问题描述 使用Azure API Management, 想对一些固定的IP地址进行访问次数的限制,如被限制的IP地址一分钟可以访问10次,而不被限制的IP地址则可以无限访问? ChatGPT 解答 最近ChatGPT爆火,所以也把这个问题让ChatGPT来解答&#x…...
Python学习笔记_进阶篇(二)_django知识(一)
本章简介: Django 简介Django 基本配置Django urlDjango viewDjango 模板语言Django Form Django 简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来…...
【hive】hive中row_number() rank() dense_rank()的用法
hive中row_number() rank() dense_rank()的用法 一、函数说明 主要是配合over()窗口函数来使用的,通过over(partition by order by )来反映统计值的记录。 rank() over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)dense_rank() …...
【云原生】【k8s】Kubernetes+EFK构建日志分析安装部署
目录 EFK安装部署 一、环境准备(所有主机) 1、主机初始化配置 2、配置主机名并绑定hosts,不同主机名称不同 3、主机配置初始化 4、部署docker环境 二、部署kubernetes集群 1、组件介绍 2、配置阿里云yum源 3、安装kubelet kubeadm …...
计算实数数组中所有元素的绝对值 numpy.fabs()
【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算实数数组中所有元素的绝对值 numpy.fabs() [太阳]选择题 请问关于以下代码表述错误的是? iimport numpy as np a np.array([-1,-3]) b np.array([-1,34j]) print("【显…...
深入浅出Pytorch函数——torch.nn.init.orthogonal_
分类目录:《深入浅出Pytorch函数》总目录 相关文章: 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...
ORACLE中UNION、UNION ALL、MINUS、INTERSECT学习
1、UNION和UNION ALL的使用与区别 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union的作用是将多个结果合并在一起显示出来。 union和union all的区别是union会自动压缩多个结果集合中的重复结果ÿ…...
【k8s、云原生】基于metrics-server弹性伸缩
第四阶段 时 间:2023年8月18日 参加人:全班人员 内 容: 基于metrics-server弹性伸缩 目录 一、Kubernetes部署方式 (一)minikube (二)二进制包 (三)Kubeadm 二…...
回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图)效果一览基本介绍程…...
VSCode快捷键
CtrlShiftP,F1:显示命令面板 CtrlP:快速打开 CtrlShiftN:新窗口/实例 CtrlShiftW:关闭窗口/实例 CtrlX:剪切行 CtrlC:复制行 ALT↑/↓:上下移动 ShiftAlt↓/↑:向…...
贪心算法求数组中能组成三角形的最大周长
题目:三角形的最大周长 给定由一些正数(代表长度)组成的数组arr,返回由其中三个长度组成的、面积不为零的三角形的最大周长。 如果不能形成任何面积不为零的三角形,返回0。 分析: 对数组排序,再从大到小选择三个数,再…...
VMWare Workstation 17 Pro 网络设置 桥接模式 网络地址转换(NAT)模式 仅主机模式
文章目录 网络模式配网要求CentOSDHCP虚拟网络桥接模式默认配置测试手动配置测试 网络地址转发模式 (NAT)还原配置虚拟网络配置默认配置测试手动配置测试 仅主机模式 网络模式 桥接模式: 主机与虚拟机对等, 虚拟机注册到主机所在的局域网, 会占用该网络的IP该局域网内的所有机…...
拒绝摆烂!C语言练习打卡第四天
🔥博客主页:小王又困了 📚系列专栏:每日一练 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、选择题 📝1.第一题 📝2.第二题 Ὅ…...
KubeSphere 社区双周报 | Java functions framework 支持 SkyWalking | 2023.8.4-8.17
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2023.08.04-2023.…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
