多任务互斥及队列

一.互斥的引入
在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() 函数来发送数据,以便安全地在中断上下文中操作队列。

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

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

相关文章

win10开机黑屏,explorer.exe文件找不到

一、问题 今天清理c盘时,不知道做了什么操作,把相关文件弄没了,然后电脑开机黑屏,进入不了桌面,能看见鼠标。 二、解决办法 网上搜了一些解决办法:ctrlshftdelete 打开任务管理器》运行新任务》输入expl…

MySQL数据库基础(十二):子查询(三步走)

文章目录 子查询(三步走) 一、子查询(嵌套查询)的介绍 二、子查询的使用 三、总结 子查询(三步走) 一、子查询(嵌套查询)的介绍 在一个 select 语句中,嵌入了另外一个 select …

《Linux C编程实战》笔记:消息队列

消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识。与管道不同的是消息队列存放在内核中,只有在内核重启(即操作系统重启)或显示地删除一个消息队列时,该消息队列才会被真正的删除。 操作消息…

OPPO公布全新AI战略,AI 手机时代再提速

2024年2月20日,深圳——今日OPPO 举办 AI 战略发布会,分享新一代 AI 手机的四大能力特征,展望由AI驱动的手机全栈革新和生态重构的趋势,并发布由OPPO AI 超级智能体和 AI Pro 智能体开发平台组成的OPPO 1N 智能体生态战略&#xf…

Android基础Adapter适配器详解

一、概念 Adapter是后端数据和前端显示UI的适配器接口。常见的View如ListView、GridView等需要用到Adapter. BaseAdapter:抽象类,实际开发中继承这个类并且重写相关方法,用得最多的一个Adapter! ArrayAdapter:支持泛型…

数字化商品管理:革新鞋服零售模式,引领智能商业新时代

随着科技的快速发展,数字化浪潮席卷各行各业,鞋服零售企业亦不例外。在这个新时代,数字化商品管理不仅成为鞋服零售企业革新的关键,更是其引领智能商业浪潮的重要引擎。本文将围绕数字化商品管理如何深刻影响鞋服零售模式&#xf…

力扣 309. 买卖股票的最佳时机含冷冻期

题目来源:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/ C题解:动态规划 状态1:表示持有股票。更新为之前持有股票(dp[i-1][0])或者不持有股票且不处于冷冻期后买入&…

make_shared_for_overwrite

这个函数用来malloc数组,但不初始化。 不过这个仅限于内置类型。如果是用户写的,就会增加自动初始化(调用客户写的初始化)。

Java基于SSM的羽毛球馆管理系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

[word] word带圈数字20以上 #笔记#笔记

word带圈数字20以上 办公中有时候需要用到带圈数字,超过20的数字就不能直接编辑了,那么20以上带圈数字要怎么输入呢?其实通过小技巧就能完成的,接下来就给大家介绍下呢,一起看看吧! 20以上带圈数字输入技巧…

Java Swing游戏开发学习1

不使用游戏引擎,只使用Java SDK开发游戏的学习。 游戏原理 图片来自某大佬视频讲解 原理结合实际代码 public class GamePanel extends Jpanel implements Runnable {...run(){}// 详情看下图... }项目结构 运行效果 代码code 在我的下载里面可以找到&#xf…

USART(串口发送接受单字节)

一、硬件 差分信号不需要太大的压差。在相同的电磁干扰的环境下,因为是双扭线,两根线受干扰的程度是一样的,所以压差相对不变。提高抗干扰能力。485是双绞线传输取的是两线的压差。一般来说受干扰后同步变化,比如都升0.5V或都降5…

PROBIS铂思金融破产后续:ASIC牌照已注销

2024年1月31日,PROBIS铂思金融的澳大利亚ASIC牌照 (AFSL 338241) 被注销《差价合约经纪商PROBIS宣布破产,澳大利亚金融服务牌照遭暂停》,这也就意味着,PROBIS铂思金融目前已经没有任何金融牌照。 值得注意的是,时至今日…

Python实现线性逻辑回归和非线性逻辑回归

线性逻辑回归 # -*- coding: utf-8 -*- """ Created on 2024.2.20author: rubyw """import matplotlib.pyplot as plt import numpy as np from sklearn.metrics import classification_report from sklearn import preprocessing from sklearn…

vmware升级处理vib包冲突的问题

一、问题截图 通过mgmt挂载iso: 通过vcenter升级的截图: 通过cli升级报错:二、解决办法 1、删除冲突的vib 2、重启后继续升级 三、解决步骤 1、查看那些vib冲突需要被清理 2、进行cli命令进行清理 esxcli software vib list | grep xxxx esxcli s…

hung task, soft lockup, hard lockup, workqueue stall

hung task,soft lockup,hard lockup,workqueue stall 是 linux 内核中的异常检测机制,这 4 个检测均是通过时间维度上的检测来判断异常。 在时间维度上的检测机制,有两个核心的点: (1&#xff…

多个.C 文件关于全局变量如何使用

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…

新 Mac 使用指南

文章目录 1、安装软件2、修改启动台3、修改 iCloud 设置、同步数据4、管理文件夹5、管理侧边栏6、设置快捷键 更新版本出现问题(有机会更新下问题和解决方式),重装 Sonoma,获得了一个新的 macOS。以新用户的视角来看,有…

sora生成高质量视频的原理

Sora是怎样生成视频的? 写在前面 Sora 是 OpenAI 在日前发布的超强视频生成 AI,旨在探索 AI 如何在理解真实世界运动和交互方面做得更好Sora目前无灰度体验 面临挑战 Sora面对的挑战就像是需要处理和理解来自世界各地、不同设备拍摄的数以百万计的图…

Google账号批量注册指南:如何防止多账号被封?

电子邮件地址对于在线帐户至关重要,但它们可能被滥用于发送垃圾邮件。因此Google使用先进的算法来检测可疑的注册和验证尝试,保护用户免受垃圾邮件和其他有害活动的侵害,所以如果需要批量注册多个Google帐户,需要做好账号防关联&a…