STM32 CubeMX (Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)第二步

news2024/11/16 18:10:16

STM32 CubeMX


STM32 CubeMX ____Freertos任务通信:队列、信号量、互斥量,事件组,任务通知

  • STM32 CubeMX
  • 一、STM32 CubeMX设置
    • 时钟配置
    • HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)
    • 使用STM32 CubeMX 库,配置Freertos
  • 二、实验一:消息队列
    • 消息队列的作用:
    • FreeRTOS 消息队列和数组 的几个区别:
    • 创建消息队列
    • 创建任务
    • 代码部分
    • 实验现象
  • 三,实验二:信号量
    • 信号量概念
    • 二值信号量
    • 计数信号量
  • 四,实验三:互斥量
  • 五,实验四:事件组
  • 六,实验五:任务通知


学习使用Freertos第二步
在 FreeRTOS 中,任务通信可以通过以下函数来实现:

  1. xQueueCreate():用于创建一个消息队列。可以设置队列长度和每个消息的大小。

xQueueSend():将一条消息发送到队列中。可以选择阻塞或非阻塞发送。

xQueueReceive():从队列中接收一条消息。可以选择阻塞或非阻塞接收。

xQueuePeek():查看队列中的下一条消息,但不将其移除。

xQueueReset():清空队列中的所有消息。
2. xQueueSemaphoreTake()xQueueSemaphoreGive():用于实现二值信号量,控制任务之间的互斥访问。
3. xSemaphoreCreateMutex():创建一个互斥信号量,用于实现任务之间的互斥访问。
4. xTaskNotify()ulTaskNotifyTake():用于任务间的通知机制,一个任务可以通知另一个任务进行某种操作。
5. xEventGroupCreate()、xEventGroupSetBits()和xEventGroupWaitBits():用于创建、设置和等待事件标志组。

一、STM32 CubeMX设置

时钟配置

在这里插入图片描述

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

在这里插入图片描述

使用STM32 CubeMX 库,配置Freertos

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

二、实验一:消息队列

消息队列的作用:

  • 数据传递:消息队列允许任务之间传递数据,一个任务可以将数据打包成消息发送到队列,另一个任务则可以从队列中接收该消息并处理其中的数据。这使得任务之间可以方便地进行数据交换和共享。
  • 任务解耦:通过使用消息队列,任务之间的耦合度可以降低。一个任务只需要关注发送和接收消息,而不需要知道消息的具体处理细节和目标任务的实现。这样,当需要更改或替换某个任务时,只需要保证消息的格式和接口不变即可,不会对其他任务产生影响。
  • 同步与协作:消息队列可以用于实现任务之间的同步和协作。例如,一个任务可以等待某个特定的消息到达队列后才继续执行,从而实现任务间的同步。另外,多个任务可以通过发送和接收消息来协调彼此的执行顺序和操作。
  • 缓冲和调节:消息队列可以充当缓冲区,用于存储一定数量的消息。当发送方发送消息速度较快,而接收方处理速度较慢时,消息队列可以暂时存储未处理的消息,避免数据丢失。同时,消息队列还可以调节发送和接收任务之间的速度差异,以平衡任务负载。

FreeRTOS 消息队列和数组 的几个区别:

  • 数据组织方式:消息队列是一种先进先出(FIFO)的数据结构,用于存储和传递消息。每个消息都可以包含不同类型和长度的数据。而数组是一种线性的、连续的数据结构,用于存储相同类型和长度的元素。
  • 功能和用途:消息队列主要用于任务间通信,允许任务之间传递数据和进行同步。它提供了数据传递、解耦、同步和协作等功能。而数组通常用于存储一组具有相同类型的元素,可以进行遍历、访问和修改等操作。
  • 大小和容量:消息队列的大小是可以动态调整的,可以根据需要增加或减少队列的容量。而数组的大小在创建时就确定,并且通常是固定的。
  • 可用性和效率:消息队列可以实现多个任务之间的并发通信,提供了较高的可用性和灵活性。而数组通常在单个任务内进行操作,具有较高的效率和直接性
  • 总的来说,消息队列和数组是两种不同的数据结构,适用于不同的场景和需求。消息队列主要用于任务间通信和数据传递,具有灵活性和可调节性;而数组主要用于存储相同类型的元素,并进行遍历和访问操作。选择使用哪种数据结构取决于具体的应用需求和功能要求。

