多任务互斥及队列

一.互斥的引入
在FreeRTOS中,互斥(Mutex)是一种用于保护共享资源的机制。互斥锁可以确保同一时间只有一个任务能够访问共享资源,从而避免了竞态条件和数据不一致的问题。

FreeRTOS中互斥的引入方法:

  1. 创建互斥锁

    • 使用 xSemaphoreCreateMutex() 函数创建一个互斥锁。
    • 该函数返回一个互斥锁句柄,可以通过该句柄引用互斥锁。
  2. 获取互斥锁

    • 任务通过调用 xSemaphoreTake() 函数来获取互斥锁。
    • 如果互斥锁当前没有被其他任务占用,这个任务将获取到互斥锁,并可以进入临界区(访问共享资源的代码块)。
    • 如果互斥锁已经被其他任务占用,则当前任务将被阻塞,直到互斥锁被释放。
  3. 释放互斥锁

    • 任务在完成对共享资源的访问后,通过调用 xSemaphoreGive() 函数来释放互斥锁。
    • 当互斥锁被释放后,其他等待获取互斥锁的任务就可以获取到它,并继续执行临界区的代码。

需要注意的是,获取互斥锁是一种阻塞操作,即如果互斥锁当前不可用,任务将被阻塞,直到互斥锁可用。互斥锁的获取和释放应该成对出现,确保正确的同步和保护共享资源。

互斥锁的应用可确保共享资源的访问是原子性的,避免了多个任务同时访问共享资源导致的数据不一致和竞争问题。

请注意,互斥锁的使用要合理,并避免死锁和优先级翻转等问题,这在设计多任务系统时需要特别注意。

二.队列

在FreeRTOS中,队列(Queue)是一种常用的通信机制,用于在任务之间传递数据。队列提供了一种安全、可靠的方式,使任务能够以先进先出(FIFO)的顺序接收和发送数据。

以下是FreeRTOS中队列的一些特点和使用方法:

  1. 创建队列

    • 使用 xQueueCreate() 函数创建一个队列。
    • 需要指定队列的长度和每个队列元素的大小。
  2. 发送数据到队列

    • 使用 xQueueSend()xQueueSendFromISR() 函数将数据发送到队列。
    • 数据将会被复制到队列中,原始数据不会受到影响。
    • 如果队列已满,任务可以等待一段时间或放弃发送,具体取决于函数的阻塞方式。
  3. 接收数据从队列

    • 使用 xQueueReceive()xQueueReceiveFromISR() 函数从队列中接收数据。
    • 如果队列为空,任务可以等待一段时间或放弃接收,具体取决于函数的阻塞方式。
    • 接收到的数据将被复制到接收方提供的变量中。
  4. 检查队列状态

    • 使用 uxQueueMessagesWaiting() 函数可以获取当前队列中待处理的消息数目。
    • 使用 uxQueueSpacesAvailable() 函数可以获取队列中剩余的空闲空间。

队列提供了一种灵活的方式来实现任务之间的数据共享和通信。它可以在不同的优先级任务之间传递消息,以及在任务和中断服务程序(ISR)之间传递消息。

需要注意的是,队列的长度和每个队列元素的大小需要根据具体的应用场景来选择。队列也可以用来传递指针,使得更大的数据结构可以在任务之间共享。

Queue服务API函数具有不同的变体,可以根据应用程序的需求进行选择和使用。同时,队列还可以与其他FreeRTOS组件(如任务、定时器和信号量等)一起使用,以构建复杂的嵌入式系统。

![2024-02-21T13:56:09.png][1]

使用场景

下情况下特别适用:

  1. 任务间数据交流:当不同任务之间需要传递数据时,队列是一种安全可靠的机制。任务可以通过发送消息到队列来向其他任务传递数据,而不需要直接访问对方的数据结构。

  2. 任务和中断服务程序(ISR)之间的通信:中断服务程序通常无法直接与任务通信,因为它们在执行时中断了任务的上下文。通过使用队列,中断服务程序可以将数据发送到队列,任务可以在适当的时候从队列中接收并处理数据。

  3. 流量控制:队列可以用于控制任务之间的数据流量。发送任务可以根据接收任务处理数据的速度来控制发送频率,避免数据的积压或丢失。

  4. 事件通知:队列还可以用于通知任务发生特定事件。当任务完成某项任务或达到某个条件时,它可以向队列发送一个特殊的消息,其他任务可以通过接收这个消息来作出相应的响应。

  5. 缓冲区:队列可以用作缓冲区,以平衡不同速度的生产者和消费者。生产者可以将数据放入队列,而消费者可以按照自己的速度从队列中取出数据。

