FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-5:队列)

学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。

注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习,也可以通过Proteus仿真的方式进行学习。

后续文章会同时发表在个人博客(jason1016.club)、CSDN;

视频会发布在bilibili(UID:399951374)

一、FreeRTOS队列概念

在实际的应用中,常常会遇到一个任务或者中断服务需要和另外一个任务进行“沟通交流”,这个“沟通交流”的过程其实就是消息传递的过程。在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式,但是如果在使用操作系统的应用中用全局变量来传递消息就会涉及到“资源管理”的问题。FreeRTOS 对此提供了一个叫做“队列”的机制来完成任务与任务、任务与中断之间的消息传递

数据储存

通常队列采用先进先出(FIFO)的存储缓冲机制,也就是往队列发送数据的时候(也叫入队)永远都是发送到队列的尾部,而从队列提取数据的时候(也叫出队)是从队列的头部提取的。但是也可以使用 LIFO 的存储缓冲,也就是后进先出,FreeRTOS 中的队列也提供了 LIFO 的存储缓冲机制。

多任务访问

队列不是属于某个特别指定的任务的,任何任务都可以向队列中发送消息,或者从队列中提取消息。

出队阻塞

为防止任务接收传输队列时,队列还没有消息,导致任务接收空信息的情况下,设置了出队阻塞。

当任务尝试从一个队列中读取消息的时候可以指定一个阻塞时间,这个阻塞时间就是当任务从队列中读取消息无效的时候任务阻塞的时间。出队就是就从队列中读取消息,出队阻塞是针对从队列中读取消息的任务而言的。

出队阻塞有三种模式

不阻塞

不等待,直接读

阻塞时间为 0

阻塞

等一段时间,等不到就走

阻塞时间为0~portMAX_DELAY

超级阻塞

等你等到死

阻塞时间为portMAX_DELAY

入队阻塞

入队说的是向队列中发送消息,将消息加入到队列中。和出队阻塞一样,当一个任务向队列发送消息的话也可以设置阻塞时间。

阻塞状态同上。

二、队列创建

动态队列创建

xQueueCreate()

静态队列创建

xQueueCreateStatic()

//动态创建
QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,//消息队列长度UBaseType_t uxItemSize)   //消息的大小
/*返回值:其他值: 队列创捷成功以后返回的队列句柄!NULL: 队列创建失败。*/                                                                                 //静态创建
QueueHandle_t xQueueCreateStatic(UBaseType_t uxQueueLength,UBaseType_t uxItemSize,uint8_t * pucQueueStorageBuffer,StaticQueue_t * pxQueueBuffer)                                                                                                                

三、队列操作

3.1向队列发送消息

