FreeRTOS——流和消息缓冲区

2023-05-16

FreeRTOS 基础系列文章

 基本对象
  FreeRTOS——任务
  FreeRTOS——队列
  FreeRTOS——信号量
  FreeRTOS——互斥量
  FreeRTOS——任务通知
  FreeRTOS——流和消息缓冲区
  FreeRTOS——软件定时器
  FreeRTOS——事件组

 内存管理
  FreeRTOS——静态与动态内存分配
  FreeRTOS——堆内存管理
  FreeRTOS——栈溢出保护

 代码组织
  FreeRTOS——源代码组织
  FreeRTOS——创建新的项目
  FreeRTOS——配置文件


FreeRTOS——流和消息缓冲区

  • 流缓冲区和消息缓冲区
  • 流缓冲区
    • 阻塞读取和触发级别
    • 阻塞写入
    • 发送完成和接收完成宏
  • 消息缓冲区
    • 调整消息缓冲区的大小
    • 阻塞读取和写入
    • 发送完成和接收完成宏

流缓冲区和消息缓冲区

从 FreeRTOS V10.0.0 可用

流缓冲区是 RTOS 任务到 RTOS 任务,中断到任务通信原语。与大多数其他 FreeRTOS 通信原语不同,它们针对单读取者单写入者场景进行了优化。例如将数据从中断服务程序传递到任务,或在双核 CPU 上从一个微控制器内核传递到另一个内核。数据通过复制传递 —— 数据由发送方复制到缓冲区中,并通过读取从缓冲区中复制出来。

流缓冲区传递一个连续的字节流。消息缓冲区传递大小可变但离散的消息。消息缓冲区使用流缓冲区进行数据传输

流缓冲区一次可以写入任意数量的字节,一次可以读取任意数量的字节,因此是连续的。消息缓冲区每次可以写入变长的消息,但每次读取必须是读取完整的一条消息,因此是离散的。每条消息的长度会在消息之前被写入消息缓冲区,因此实际所需的RAM空间比最大的消息长度还要多一点点,在设计消息缓冲区大小时需要注意这一点。

重要说明:在 FreeRTOS 对象中独一无二的是,流缓冲区实现(消息缓冲区实现也是如此,因为消息缓冲区构建在流缓冲区之上)假定只有一个任务或中断会写入缓冲区(写入者),并且只有一个任务或中断将从缓冲区(读取者)中读取。写入者和读取者不是同一个任务或中断也是安全的,但是,与其他 FreeRTOS 对象不同,有多个不同的写入者或多个不同的读取者是不安全的。如果要有多个不同的写入者,那么应用程序设计者必须将每次调用写入API函数(如 xStreamBufferSend())放在一个临界区中,并使用发送阻塞时间为0。同样,如果有多个不同的读取者,那么应​​用程序设计者必须将每次调用读取 API 函数(例如xStreamBufferReceive())放在临界区中并使用接收阻塞时间为0


流缓冲区

流缓冲区允许将字节流从中断服务程序传递到任务,或从一个任务传递到另一个任务。字节流可以是任意长度,不一定有开始或结束。一次可以写入任意数量的字节,一次可以读取任意数量的字节。数据通过复制传递 —— 数据由发送方复制到缓冲区中,并通过读取从缓冲区中复制出来。

通过在构建中包含FreeRTOS/source/stream_buffer.c源文件来启用流缓冲区功能。

流缓冲区实现使用直接到任务通知。因此,调用那些将调用任务置于阻塞状态的流缓冲区 API 函数可以更改调用任务的通知状态和值。

阻塞读取和触发级别

xStreamBufferReceive()用于在 RTOS 任务中读取流缓冲区的数据。 xStreamBufferReceiveFromISR()) 用于在中断服务程序 (ISR) 中读取流缓冲区的数据。