需要根据具体的应用场景来判断是否需使用队列。如果任务之间需要传递数据、需要控制数据流量或需要通知事件,那么使用队列是一个不错的选择。队列提供了一种安全、可靠的机制来实现任务之间的数据共享和通信。

xQueueSend函数

关中断,发数据,开中断

如果你想在中断状态下直接写入数据到队列,并且在写入完成后恢复中断状态,你可以按照以下步骤进行操作:

  1. 在任务初始化时,通过 xQueueCreate() 函数创建一个队列,并将其句柄保存在适当的变量中。

  2. 在中断服务程序中,可以使用 xQueueSend() 函数来向队列中发送数据。在发送数据前,需要先禁用中断,以确保写入数据的过程不会被打断。

    示例如下:

    // 关闭中断
    portDISABLE_INTERRUPTS();
    
    // 向队列发送数据
    xQueueSend(xQueueHandle, &data, portMAX_DELAY);
    
    // 恢复中断
    portENABLE_INTERRUPTS();
    

    在发送数据到队列后,可以根据 xQueueSend() 函数的返回值(是否成功发送)来执行相应的错误处理或日志记录。

需要注意的是,在中断中直接调用 xQueueSend() 函数时,需要确保队列的长度足够大,以避免在中断期间发生队列溢出的情况。另外,虽然中断服务程序的执行时间应该尽可能地短,但在某些情况下,如果队列发送操作无法立即完成,例如队列已满时,则可以使用 portMAX_DELAY 参数来阻塞等待队列可用。

请注意,使用这种方法需要特别小心,并确保在此期间没有其他任务会访问或更改队列,以免产生竞争条件和数据一致性问题。此外,如果有其他中断启用,并且具有更高优先级的中断可能发生时,建议使用 xQueueSendFromISR() 函数来发送数据,以便安全地在中断上下文中操作队列。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】【算法设计与分析 - 北航童咏昕教授】绪论

算法设计与分析 - 北航童咏昕教授 文章目录 算法的定义定义性质 算法的表示自然语言编程语言伪代码 算法的分析算法分析的原则渐近分析 算法的定义 定义 给定计算问题,算法是一系列良定义的计算步骤,逐一执行计算步骤即可得预期的输出。 性质 有穷性确…

【Linux】git操作 - gitee

1.使用 git 命令行 安装 git yum install git 2.使用gitee 注册账户 工作台 - Gitee.com 进入gitee,根据提示注册并登录 新建仓库 仓库名称仓库简介初始换仓库 3.Linux-git操作 进入仓库,选择“克隆/下载” 复制下面的两行命令进行git配置 然后将仓库clo…

c语言经典测试题2

1.题1 我们来思考一下它的结果是什么? 我们来分析一下:\\是转义为字符\,\123表示的是一个八进制,算一个字符,\t算一个字符,加上\0,应该有13个,但是strlen只计算\0前的字符个数。所以…

快速学习springsecurity最新版 (版本6.2)---用户认证

简介 ​ Spring Security 是 Spring 家族中的一个安全管理框架。目前比较主流的是另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富,但是shiro并不简便,这里轻量级安全框架更推荐国产安全框架satokensatoken官网 ​ 一般大型的项目都…

QT应用软件【协议篇】周立功CAN接口卡代码示例

文章目录 USBCAN系列CAN接口卡规格参数资料下载QT引用周立功的库安装sdk代码USBCAN系列CAN接口卡 USBCAN系列CAN接口卡兼容USB2.0全速规范,可支持1/2/4/8路CAN接口。采用该接口卡,PC机可通过USB连入CAN网络,进行CAN总线数据采集和处理,主要具备以下几大优势特点: 支持车载…

Matlab图像处理——图像编码解码

1.霍夫曼编码和解码 clear clc Iimread(lena.bmp); Iim2double(I)*255; [height,width]size(I); %求图像的大小 HWmatrixzeros(height,width); Matzeros(height,width); %建立大小与原图像大小相同的矩阵HWmatrix和Mat,矩阵元素为0。 HWmatrix(1,1)I(1,1); …

清洁力强的洗地机什么牌子最好?深度清洁的洗地机推荐

在相信很多人在做家务时,或许都会遇到一个尴尬的境地:虽然使用吸尘器清理了地面上的尘土和杂物,然后再使用拖把擦洗地板,但往往还是无法达到十分干净的效果。扫地机器人对于着色严重的垃圾,往往会出现越拖越脏的情况。…

Vue3之生命周期基础介绍

让我为大家介绍一下vue3的生命周期吧! 创建阶段:setup 我们直接console.log就可以了 console.log("创建");挂载阶段:onBeforeMount(挂载前)、onMounted(挂载完毕) import { onBeforeMount, onMounted } from vue; // 挂载前 on…