创建消息队列

在这里插入图片描述

  • Queue Name: 队列名称
  • Queue Size: 队列能够存储的最大单元数目,即队列深度
  • Queue Size: 队列中数据单元的长度,以字节为单位
  • Allocation: 分配方式:Dynamic 动态内存创建
  • Buffer Name: 缓冲区名称
  • Buffer Size: 缓冲区大小
  • Conrol Block Name: 控制块名称

创建任务

在这里插入图片描述

  • Task Name: 任务名称
  • Priority: 优先级,在 FreeRTOS 中,数值越大优先级越高,0 代表最低优先级
  • Stack Size (Words): 堆栈大小,单位为字,在32位处理器(STM32),一个字等于4字节,如果传入128那么任务大小为128*4字节
  • Entry Function: 入口函数
  • Code Generation Option: 代码生成选项
  • Parameter: 任务入口函数形参,不用的时候配置为0或NULL即可
  • Allocation: 分配方式:Dynamic 动态内存创建
  • Buffer Name: 缓冲区名称
  • Conrol Block Name: 控制块名称

代码部分

void sendTask1(void const * argument)
{
  /* USER CODE BEGIN sendTask1 */
	BaseType_t xsatus;
	uint32_t buff=9600;
  /* Infinite loop */
  for(;;)
  {
      xsatus=xQueueSendToBack(myQueue01Handle,&buff,0);
			 if( xsatus!=pdPASS)
			 {
			 printf("输入失败\r\n");		// printf输出字符串
			 }
			 else
			 {
			 printf("成功写入%d\r\n", buff);		// printf输出字符串
			 }
			 osDelay(1000);
  }
  /* USER CODE END sendTask1 */
}
void readTask3(void const * argument)
{
  /* USER CODE BEGIN readTask3 */
  BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
      xsatus=xQueueReceive(myQueue01Handle,&buff,0);
		  if( xsatus!=pdPASS)
			 {
			 printf("读取失败\r\n");		// printf输出字符串
			 }
			 else
			 {
			 printf("成功读取%d\r\n", buff);		// printf输出字符串
			 }
			  osDelay(3000);
  }
  /* USER CODE END readTask3 */
}

实验现象

在这里插入图片描述

 
			 xsatus=xQueueSendToBack(myQueue01Handle,&buff,portMAX_DELAY);//一直等待
			 if( xsatus!=pdPASS)
			 {
			 printf("输入失败\r\n");		// printf输出字符串
			 }
			 else
			 {
			 printf("成功写入%d\r\n", buff);		// printf输出字符串
			 }

还一中读取方式不会删除信息

三,实验二:信号量

信号量概念

FreeRTOS中的信号量是一种用于任务间同步和资源共享的机制。它可以用来实现任务之间的互斥访问共享资源,或者在某个任务等待某个事件发生时进行阻塞。

FreeRTOS提供了两种类型的信号量:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。

二进制信号量是一种简单的信号量,只有两种状态:空闲和占用。当一个任务获取到二进制信号量时,它就可以继续执行,而其他任务则会被阻塞。当任务释放二进制信号量时,其他任务可以获取到它并继续执行。

计数信号量是一种更复杂的信号量,它可以有多个资源可供获取。计数信号量可以用来实现资源池的管理,例如限制同时访问某个资源的任务数量

在FreeRTOS中,可以使用以下函数来创建和操作信号量:

  • xSemaphoreCreateBinary(): 创建二进制信号量。
  • xSemaphoreCreateCounting(): 创建计数信号量。
  • xSemaphoreTake(): 获取一个信号量。
  • xSemaphoreGive(): 释放一个信号量。

需要注意的是,使用信号量时要确保正确的获取和释放顺序,以避免出现死锁或资源竞争的问题。

二值信号量

创建信号量
在这里插入图片描述

