FreeRTOS【7】队列使用

1.开发背景

       操作系统提供了多线程并行的操作,为了方便代码的维护,各个线程都分配了专用的内存并处理对应的内容。但是线程间也是需要协助操作的,例如一个主线程接收信息,会把接收的信息并发到其他线程,即主线程不阻塞,子线程做实际的处理。

        如果是在裸机编程的方式,常用的操作方式是主线程设置 Flag,子线程循环查询 Flag 是否达到预期再执行对应的操作。问题就来了,为了提高子线程的响应实时性,需要频繁判断,导致CPU占用率极高,显然这样的设计是不合理的,所以队列的存在就变得合理了。

        FreeRTOS 的队列传递信息采用的是内存拷贝,队列在接收信息的时候会阻塞线程,释放CPU,降低 CPU 的使用率,相当于线程间信息的交互交给内核去统筹。

        下面是队列的常用接口,不包含中断操作,需要注意的是 xQueueOverwrite只在单成员队列中使用。

        鉴于有些人是不知道队列的特性的,队列就是先进先出,当然 FreeRTOS 提供了队头插队的操作,总体如下图:

2.开发需求

        设计实验实现线程到线程,中断到线程的信息传递。

3.开发环境

        window10 + MDK + STM32F429 + FreeRTOS10.3.1

4.实现步骤

1)创建接收线程,持续等待队列信息

2)创建发送线程,发送队列信息

3)重写按键中断,中断中发送队列信息

        核心代码如下:

#include "appTest.h"#include <stdio.h>
#include <string.h>
#include <stdlib.h>#include "mspDwt.h"
#include "mspGpio.h"
#include "mspExti.h"#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"#include "appLog.h"typedef struct
{/* 队列相关 */QueueHandle_t queue;            // 队列句柄/* 创建任务 */TaskHandle_t taskCtrl;          // 控制线程TaskHandle_t taskQueueRx;       // 接收线程TaskHandle_t taskQueueTx;       // 发送线程}Ctrl_t;/* 文件指针 */
static Ctrl_t s_ctrl = {0};
static Ctrl_t *p = &s_ctrl;
static void TaskCtrl(void *pvParameters);
static void TaskQueueRx(void *pvParameters);
static void TaskQueueTx(void *pvParameters);/* 控制线程 */
static void TaskCtrl(void *pvParameters)
{vTaskDelay(1000);for ( ; ; ){vTaskDelay(1000);}
}/* 队列接收线程 */
static void TaskQueueRx(void *pvParameters)
{unsigned int item = 0;vTaskDelay(100);for ( ; ; ){xQueueReceive(p->queue, &item, portMAX_DELAY);Log_Debug("%s 线程接收 Rx = 0x%.8X\r\n", __func__, item);}
}/* 队列发送线程 */
static void TaskQueueTx(void *pvParameters)
{vTaskDelay(1000);unsigned int threadData = 0x12345678;xQueueSend(p->queue, &threadData, 1000);Log_Debug("%s 线程发送 Tx = 0x%.8X\r\n", __func__, threadData);for ( ; ; ){vTaskDelay(1000);}
}/* 测试初始化 */
void aTest_Init(void)
{/* 创建队列 */UBaseType_t uxQueueLength = 10;UBaseType_t uxItemSize = sizeof(unsigned int);p->queue = xQueueCreate(uxQueueLength, uxItemSize);/* 创建动态任务 */xTaskCreate(TaskCtrl,       "TaskCtrl",     500, NULL, 5, &p->taskCtrl);xTaskCreate(TaskQueueRx,    "TaskQueueRx",  500, NULL, 5, &p->taskQueueRx);xTaskCreate(TaskQueueTx,    "TaskQueueTx",  500, NULL, 5, &p->taskQueueTx);
}/* Key2 PC13   Key0 PH3 Key1 PH2 */
void Exti13_TriggerInterrupt(void)
{mspExti_Close(13);if (mspGpio_GetInput("PC13") == 0){/* 队列发送数据 */unsigned int irqData = 0xABCDEF;BaseType_t xHigherPriorityTaskWoken;xQueueSendFromISR(p->queue, &irqData, &xHigherPriorityTaskWoken);portYIELD_FROM_ISR(xHigherPriorityTaskWoken);Log_Debug("%s 中断发送 Tx = 0x%.8X\r\n", __func__, irqData);}
}

4)查看运行结果

        线程和中断发送的数据都被接收无误,而且通过时间戳可以看出,线程发送完 1ms 内数据就被接收线程接收并处理,实时性还是很不错的。

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

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