xStreamBufferReceive() 允许指定阻塞时间。如果指定了非零的阻塞时间,当任务使用xStreamBufferReceive()从流缓冲区读取数据时,如果流缓冲区恰好为空,则该任务将被置于阻塞状态(因此它不消耗任何 CPU 时间并且其他任务可以运行)直到流缓冲区中有指定数量的数据可用,或者阻塞时间到期。等待数据的任务被移出阻塞状态前流缓冲区中必须包含的数据量被称为称为流缓冲区的触发级别。例如:

  • 如果任务在读取触发级别为 1 的空流缓冲区时被阻塞,则当单个字节写入缓冲区或任务的阻塞时间到期时,任务将被解除阻塞。
  • 如果任务在读取触发级别为 10 的空流缓冲区时被阻塞,则在流缓冲区包含至少 10 个字节或任务的阻塞时间到期之前,任务不会被解除阻塞。

如果在达到触发级别之前读取任务的阻塞时间到期,则任务仍然会接收到实际可用的字节。

注意

  • 将触发级别设置为 0 是无效的。尝试将触发级别设置为 0 将导致使用触发级别 1。
  • 指定大于流缓冲区大小的触发级别也是无效的。

流缓冲区的触发级别最初是在创建流缓冲区时设置的 ,然后可以使用xStreamBufferSetTriggerLevel() API 函数进行更改。

阻塞写入

xStreamBufferSend() 用于将数据从 RTOS 任务发送到流缓冲区。 xStreamBufferSendFromISR() 用于将数据从中断服务程序 (ISR) 发送到流缓冲区。

如果在任务使用 xStreamBufferSend() 写入恰好已满的流缓冲区时指定了非零阻塞时间,则该任务将被置于阻塞状态(因此它不消耗任何 CPU 时间并且其他任务可以运行)直到流缓冲区中有可用空间,或者阻塞时间到期。

发送完成和接收完成宏

sbSEND_COMPLETED()(和 sbSEND_COMPLETED_FROM_ISR())

sbSEND_COMPLETED() 是一个宏,在将数据写入流缓冲区时调用(在 FreeRTOS API 函数内部)。它接受一个参数,即要更新数据的流缓冲区的句柄

sbSEND_COMPLETED() 检查流缓冲区上是否有任务被阻塞以等待数据,如果是,则将该任务从阻塞状态中移除。

应用程序设计者可以通过在 FreeRTOSConfig.h 中提供他们自己的 sbSEND_COMPLETED() 实现来更改此默认行为。当流缓冲区用于在多核处理器上的内核之间传递数据时,这很有用。在这种情况下,可以实现 sbSEND_COMPLETED() 以在其他 CPU 内核中生成中断,然后中断服务程序可以使用 xStreamBufferSendCompletedFromISR() API 函数检查并在必要时解除阻塞等待数据的任务。

sbRECEIVE_COMPLETED()(和 sbRECEIVE_COMPLETED_FROM_ISR())

sbRECEIVE_COMPLETED()sbSEND_COMPLETED() 的接收等效项。当从流缓冲区读取数据时,它会被调用(在 FreeRTOS API 函数内部)。该宏检查是否有任务阻塞在流缓冲区上等待缓冲区内的可用空间,如果有,则从阻塞状态中删除任务。与 sbSEND_COMPLETED() 一样,sbRECEIVE_COMPLETED() 的默认行为通过在 FreeRTOSConfig.h 中提供替代实现。


消息缓冲区

消息缓冲区允许将可变长度的离散消息从中断服务程序传递到任务,或从一个任务传递到另一个任务。例如,长度为 10、20 和 123 字节的消息都可以写入和读取同一个消息缓冲区。与使用流缓冲区时不同,10 字节的消息只能作为 10 字节的消息读出,而不能作为单个字节读出 (此所谓离散) 。消息缓冲区建立在流缓冲区之上(即,它们使用流缓冲区实现)。

数据以复制的方式通过消息缓冲区传递 —— 数据由发送方复制到缓冲区中,并通过读取从缓冲区中复制出来。

通过在构建中包含FreeRTOS/source/stream_buffer.c源文件来启用消息缓冲区功能。