【前端】Vue-Cli 快速创建Vue3项目及一些项目初始化相关

文章目录 前言1. 安装1.1 安装 Vue 脚手架1.2 创建项目1.3 本地运行项目 2. 推送到仓库2.1 远程仓库准备2.2 关于gitIgnore文件2.3 通过git推送至远程仓库 3. 补充与总结3.1 npm 版本是否要升级到最新?3.2 这个项目建议的各种版本3.3 一般前端gitIgnore文件3.4 推荐…

蚂蚁集团开始招聘华为鸿蒙应用研发工程师

早在2023年12月7日支付宝宣布将全面启动鸿蒙原生应用开发。华为表示,支付宝将基于HarmonyOS NEXT版本开发应用,给消费者带来全场景的新体验。头部应用伙伴的加入,大力推动了鸿蒙生态进一步完善。 就近期蚂蚁集团开始招聘华为鸿蒙应用研发工程…

【2024软件测试面试必会技能】Jmeter+ant+jenkins实现持续集成

jmeterantjenkins持续集成 一、下载并配置jmeter 首先下载jmeter工具,并配置好环境变量;参考:https://www.cnblogs.com/YouJeffrey/p/16029894.html jmeter默认保存的是.jtl格式的文件,要设置一下bin/jmeter.properties,文件内容…

成为高级性能测试:发现性能瓶颈掌握性能调优

当下云计算、大数据盛行的背景下,大并发和大吞吐量的需求已经是摆在企业面前的问题了,其中网络的性能要求尤为关键,除了软件本身需要考虑到性能方面的要求,一些硬件上面的优化也是必不可少的。 作为一名测试工作者,对…

SICTF Round#3 の WP

Misc 签到 SICTF{1f4ce05a-0fed-42dc-9510-6e76dff8ff53} Crypto [签到]Vigenere 附件内容: Gn taj xirly gf Fxgjuakd, oe igywnd mt tegbs mnrxxlrivywd sngearbsw wakksre. Bs kpimj gf tank, it bx gur bslenmngn th jfdetagur mt ceei yze Ugnled Lystel t…

书生·浦语大模型实战营-第六课笔记

1.评测追魂夺命三连问 2.主流大拿有话说-评测框架 3.友商最棒儿子最亲,好瓜都是王婆的 4.真枪实弹上战场 为了给平台省点电,我用了自家的电和自家的电脑进行评测。评测的模型也是之前在自己电脑上跑了3轮花费30多个小时的第四课作业微调的法律大模型。s…

智能测径仪 针对设备自身抖动都做了哪些创新加强设计

关键字:测径仪外壳设计,测径仪内部结构,外壳刚性振动,产线共振现象,镜头纯手工擦拭清洗,测径仪智能防抖算法,测径仪多重防抖技术,测径仪防抖技术,测径仪自身防抖, 在生产过程中,被测物不可避免的会发生抖动,测径仪本身也会产生抖动,只是抖动幅…

数据库专题——分库分表

一. 分库分表介绍二. 分库分表实践 一. 分库分表介绍 1.1 分库分表解决了什么问题 先说分库: 《高性能MySQL》中提到了两种数据库扩展方式:垂直扩展和水平扩展。前者意味着买更多性能强悍的硬件,但是总会达到扩展的天花板,且成本…

数字信号处理:傅里叶分析

本文主要参考视频如下: 数字信号处理9-1_线性时不变系统对复指数信号的响应_哔哩哔哩_bilibili 傅里叶分析的主要研究内容如下所示: 注意,计算机中使用的离散傅里叶变换并不是离散时间傅里叶变换; 前四种都是理论上的变换方式&…

mysql 2-21

约束的分类 添加约束 查看表约束 非空约束 唯一性约束 复合的唯一性约束 只要有一个字段不重复,就可以添加成功 主键约束 自增列 mysql 8.0具有持久化,重启服务器会继续自增 外键约束 创建外键 关联必须有唯一性约束,或者是主键 约束等级 …

创意办公:专注 ONLYOFFICE,探索办公新境界

一.ONLYOFFICE 介绍 ONLYOFFICE 是一个基于 Web 的办公套件,提供了文档处理、电子表格和演示文稿编辑等功能。它被设计为一个协作工具,支持多人实时协作编辑文档,并且可以在本地部署或者作为云服务使用。 二.ONLYOFFICE 特点和功能 以下是 …

Eclipse的Java Project的入口main函数

在使用Eclipse创建java project项目的时候,一个项目里面通常只有一个main,那么一个项目里面是否可以有多个main函数呢?其实可以的,但是运行java application的时候要选择执行哪个main函数。 下面举个例子: 1、创建一个…