BaseType_t xQueueSend( QueueHandle_t xQueue,        //队列句柄const void * pvItemToQueue,  //要发送的信息TickType_t xTicksToWait);    //阻塞时间
/*返回值:pdPASS: 向队列发送消息成功!errQUEUE_FULL: 队列已经满了,消息发送失败。*/

3.2队列接收信息

BaseType_t xQueueReceive(QueueHandle_t xQueue,     //队列句柄void * pvBuffer,          //保存数据的缓冲区TickType_t xTicksToWait); //阻塞时间
/*返回值:pdTRUE: 从队列中读取数据成功。pdFALSE: 从队列中读取数据失败。*/

3.3队列上锁与解锁

队列上锁

prvLockQueue()

队列解锁

prvUnlockQueue()

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

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

相关文章

Linux【安全 01】云服务器主机安全加固(修改SSHD端口、禁用登陆失败的IP地址、使用密钥登录)

云服务器主机安全加固 1.SSH登录尝试的系统日志信息2.安全加固方法2.1 修改SSHD端口2.2 禁用登陆失败的IP地址2.3 使用密钥登录 3.总结 1.SSH登录尝试的系统日志信息 Last failed login: Sat Oct 7 14:10:39 CST 2023 from xxx.xx.xx.xxx on ssh:notty There were 10 failed …

电源控制系统架构(PCSA)之系统控制处理器(SCP)协调

目录 5.3 系统控制处理器(SCP)的协调 5.3.1 SOC电源状态 5.3.2 Cluster电源状态 5.3 系统控制处理器(SCP)的协调 并非所有的电源状态请求都将被显式处理。除了HW自主选择电源模式外,SCP固件还可以在电源模式选择过…

初出茅庐的小李博客之C语言必备知识枚举体

C语言必备知识枚举体 枚举类型是ANSI C新标准所增加的。如果一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。 枚举的定义形式 enum 枚举类型名 {枚举元素列表 }枚举变量…

Python:diskcache实现基于文件的数据缓存

diskcache是一个基于Sqlite文件的数据缓存 文档 https://grantjenks.com/docs/diskcache/https://github.com/grantjenks/python-diskcachehttps://pypi.org/project/diskcache/ 示例 from diskcache import Cache# 指定文件夹 cache Cache(./cache)# 存 cache.set(name, …

ORA-14452: 试图创建, 变更或删除正在使用的临时表中的索引

在编写一个test存储过程中出现一个错误报告:ORA-14452: 试图创建, 变更或删除正在使用的临时表中的索引,代码如下 create or replace PROCEDURE TMP_TRANSCRIPT AS str_sql varchar2(500);v_flag number:0; --标识 begin--判断临时表是否存在SELECT COUNT(*) into v_flag FROM…

信息收集小练习

信息收集小练习 本文章无任何恶意攻击行为,演示内容都合规无攻击性 演示如何绕过cdn获取真实ip 使用多地ping该网站 发现有很多ip地址,证明有cdn 此处使用搜索引擎搜索,得到ip 演示nmap工具的常用参数 此处以testfire.net为例 使用多地p…

Vue3的计算属性(computed)和监听器(watch)案例语法

一:前言 Vue3 是 Vue2 的一个升级版,随着 2023年12月31日起 Vue2 停止维护。这意味着 Vue3 将会为未来国内一段时间里,前端的开发主流。因此熟练的掌握好 Vue3 是前端开发程序员所不可避免的一门技术栈。而 Vue3 是 Vue2 的一个升级版&#x…

【阿里云】图像识别 智能分类识别 增加垃圾桶开关盖功能点和OLED显示功能点(二)

一、增加垃圾桶开关盖功能 环境准备 二、PWM 频率的公式 三、pthread_detach分离线程,使其在退出时能够自动释放资源 四、具体代码实现 图像识别数据及调试信息wget-log打印日志文件 五、增加OLED显示功能 六、功能点实现语音交互视频 一、增加垃圾桶开关盖功能…

90后的杀马特

《90后的杀马特》 作家/罗光记 破晓的光影洒落,九零年代的沙尘中, 杀马特横空出世,繁华的梦境中。 红发如火,霓虹闪烁,他们舞动在街头巷尾, 披星戴月,挥洒青春,那是属…

Mysql中横表与纵表详细解析及应用举例,看完就会用!

横、纵表 定义 横表定义:一个对象的所有属性在一行,列的定义是对象的各个字段 举例:学生成绩表 姓名 Java C语言 ​ 张三 100 88 纵表定义:一个对象的所有属性被分配到多行,列的定义是对象的字段和字段的值 举例…

Flutter之Graphic图表的简单示例

简介 Graphic是一个数据可视化语法和Flutter图表库。 官方github示例 我的gitee示例 网上可用资源很少,只有作者的几篇文章,并且没有特别详细的文档,使用的话还是需要一定的时间去调研,在此简单记录。 示例 以折线图为例&…

分布式定时任务系列6:XXL-job触发日志过大引发的CPU告警

传送门 分布式定时任务系列1:XXL-job安装 分布式定时任务系列2:XXL-job使用 分布式定时任务系列3:任务执行引擎设计 分布式定时任务系列4:任务执行引擎设计续 分布式定时任务系列5:XXL-job中blockingQueue的应用 …

我在electron中集成了自己的ai大模型

同学们可以私信我加入学习群! 正文开始 前言一、大模型选择二、获取key三、调用api四、调用ai模型api时,解决跨域总结 前言 最近单位把gpt、文心一言、通义千问、星火等等等等你能想到的ai大模型都给禁掉了,简直丧心病狂。 不知道有多少感同…

Kafka配置SASL认证密码登录

​​​​​​1、修改config/server.properties,添加如下内容 listenersSASL_PLAINTEXT://内网ip:9092 advertised.listenersSASL_PLAINTEXT://外网ip:9092 security.inter.broker.protocolSASL_PLAINTEXT sasl.mechanism.inter.broker.protocolPLAIN sasl.enabled.…

青云科技容器平台与星辰天合存储产品完成兼容性互认证

近日, 北京青云科技股份有限公司(以下简称:青云科技)的 KubeSphere 企业版容器平台成功完成了与 XSKY星辰天合的企业级分布式统一数据平台 V6(简称:XEDP)以及天合翔宇分布式存储系统 V6&#xf…

Golang并发模型:Goroutine 与 Channel 初探

文章目录 goroutinegoexit() channel缓冲closerangeselect goroutine goroutine 是 Go 语言中的一种轻量级线程(lightweight thread),由 Go 运行时环境管理。与传统的线程相比,goroutine 的创建和销毁的开销很小,可以…

ITSS信息技术标准——探索信息技术服务运行维护资质查询及其意义

开篇:随着信息技术的高速发展,企业对信息化设施的依赖程度日益加深,如何确保这些设施的正常运行,提高信息技术服务的质量,成为企业关注的焦点。于是,信息技术服务标准(ITSS)应运而生…

Android : 启动模式_简单应用

在 AndroidManifest.xml 文件中更改 android:launchMode" " standard、singleTask、singleTop、singleInstance、singleInstancePerTask standard 启动模式: 默认模式 android:launchMode"standard" a—>b ab; 跳转几个界面就要 点击 返回几次 才…

1457. 二叉树中的伪回文路径 --力扣 --JAVA

题目 给你一棵二叉树,每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的,当它满足:路径经过的所有节点值的排列中,存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。 解题思路 首先确…

部署系列六基于nndeploy的深度学习 图像降噪unet部署

文章目录 1.直接在源代码demo中修改2. 如何修改呢?3. 修改 graph4. 总结 https://github.com/DeployAI/nndeploy https://nndeploy-zh.readthedocs.io/zh/latest/introduction/index.html 通过以上2个官方链接对nndeploy基本的使用方法应该有所了解了。 下面就是利用…