void sendTask1(void const * argument)
{
  /* USER CODE BEGIN sendTask1 */
	BaseType_t xsatus;
	uint32_t buff=9600;
  /* Infinite loop */
  for(;;)
  {
		
       if( xSemaphoreTake(myBinarySem01Handle,portMAX_DELAY)!=pdPASS)
			 {
			  printf("刷新失败#信号量获取失败\r\n");		// printf输出字符串
			 }
			 else
			 {
			  printf("成功刷新#信号量获取成功\r\n");		// printf输出字符串
			 }
	
			 osDelay(2000);
  }
  /* USER CODE END sendTask1 */
}
void readTask3(void const * argument)
{
  /* USER CODE BEGIN readTask3 */
  BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
  
		 	 if( xSemaphoreGive(myBinarySem01Handle)!=pdPASS)
			 {
			  printf("读取失败#信号量不能释放\r\n");		// printf输出字符串
			 }
			 else
			 {
			  printf("成功读取#信号量已经释放\r\n");		// printf输出字符串
			 }
			  osDelay(1000);
  }
  /* USER CODE END readTask3 */
}

在这里插入图片描述

计数信号量

创建计数信号量
在这里插入图片描述
在这里插入图片描述

void sendTask1(void const * argument)
{
  /* USER CODE BEGIN sendTask1 */
	BaseType_t xsatus;
	uint32_t buff=9600;
  /* Infinite loop */
  for(;;)
  {
		
       if( xSemaphoreGive(myCountingSem01Handle)!=pdTRUE)
			 {
			  printf("停车已满\r\n");		// printf输出字符串
			 }
			 else
			 {
			  printf("停车成功\r\n");		// printf输出字符串
			 }
			 osDelay(2000);
  }
  /* USER CODE END sendTask1 */
}
void readTask3(void const * argument)
{
  /* USER CODE BEGIN readTask3 */
  BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
  
		 	 if( xSemaphoreTake(myCountingSem01Handle,0)!=pdTRUE)
			 {
			  printf("无车\r\n");		// printf输出字符串
			 }
			 else
			 {
			   printf("取走车\r\n");		// printf输出字符串
			 }
			  osDelay(1000);
  }
  /* USER CODE END readTask3 */
}

实验现象
在这里插入图片描述

四,实验三:互斥量

五,实验四:事件组

六,实验五:任务通知

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

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

相关文章

最新ChatGPT网站AI系统源码+详细图文搭建教程/支持GPT4.0/AI绘画/H5端/Prompt知识库/

一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧&#xff01…

LeetCode ——二叉树篇(三)

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 二叉树的定义及创建见: LeetCode ACM模式——二叉树篇(一)_要向着光的博客-CSDN博客 目录 116. 填充每个节点的下一个右侧节点指针 117. 填…

(二)结构型模式:7、享元模式(Flyweight Pattern)(C++实例)

