十四、FreeRTOS之FreeRTOS任务相关API函数

本节主要介绍以下内容:

1,队列简介(了解)

2,队列结构体介绍(熟悉)

3,队列相关API函数介绍(熟悉)

4,队列操作实验(掌握)

5,队列相关API函数解析(熟悉)

6,课堂总结(掌握)

一,队列简介(了解)

1.1 队列的相关概念

队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递

类似全局变量?假设有一个全局变量a = 0,现有两个任务都在写这个变量a

 全局变量的弊端数据无保护,导致数据不安全,当多个任务同时对该变量操作时,数据易受损

使用队列的情况如下:

 

读写队列做好了保护,防止多任务同时访问冲突;我们只需要直接调用API函数即可,简单易用!

FreeRTOS基于队列, 实现了多种功能,其中包括队列集、互斥信号量、计数型信号量、二值信号量、 递归互斥信号量,因此很有必要深入了解 FreeRTOS 的队列 。

在队列中可以存储数量有限、大小固定的数据。队列中的每一个数据叫做“队列项目”,队列能够存储“队列项目”的最大数量称为队列的长度

在创建队列时,就要指定队列长度以及队列项目的大小! 

1.2 FreeRTOS队列特点:

1、数据入队出队方式:队列通常采用“先进先出”(FIFO)的数据存储缓冲机制,即先入队的数据会 先从队列中被读取,FreeRTOS中也可以配置为“后进先出”LIFO方式;

2、数据传递方式:FreeRTOS中队列采用实际值传递,即将数据拷贝到队列中进行传递, FreeRTOS采用拷贝数据传递,也可以传递指针,所以在传递较大的数据的时候采用指针传递

3、多任务访问:队列不属于某个任务,任何任务和中断都可以向队列发送/读取消息

4、出队、入队阻塞:当任务向一个队列发送消息时,可以指定一个阻塞时间,假设此时当队列已满无法入队

若阻塞时间为0  :直接返回不会等待;
若阻塞时间为0~port_MAX_DELAY  :等待设定的阻塞时间,若在该时间内还无法入队,超时后直接返回不再等待;
若阻塞时间为port_MAX_DELAY  :死等,一直等到可以入队为止。出队阻塞与入队阻塞类似;
1.2.1 入队阻塞:

队列满了,此时写不进去数据;

 ①将该任务的状态列表项挂载在pxDelayedTaskList

 ②将该任务的事件列表项挂载在xTasksWaitingToSend

1.2.2 出队阻塞:

队列为空,此时读取不了数据;

 ①将该任务的状态列表项挂载在pxDelayedTaskList

 ②将该任务的事件列表项挂载在xTasksWaitingToReceive

问题:当多个任务写入消息给一个满队列时,这些任务都会进入阻塞状态,也就是说有多个任务  在等待同一 个队列的空间。那当队列中有空间时,哪个任务会进入就绪态?

当多个任务写入消息给一个满队列时,任务优先级最高的任务会进入阻塞态,

当队列中有空间时,优先级最高的会进入就绪态,当任务优先级相同时,等待时间最久的任务会进入就绪态。

1.3 队列操作基本过程

①创建队列

 ②往队列写入第一个消息

 ③往队列写入第二个消息

④从队列读取第一个消息

,队列结构体介绍(熟悉)

当用于队列使用时:

 当用于互斥信号量和递归互斥信号量时 :

 队列结构体整体示意图:

三、队列相关API函数介绍(掌握)

使用队列的主要流程:创建队列-> 写队列 -> 读队列。

3.1 创建队列相关API函数介绍:

函数

描述

xQueueCreate()

动态方式创建队列

xQueueCreateStatic()

静态方式创建队列

 动态和静态创建队列之间的区别:队列所需的内存空间由 FreeRTOS FreeRTOS 管理的堆中分配,而静态创建需要用户自行分配内存。

 此函数用于使用动态方式创建队列,队列所需的内存空间由 FreeRTOS FreeRTOS 管理的堆中分配

形参

描述

uxQueueLength

队列长度

uxItemSize

队列项目的大小

返回值

描述

NULL

队列创建失败

其他值

队列创建成功,返回队列句柄

前面说 FreeRTOS 基于队列实现了多种功能,每一种功能对应一种队列类型,队列类型的 queue.h 文件中有定义:

3.2 往队列写入消息API函数介绍:

函数

描述

xQueueSend()

往队列的尾部写入消息

xQueueSendToBack()

xQueueSend()

xQueueSendToFront()

往队列的头部写入消息

xQueueOverwrite()

覆写队列消息(只用于队列长度为 1 的情况)

xQueueSendFromISR()

在中断中往队列的尾部写入消息

xQueueSendToBackFromISR()

xQueueSendFromISR()

xQueueSendToFrontFromISR()

在中断中往队列的头部写入消息