消息缓冲区实现使用直接到任务通知。因此,调用那些将调用任务置于阻塞状态的消息缓冲区 API 函数可以更改调用任务的通知状态和值。

调整消息缓冲区的大小

为了使消息缓冲区能够处理可变大小的消息,每条消息的长度在消息本身之前写入消息缓冲区(这在 FreeRTOS API 函数内部发生)。长度存储在一个变量中,其类型由 FreeRTOSConfig.h 中的 configMESSAGE_BUFFER_LENGTH_TYPE 常量设置。如果未定义,configMESSAGE_BUFFER_LENGTH_TYPE 默认为 size_t 类型。size_t 在 32 位架构上通常为 4 字节。因此,例如,configMESSAGE_BUFFER_LENGTH_TYPE 为 4 字节时,将 10 字节的消息写入消息缓冲区实际上会消耗 14 字节的缓冲区空间。同样,将 100 字节的消息写入消息缓冲区实际上将存储 104 字节的缓冲区空间。

阻塞读取和写入

xMessageBufferReceive() 用于在 RTOS 任务中读取消息缓冲区的数据。 xMessageBufferReceiveFromISR() 用于在中断服务程序 (ISR) 中读取消息缓冲区的数据。 xMessageBufferSend() 用于将数据从 RTOS 任务发送到消息缓冲区。 xMessageBufferSendFromISR() 用于从中断服务程序 (ISR) 向消息缓冲区发送数据。

如果在任务使用 xMessageBufferReceive() 从恰好为空的消息缓冲区读取时指定了非零阻塞时间,则该任务将被置于阻塞状态(因此它不消耗任何 CPU 时间并且其他任务可以运行)直到消息缓冲区中的数据可用,或者阻塞时间到期。

如果在任务使用 xMessageBufferSend() 写入恰好已满的消息缓冲区时指定了非零阻塞时间,则该任务将被置于阻塞状态(因此它不消耗任何 CPU 时间并且其他任务可以运行)直到消息缓冲区中有可用空间,或者阻塞时间到期。

发送完成和接收完成宏

由于消息缓冲区建立在流缓冲区上,因此 sbSEND_COMPLETE()sbRECEIVE_COMPLETE() 宏的行为与描述流缓冲区的小节上描述的完全相同 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS——流和消息缓冲区 的相关文章

  • 详解FreeRTOS中的软件定时器

    软件定时器用于让某个任务定时执行 或者周期性执行 比如设定某个时间后执行某个函数 或者每隔一段时间执行某个函数 由软件定时器执行的函数称为软件定时器的回调函数 参考资料 Mastering the FreeRTOS Real Time Ke
  • 【FreeRtos学习笔记】STM32 CubeMx——Timers(定时器)

    目录 1 软件定时器 2 示例程序 2 1 例程功能 2 2 步骤 2 3 实验结果 2 4 函数讲解 1 软件定时器 定时器是MCU常用的外设 我们在学习各种单片机时必然会学习它的硬件定时器 但是 MCU自带的硬件定时器资源是有限的 而且
  • FreeRTOS内核配置说明---FreeRTOS Kernel V10.2.1

    FreeRTOS内核是高度可定制的 使用配置文件FreeRTOSConfig h进行定制 每个FreeRTOS应用都必须包含这个头文件 用户根据实际应用来裁剪定制FreeRTOS内核 这个配置文件是针对用户程序的 而非内核 因此配置文件一般
  • FreeRTOS快速上手

    FreeRTOS使用 一 源码下载和移植文件提取 1 1 源码下载 在网站https sourceforge net projects freertos 可以找到freertos最新的源码 1 2 移植文件提取 根据第一步 我们会得到一个f
  • FreeRTOS软件定时器创建、复位、开始和停止(备忘)

    目录 一 简介 1 1 开发环境 1 2 摘要 二 STM32CubeIDE配置 三 创建定时器 3 1 头文件声明 3 2 工程文件定义 3 3 创建定时器 3 4 开启 复位 和关闭定时器 四 定时器回调函数 一 简介 1 1 开发环境
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • 【FreeRTOS开发问题】FreeRTOS内存溢出

    FreeRTOS内存溢出 如下图所示 FreeRTOS编译完成后可以看到 系统提示无法分配内存到堆 Objects Template axf Error L6406E No space in execution regions with A
  • ZYNQ中FreeRTOS中使用定时器

    使用普通的Timer中断方式时 Timer中断可以正常运行 但是UDP通信进程无法启动 其中TimerIntrHandler是中断服务程序 打印程序运行时间与从BRAM中读取的数据 void SetupInterruptSystem XSc
  • FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

    文章目录 一 关于FreeRTOS 二 FreeRTOS的特点 三 如何在CubeMX上配置FreeRTOS 四 FreeRTOS文档资料 五 同系列博客 一 关于FreeRTOS 1 什么是FreeRTOS FreeRTOS是一个迷你的实
  • FreeRTOS临界区

    FreeRTOS临界区是指那些必须完整运行 不能被打断的代码段 比如有的外设的初始化需要严格的时序 初始化过程中不能被打断 FreeRTOS 在进入临界区代码的时候需要关闭中断 当处理完临界区代码以后再打开中断 FreeRTOS 系统本身就
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • FreeRTOS之软件定时器

    FreeRTOS之软件定时器 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 include sys h include delay h include usart h include led h in
  • FreeRTOS学习(三)开关中断

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 背景知识 Cotex M3的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽 NMI 1个Systick 滴答定时器 Cortex M处理
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • freeRTOS出现任务卡死的情况。

    最近在做一个产品二代升级的项目 代码是上一任工程师留下的 很多BUG 而且融合了HAL库和LL库 以及github上下载的GSM源码 很不好用 我这边是将2G模块换成了4G 且添加了单独的BLE模块 因此只在源码的基础上 去除2G和BLE代
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识 可以参考之前的随笔 FreeRTOS 任务栈大小确定及其溢出检测 这里再次说明 define configTOTAL HEAP SIZE size t 17 1024 这个宏 官方文档解释 configTOTA