相关文章

[LitCTF 2023]yafu (中级) (素数分解)

题目&#xff1a; from Crypto.Util.number import * from secret import flagm bytes_to_long(flag) n 1 for i in range(15):n *getPrime(32) e 65537 c pow(m,e,n) print(fn {n}) print(fc {c})n 152412082177688498871800101395902107678314310182046454156816957…

3D模型展示适合哪些类型的产品?

3D模型展示特别适合那些需要全面展示产品细节和特性的商品&#xff0c;产品3D交互展示具有直观性、动态性、交互性等显著优势&#xff0c;可以通过51建模网一站式完成商品3D建模、3D展示、3D定制、AR试穿等功能&#xff0c;以下是一些适合使用3D模型展示的产品类型&#xff1a;…

Compose第三弹 列表

目标&#xff1a; 1.根据列表数据&#xff0c;生成列表 一、列表控件 使用 Compose 的 LazyColumn 和 LazyRow。这些可组合项只会呈现屏幕上显示的元素&#xff0c;因此&#xff0c;对于较长的列表&#xff0c;使用它们会非常高效。 LazyListScope.items会延迟创建列表视图&…

npm镜像源管理、nvm安装多版本node异常处理

查看当前使用的镜像源 npm config get registry --locationglobal 设置使用官方源 npm config set registry https://registry.npmjs.org/ --locationglobal 设置淘宝镜像源 npm config set registry https://registry.npm.taobao.org/ --locationglobal 需要更改淘宝镜像源地址…

Java培训后找不到工作,现在去培训嵌入式可行吗?

最近java 工作还是比较好找&#xff0c;不知道你是对薪资要求太高&#xff0c;还是因为其他原因&#xff0c;如果你真的面试了很多都还找不到工作&#xff0c;那么一定要知道找不到工作的原因是啥&#xff0c;一定不是因为java 太卷&#xff0c;你说那个行业&#xff0c;那个职…

多用户协作与实时渲染:3D开发工具HOOPS助力汽车行业CAD可视化

在当今汽车行业&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;可视化是产品设计和开发过程中不可或缺的一环。随着汽车设计复杂性的增加&#xff0c;CAD可视化不仅仅是一个设计工具&#xff0c;更是一个沟通和协作的平台。然而&#xff0c;尽管技术不断进步&#xff0…

Vue3实战笔记(51)—Vue 3封装带均线的k线图

文章目录 前言带均线的k线图总结 前言 继续封装一个封装带均线的k线图 带均线的k线图 EChartsCandlestickSh.vue&#xff1a; <template><div ref"chartContainer" style"width: 100%; height: 500px"></div></template><scr…

西湖大学提出AIGC检测框架,精准识别AI撰写的文稿

近年来人工智能技术突飞猛进&#xff0c;尤其是大语言模型的出现&#xff0c;让AI具备了创作文章、小说、剧本等内容的能力。 AI代写&#xff0c;已经逃不过老师、编辑、审稿人的火眼金睛了。但让AI仅改写部分片段&#xff0c;就安全了么&#xff1f; 针对检测AI改写的片段&a…

CentOS7 升级 openssh

一、准备环境 1、准备一台CentOS7系统的虚拟机 2、 配置好网络和YUM源 3、安装版本确认 openssh升级到9.7 zlib 使用 1.3.1 openssl 使用 1.1.1.w 二、升级openssh 1、安装编译环境基础 yum -y install build-essential perl gcc gcc-c make pam-devel 2、编译安装zl…

嵌入式 - 高电平脉冲触发

高脉冲触发器是一种数字信号&#xff0c;用于在信号从低电平状态&#xff08;通常为 0 伏或接地&#xff09;变为高电平状态&#xff08;通常为正电压&#xff0c;如 5V 或 3.3V&#xff0c;具体取决于系统&#xff09;时启动动作或事件。这种从低到高的转变也称为上升沿&#…