xQueueOverwriteFromISR()

在中断中覆写队列消息(只用于队列长度为 1 的情况)

3.2.1  队列写入消息

可以看到这几个写入函数调用的是同一个函数xQueueGenericSend( ),只是指定了不同的写入位置!

队列一共有 3 种写入位置 :

 注意:覆写方式写入队列,只有在队列的队列长度为 1 时,才能够使用

往队列写入消息函数入口参数解析:

形参

描述

xQueue

待写入的队列

pvItemToQueue

待写入消息

xTicksToWait

阻塞超时时间

xCopyPosition

写入的位置

返回值

描述

pdTRUE

队列写入成功

errQUEUE_FULL

队列写入失败

 3.3 从队列读取消息API函数介绍:

函数

描述

xQueueReceive()

从队列头部读取消息,并删除消息

xQueuePeek()

从队列头部读取消息

xQueueReceiveFromISR()

在中断中从队列头部读取消息,并删除消息

xQueuePeekFromISR()

在中断中从队列头部读取消息

 3.3.1 从队列头部读取消息,并删除消息
BaseType_t    xQueueReceive( QueueHandle_t   xQueue,  void *   const pvBuffer,  TickType_t   xTicksToWait )

此函数用于在任务中,从队列中读取消息,并且消息读取成功后,会将消息从队列中移除。

形参

描述

xQueue

待读取的队列

pvBuffer

信息读取缓冲区

xTicksToWait

阻塞超时时间

返回值

描述

pdTRUE

读取成功

pdFALSE

读取失败

 3.3.2 从队列头部读取消息
BaseType_t   xQueuePeek( QueueHandle_t   xQueue,   void * const   pvBuffer,   TickType_t   xTicksToWait )

此函数用于在任务中,从队列中读取消息, 但与函数 xQueueReceive()不同,此函数在成功读取消息后,并不会移除已读取的消息!

形参

描述

xQueue

待读取的队列

pvBuffer

信息读取缓冲区

xTicksToWait

阻塞超时时间

返回值

描述

pdTRUE

读取成功

pdFALSE

读取失败

 四、队列操作实验(掌握)

4.1、实验目的:

学习 FreeRTOS 的队列相关API函数的使用 ,实现队列的入队和出队操作。

4.2、实验设计:

将设计三个任务:start_task、task1、task2、task3

四个任务的功能如下:

  • start_task:用来创建task1和task2以及task3任务
  • task1:当按键key0或key1按下,将键值拷贝到队列key_queue(入队),当按键key_up按下,将传输大数据,这里拷贝大数据的地址到队列big_date_queue中
  • task2:读取队列key_queue中的消息(出队),打印出接收到的键值
  • 从队列big_date_queue读取大数据地址,通过地址访问大数据

4.3 实验代码

demo.c

今天没空格了。明日再更

五,队列相关API函数解析(熟悉)

又到了撸源码的时刻了......

5.1、队列的创建API函数:xQueueCreate( )

5.2、往队列写入数据API函数(入队):xQueueSend( )

5.3、从队列读取数据API函数(出队): xQueueReceive( )

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

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

相关文章

RocketMQ-核心编程模型

RocketMQ的消息模型 深入理解RocketMQ的消息模型 RocketMQ客户端基本流程 RocketMQ基于Maven提供了客户端的核心依赖&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version&…

Guava中的函数式编程

第1章&#xff1a;引言 大家好&#xff01;今天小黑要和咱们聊聊&#xff0c;在Java中使用Guava来进行函数式编程。首先&#xff0c;让我们来聊聊什么是函数式编程。简单来说&#xff0c;函数式编程是一种编程范式&#xff0c;它将计算视为函数的评估&#xff0c;避免使用程序…

git stash 对当前分支修改的内容进行暂存

我们在开发的时候往往会遇到这种情况, 在一个分支开发,写了不少内容,但是突然来了一个紧急的需求需要切换分支,去做这个需求,但是当前的分支又因为没有开发完成,不想形成一条无效的commit记录,这时我们就到暂存上场了 git stash 暂存 // 切分支之前 对当前分支修改的内容进行暂…

uni-app 设置tabBar的setTabBarBadge购物车/消息等角标

目录 一、效果二、代码实现二、全部代码1.index.vue2.cart.vue 三、真实案例参考最后 一、效果 二、代码实现 只要使用uni.setTabBarBadge和uni.removeTabBarBadge来进行对红点的设置和移除。 主要代码&#xff1a; //设置红点 uni.setTabBarBadge({index: 1, // 底部菜单栏…

西南科技大学C++程序设计实验七(继承与派生二)

一、实验目的 1. 掌握多继承程序设计 2. 掌握虚基类编程 3. 拓展学习可视化程序设计中的继承与派生应用 二、实验任务 重点:掌握虚基类的定义与实现,拓展其功能。 阅读分析、完善程序。下面程序(1)与程序(2)分别是没有使用虚基类和使用虚基类的代码,其中A是最上层基…