随机推荐

  • shell脚本内调用另外一个shell脚本的几种方法

    有时会在一个shell脚本 如test call other shell sh 中调用另外一个shell脚本 如parameter usage sh xff0c 这里总结几种可行的方法 xff0c 这些方法在linux上和windows上
  • 真实项目开发的input标签焦点事件运用

    真实项目开发中input标签焦点事件的运用 开发工具与关键技术 xff1a VisualStudio C 作者 xff1a 落白 撰写时间 xff1a 2019 6 15 在开发项目时有时候会需要这么一个功能效果 xff0c 比如有六个in
  • layui use 定义js外部引用函数

    layui use 加载layui define 定义的模块 xff0c 当外部 js 或 onclick调用 use 内部函数时 xff0c 需要在 use 中定义 window 函数供外部引用 window span class tok
  • shell脚本中内嵌可执行文件/文件

    示例 test sh span class token operator span span class token operator span bin span class token operator span sh 追加在shell脚
  • 浅谈嵌入式

    浅谈嵌入式 相比耳熟能详的互联网行业 xff0c 嵌入式这几个字眼出现在公众眼前的几率可以达到忽略不计的程度 xff0c 这不仅说明嵌入式行业的工程师数量远比互联网少 xff0c 同时意味着嵌入式行业的吸引力貌似低于互联网 但是 xff0c
  • C语言系列(一):C语言程序概述

    C语言作为一种高级程序设计语言 xff0c 既有高级语言的方便性 灵活性和通用性等特点 xff0c 又兼具低级语言的特性 xff0c 提供程序员直接操作计算机硬件的功能 适合各种类型的软件开发 xff0c 深受软件工程技术人员的青睐 嵌入式
  • C语言系列(三):基本数据类型与表达式

    计算机中的数据不单是简单的数字 xff0c 所有计算机处理的信息 xff0c 包括文字 声音 图像等都是以一定的数据形式存储的 xff0c 数据在内存中保存 xff0c 存放的情况由数据类型决定 C语言的数据类型 基本类型 xff1a 整型
  • C语言系列(四): 分支结构程序设计

    选择结构是程序设计3种基本结构之一 xff0c 通过判定给定的条件是否成立选择需要执行的操作 C语言提供了条件语句 if语句和switch语句 用以实现选择结构的程序设计 xff0c 条件通常用关系表达式或逻辑表达式表示 C语言提供3种逻辑
  • C语言系列(五):循环结构程序设计

    循环结构是结构化程序设计的基本结构之一 xff0c C语言提供了三种循环结构语句 while语句 xff0c do while语句和for语句 for语句在C语言系列 xff08 二 xff09 xff1a 用C语言编写程序已经讲解 xff
  • C语言系列(六):函数与预编译处理

    模块化程序设计方法 在程序设计与开发中 xff0c 随着解决问题的复杂化 xff0c 编写程序的代码也更加复杂 一方面 xff0c 大量的程序语句会使程序的逻辑结构产生混乱 xff0c 给程序的编写 阅读和维护带来困难 xff1b 另一方面
  • Linux驱动开发经典面试简答题

    1 Linux设备中字符设备与设备有什么主要的区别 xff1f 请分别举例一些实际的设备说出它们是哪一类设备 字符设备 xff1a 字符设备是个能够像字节流 xff08 类似文件 xff09 一样被访问的设备 xff0c 由字符设备驱动程序
  • CMake中cmake_host_system_information的使用

    CMake中的cmake host system information命令用于查询各种主机系统信息 xff0c 其格式如下 xff1a cmake host system information RESULT lt variable gt
  • 一文知晓嵌入式Linux

    嵌入式Linux是什么 嵌入式Linux跟桌面Linux一样 xff0c 是一个操作系统 从单片机走过来的童鞋往往习惯于直接控制寄存器 xff0c 事必躬亲 xff0c 从零开始实现想要的功能 而在嵌入式Linux的世界里 xff0c 我们
  • 修改i.mx6ull Linux内核 启动logo

    1 制作Linux内核需要的开机logo xff08 ppm格式 xff09 1 1在Ubuntu系统上安装netpdm工具 命令如下 xff1a span class token macro property sudo apt get i
  • keil5编译错误error: #5: cannot open source input file “core_cm3.h“: No such file or directory

    用Keil vision5编译时出现 xff1a error 5 cannot open source input file core cm3 h No such file or directory 可能是MDK版本太新了 xff0c 我装
  • IPv6基础详解

    IPv6 由于internet规模的扩大 xff0c IPv4地址空间已经消耗殆尽 xff0c IETF在90年代提出了下一代互联网协议IPv6 xff0c IPv6支持几乎无限的地址空间 xff0c 并且配置更加简单 xff0c IPv6
  • Pycharm中debug使用学习

    1 运行环境 1 1 运行 xff1a 先确认项目运行环境 点击右下角python查看 向任务中添加环境 xff0c 一般加入anaconda的环境 xff0c 配置方便 切换到自己所需环境 添加运行环境 初次搭建 xff0c 哔哩哔哩中新
  • 对项目的梳理、流程和总结

    过程 我在制作 中国汽车技术研究中心 的一个演讲PPT前 xff0c 也已经有第一版的基础了 xff0c 不过 xff0c 第一版的PPT客户并不满意 xff0c 因为这个风格不是客户想要的 xff0c 所以客户对第一版的PPT并不是很满意
  • 【ROS】xxx is neither a launch file in package xxx nor is xxx a launch file name……解决

    在ros中新增加一个功能包时 xff0c 如果没有处理得当的话 xff0c 在执行时很有可能报如下错误 xff1a xxx is neither a launch file in package xxx nor is xxx a launc
  • FreeRTOS——流和消息缓冲区

    FreeRTOS 基础系列文章 基本对象 FreeRTOS 任务 FreeRTOS 队列 FreeRTOS 信号量 FreeRTOS 互斥量 FreeRTOS 任务通知 FreeRTOS 流和消息缓冲区 FreeRTOS 软件定时器 Fre