目录 1、享元模式(Flyweight Pattern)含义 2、享元模式的UML图学习 3、享元模式的应用场景 4、享元模式的优缺点 5、C实现享元模式的简单实例 1、享元模式(Flyweight Pattern)含义 享元模式(Flyweight&#xff09…

企业计算机服务器遭到了locked勒索病毒攻击如何解决,勒索病毒解密

网络技术的不断发展,也为网络安全埋下了隐患,近期,我们收到很多企业的求助,企业的计算机服务器遭到了locked勒索病毒的攻击,导致企业的财务系统内的所有数据被加密无法读取,严重影响了企业的正常运行。最近…

Kubernetes网络组件详解

目录 1、Kubernetes网络组件 1.1、Flannel网络组件 1.2、Calico 网络插件 2、环境准备 2.1、主机初始化配置 2.2、部署docker环境 3、部署kubernetes集群 3.1、组件介绍 3.2、配置阿里云yum源 3.3、安装kubelet kubeadm kubectl 3.4、配置init-config.yaml 3.6、安装…

vscode + python

序 参考链接: 【教程】VScode中配置Python运行环境_哔哩哔哩_bilibili Python部分 Python Releases for Windows | Python.org vscode部分 Visual Studio Code - Code Editing. Redefined 一路next,全部勾上: 就可以了: 安装插…

SpringBoot集成Solr(二)搜索数据

SpringBoot集成Solr(二)搜索数据 1.1 构建查询条件 //创建 solr查询参数对象 SolrQuery query new SolrQuery(); StringBuilder params new StringBuilder(); params.append(" subject_s:*").append(text).append("*"); params.a…

LVS负载均衡群集部署(LVS-NAT模型实例)

NAT模式 LVS负载均衡群集部署 LVS负载调度器:ens33:192.168.50.22 ens36:10.0.0.1(vmnet1) Web1 节点服务器1:192.168.50.56 Web2 节点服务器2:192.168.50.57 NFS服务器:192.168.5…

文本图片怎么转Excel?分享一些好用的方法

在处理数据时,Excel 是一个非常强大的工具,但有时候需要将文本和图片转换为 Excel 格式,这可能会让人感到困惑。在本文中,我们将介绍一些好用的方法,以便您能够轻松地将文本和图片转换成 Excel 格式。 将文本图片为Exc…

Mysql安装配置教程(超详细)(C盘、D盘均可安装)

Mysql安装配置教程(超详细)(C盘、D盘均可安装) mysql安装配置教程(超详细)(C盘、D盘均可安装)0x1 官网下载Mysql下载 0x2 选择安装模式0x3 Developer Default (C盘安装&a…

冠达管理:哪里查中报预增?

中报季行将到来,投资者开端重视公司的成绩体现。中报预增是投资者最关心的论题之一,因为这意味着公司未来成绩的增加潜力。但是,怎么查找中报预增的信息呢?本文将从多个视点分析这个问题。 1.证券交易所网站 证券交易所网站是投资…

React18TS项目:配置react-css-modules,使用styleName

他的好处不说了 网上一堆文章一个能打的都没有, 添加开发依赖 pnpm add -D dr.pogodin/babel-plugin-react-css-modules types/react-css-modules Babel Plugin "React CSS Modules" | Dr. Pogodin Studio 看dr.pogodin/babel-plugin-react-css-mo…

css学习3(三种样式表与样式控制优先级)

1、外部样式表&#xff1a;当样式需要应用于很多页面时&#xff0c;外部样式表将是理想的选择。在使用外部样式表的情况下&#xff0c;你可以通过改变一个文件来改变整个站点的外观。每个页面使用 <link> 标签链接到样式表&#xff0c;也要放到<head>中。 2、外部…

30W IP网络有源音箱 校园广播音箱

SV-7042XT是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率30W。同时它可以外接一个30W的无源副音箱&#xff0c;用在面积较大的场所。5寸进口全频低音…

B. The Walkway - 思维

分析&#xff1a; 补题&#xff0c; 首先大体思路就是先算一遍没改变任何点时能够买到的物品&#xff0c;这一步可以通过看两点之间距离&#xff0c;之间能够包含几个d就说明会需要买几次物品&#xff0c;对于两侧边界&#xff0c;可以将左侧设置为1 - d&#xff0c; 因为此时可…

SAP动态安全库存简介

动态安全库存:跑需求计划时,ERP系统按设置的库存方式自动计算出满足一定时间内可保障生产的库存数量 SAP动态安全库存的计算公式:动态安全库存=平均日需求*覆盖范围。 平均日需求=特定时期内的总需求/特定时期内的工作天数 覆盖范围指在没又货物供应的情况下,库存可以维…

arm:day4

1. 实现三盏灯的点亮 .text .global _start_start: led1初始化函数LED_INIT: 1 通过RCC_AHB4_ENSETR寄存器&#xff0c;设置GPIOE F组控制器使能 0x50000A28[5:4]1ldr r0,0X50000A28ldr r1,[r0]orr r1,r1,#(0X3<<4)str r1,[r0] 2.1 通过GPIOE_MODER寄存器&#xff0c;…

UNIQUE VISION Programming Contest 2023 Summer(AtCoder Beginner Contest 312)F题题解

文章目录 [Cans and Openers](https://atcoder.jp/contests/abc312/tasks/abc312_f)问题建模问题分析1.分析每种物品的优先级2.分析最终选取物品与每种物品的关系代码 Cans and Openers 问题建模 给定n个物品&#xff0c;物品里有三种&#xff0c;第一种可以直接选取&#xff…

VGG分类实战:猫狗分类

关于数据集 数据集选择的是Kaggle上的Cat and Dog&#xff0c;猫狗图片数量上达到了上万张。你可以通过这里进入Kaggle下载数据集Cat and Dog | Kaggle。 在我的Github仓库当中也放了猫狗图片各666张。 VGG网络 VGG的主要特点是使用了一系列具有相同尺寸 3x3 大小的卷积核进…

Dodaf架构的学习分享

一.Dodaf的内容 Dodaf的背景 DODAF&#xff08;Department of Defense Architecture Framework&#xff09;起源于美国国防部&#xff0c;是一个用于支持复杂系统设计、规划和实施的架构框架。以下是DODAF的背景和起源&#xff1a; 复杂系统需求&#xff1a;在军事和国防领域&…