新版IDEA没有办法选择Java8版本解决方法

2023年11月27日后&#xff0c;spring.io 默认不再支持创建jdk1.8的项目 解决方法就是把 Spring的Server URL 改为阿里的。 阿里的Server URL https://start.aliyun.com/ 默认的Server URL https://start.spring.io 阿里的Server URL https://start.aliyun.com/

Linux Kernel入门到精通系列讲解(RV-U-boot 篇) 4.1 RISC-V快速移植启动一个U-boot

1. 概述 OpenSBI已经被我们成功突破了,然后就来到了BL3 uboot阶段了,没学会OpenSBI的可以先跳回去学,因为它们是互相依赖的关系。我们用的是最新的2024-4版本,需要的可以到u-boot官网自行下载,也可以使用我们的git仓库中的源码。 U-boot 下载地址 2. U-boot简单描述 在…

Linux自动重启系统脚本测试工具

前言 脚本允许用户指定重启的次数和重启间隔时间&#xff0c;并自动生成相应的定时任务。通过使用这个脚本&#xff0c;系统管理员可以轻松地设置重启测试。每次重启操作都会被记录下来&#xff0c;以便用户随时了解测试情况。 一、脚本 #!/bin/bashif [ "$1" &qu…

OLED写入指令和数据

1.OLED写命令 写命令/数据的代码 / * 1. start() 2. 写入 b0111 1000 0x78 3. ACK 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据 5. ACK 6. 写入指令/数据 7. ACK 8. STOP */ void Oled_Write_Cmd(char dataCmd)5.1.4 OLED的寻址模式 如何显示一个点&#x…

YOLOv5改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码/涨点能手】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 在图像识别中&#xff0c;学习捕捉长距离关系是基础。现有的CNN模型通常通过增加深度来建立这种关系&#xff0c;但这种形式效率极低。因此&…

电脑msvcp140_atomic_wait.dll丢失的高效率解决方法,快速的一键修复

我们常常遇到各种不可预见的电脑故障问题&#xff0c;msvcp140_atomic_wait.dll丢失是一个常见的系统错误&#xff0c;它通常发生在Windows操作系统中&#xff0c;特别是当用户尝试运行依赖于Microsoft Visual C Redistributable的应用程序时。该问题可能导致程序崩溃或无法启动…

摸鱼大数据——Hive表操作——分桶表

1、介绍 分桶表特点: 会产生分桶文件。 效率上注意: 查询数据的时候如果使用了分桶字段那么会提升数据查询效率&#xff08;数据过滤where、join、分组、抽样查询&#xff09;&#xff1b;否则会进行全表扫描 分桶与分区的区别: 1- 分桶字段必须是原有的字段名称 2-…

动手学深度学习(Pytorch版)代码实践 -深度学习基础-02线性回归基础版

02线性回归基础版 主要内容 数据生成&#xff1a;使用线性模型 ( y X*w b ) 加上噪声生成人造数据集。数据读取&#xff1a;通过小批量读取数据集来实现批量梯度下降&#xff0c;打乱数据顺序并逐批返回特征和标签。模型参数初始化&#xff1a;随机初始化权重和偏置&#x…

Linux驱动开发笔记(二) 基于字符设备驱动的GPIO操作

文章目录 前言一、设备驱动的作用与本质1. 驱动的作用2. 有无操作系统的区别 二、内存管理单元MMU三、相关函数1. ioremap( )2. iounmap( )3. class_create( )4. class_destroy( ) 四、GPIO的基本知识1. GPIO的寄存器进行读写操作流程2. 引脚复用2. 定义GPIO寄存器物理地址 五、…

应急通信保障之多链路聚合通信设备在应急救援实施中的解决方案

在当今信息化社会&#xff0c;应急通信保障已成为各类救援任务中不可或缺的一环。尤其在复杂多变的应急救援现场&#xff0c;如何确保通信畅通、信息传递及时&#xff0c;直接关系到救援行动的成败。近年来&#xff0c;多链路聚合通信设备以其独特的优势&#xff0c;逐渐在应急…