Vue 生成包含数字大小写字母的随机字符串

generateRandomID() {const characters 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;const idLength 30; // 字符串长度 这里生成30位的let randomID ;for (let i 0; i < idLength; i) {const randomIndex Math.floor(Math.random() * characters…

【开源】基于Vue+SpringBoot的网上药店系统

项目编号&#xff1a; S 062 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S062&#xff0c;文末获取源码。} 项目编号&#xff1a;S062&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药…

一:对爬虫的简单认识

一&#xff1a;爬虫前导知识 1.爬虫引入&#xff1a; ​ 网络爬虫又称为网络蜘蛛&#xff1b;网络蚂蚁&#xff1b;网络机器人等&#xff0c;可以自动高效地从互联网的海量信息中浏览获取到我们感兴趣的信息&#xff0c;在浏览信息的时候需要按照我们制定的规则进行&#xff…

打开率高的开发信主题?邮件的标题怎么写?

如何写高点击率的开发信主题&#xff1f;推荐的邮件标题模板&#xff1f; 一封高效的开发信可以是你争取客户的第一步。但是&#xff0c;要让你的邮件在收件人的收件箱中引起关注并被打开&#xff0c;你需要选择一个吸引人的主题。蜂邮将介绍一些打开率高的开发信主题&#xf…

tensorflow模型的加载及保存,以及在C++端的部署

一、模型保存和加载 参考文章:TensorFlow2.0 —— 模型保存与加载 方法一、 仅保存模型权重(model.save_weights) 有两种保存模型权重的方法,一种是保存.h5形式。model.save_weights("adasd.h5") # 模型权重保存 model.load_weights("adasd.h5") # 模型…

数组划分问题

文章目录 移动零 移动零 class Solution { public: void moveZeroes(vector<int>& nums) {int dest -1;int cur 0;while(cur < nums.size()){if (nums[cur] ! 0){dest;swap(nums[cur], nums[dest]);}cur;} } };

前端路由(front-end routing)和后端路由(back-end routing)的区别

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

C# WebSocket简单使用

文章目录 前言Fleck调试工具初始化 前言 最近接到了一个需求&#xff0c;需要网页实现上位机的功能。那就对数据传输的实时性要求很高。那就只能用WebSocket了。这里简单说一下我的WebSocket如何搭建 Fleck C# WebSocket(Fleck) 客户端:html Winfrom Fleck Github官网 我这里…

【蓝桥杯选拔赛真题74】Scratch九九乘法表 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析

目录 scratch九九乘法表 一、题目要求 编程实现 二、案例分析 1、角色分析

Python下划线的五个作用介绍,初学者的妙招

文章目录 前言1、用在 Python 解释器&#xff0c;表示上一次的执行结果2、代码中一个独立的下划线&#xff0c;表示这个变量不重要3、双下划线开头和结尾的方法&#xff0c;是魔术方法4、作为变量名中间的一部分5、作为数字中间的一部分&#xff0c;更易读关于Python技术储备一…

我的NPI项目之Android 安全系列 -- 天地混沌初开

最近在因为有新项目启动&#xff0c;目前处在kickoff之后research阶段&#xff0c;预计在1st March能拿到到Pre-EVT&#xff1b; 在此之前最主要的就是需求分析/可行性分析/风险评估。 而对于软件来说&#xff0c;作为传说中的software project leader&#xff0c;要做的最重要…

个人测试面试问题总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f4d1;设计软件测试用例的方…

云数据库详细介绍

为您的项目选择正确的数据库是一项复杂的任务。许多数据库选项都适合不同的用例&#xff0c;很快就会导致决策疲劳。 我们希望这份备忘单提供高级指导&#xff0c;以找到符合您项目需求的正确服务并避免潜在的陷阱。 注意&#xff1a;Google 关于其数据库用例的文档有限。尽管…

CleanMyMac X2024最新版本mac优化软件好用吗?

为了维护mac系统健康&#xff0c;优化系统功能&#xff0c;我们需要定期给电脑进行清理。那么作为mac清理软件CleanMyMac X软件具备哪些独特性和实用性呢&#xff1f;今天就给大家说明一下。 CleanMyMac X全新版下载如下: https://wm.makeding.com/iclk/?zoneid49983 1、 简…

腾讯云轻量应用服务器挂载对象存储详细说明

腾讯云轻量对象存储LighthouseCOS是腾讯云专为中小企业开发者打造的轻量级数据存储服务&#xff0c;适用于云端网站、小程序、课堂演示、云盘/图床等场景下的数据存储和处理任务。腾讯云百科txybk.com详细介绍腾讯云轻量对象存储使用、开通和收费价格说明&#xff1a; 轻量对象…