rtthread学习笔记系列-- 23 环形缓冲块 ringblock
文章目录
- 23 环形缓冲块 ringblock
- 23.1 初始化
- 23.2 PUT & GET 块
- 23.3 块释放
- 23.4 rt_rbb_blk_queue_get
- 23.5 rt_rbb_blk_alloc
https://github.com/wdfk-prog/RT-Thread-Study
23 环形缓冲块 ringblock
环形块状缓冲区简称为:rbb。与传统的环形缓冲区不同的是,rbb 是一个由很多不定长度的块组成的环形缓冲区,而传统的环形缓冲区是由很多个单字节的 char 组成。rbb 支持 零字节拷贝 。所以 rbb 非常适合用于生产者顺序 put 数据块,消费者顺序 get 数据块的场景,例如:DMA 传输,通信帧的接收与发送等等
ringblk: 是由 多个不同长度 的 block 组成的,ringbuff : 是由单字节的数据组成的。ringblk 每一个 block 有多少个字节可以由用户自己设定。
ringblk 支持零字节拷贝(不需要额外的 memcpy 操作)。所以 rbb 非常适合用于生产者顺序 put 数据块,消费者顺序 get 数据块的场景,例如:DMA 传输,通信帧的接收与发送等等。
23.1 初始化
- 初始化块链表和释放链表
- 对每一个块链表进行初始化,并插入到释放链表中
23.2 PUT & GET 块
- put
block->status = RT_RBB_BLK_PUT;
- get
- 判断块链表为空,则返回NULL
- 遍历链表,找到具有
RT_RBB_BLK_PUT状态的块,设置状态为RT_RBB_BLK_GET,返回块指针
23.3 块释放
- 从块链表总移除块,并插入到释放链表中
23.4 rt_rbb_blk_queue_get
//遍历块链表for (; node; node = tmp, tmp = rt_slist_next(node)){ 如果下一个 block 为空if (!last_block){// // 获取 list 节点上的结构体的地址last_block = rt_slist_entry(node, struct rt_rbb_blk, list);if (last_block->status == RT_RBB_BLK_PUT){// 保存第一个 blockblk_queue->blocks = last_block;blk_queue->blk_num = 0;}else{// 没有找到可用的 blocklast_block = RT_NULL;continue;}}else{block = rt_slist_entry(node, struct rt_rbb_blk, list);/*1.当前块没有放置状态2.最后一个块和当前块是不连续的3.data_total_size将超出范围*/if (block->status != RT_RBB_BLK_PUT ||last_block->buf > block->buf ||data_total_size + block->size > queue_data_len){break;}/* backup last block */last_block = block;}/* remove current block */data_total_size += last_block->size;last_block->status = RT_RBB_BLK_GET;blk_queue->blk_num++;}
23.5 rt_rbb_blk_alloc
rt_rbb_blk_trt_rbb_blk_alloc(rt_rbb_trbb, rt_size_tblk_size){new_rbb = find_empty_blk_in_set(rbb); // 找到一个空闲块// 判断申请出来的块是不是在 最大范围之内if (rt_slist_len(&rbb->blk_list) < rbb->blk_max_num && new_rbb){if (rt_slist_len(&rbb->blk_list) > 0) // 检查是不是第一次申请blk{ // 获取头节点的结构体起始地址head = rt_slist_first_entry(&rbb->blk_list, struct rt_rbb_blk, list);// 获取尾节点的结构体起始地址tail = rt_slist_tail_entry(&rbb->blk_list, struct rt_rbb_blk, list);if (head->buf <= tail->buf) // 头节点数据缓冲区的地址小于尾节点的数据缓存区的地址{/*** head tail* +--------------------------------------+-----------------+------------------+* | empty2 | block1 | block2 | block3 | empty1 |* +--------------------------------------+-----------------+------------------+* rbb->buf*/// 求出空 block 的大小empty1 = (rbb->buf + rbb->buf_size) - (tail->buf + tail->size);empty2 = head->buf - rbb->buf;// 判断新的 block 可以存放的区域if (empty1 >= blk_size){ // 给 block 结构体赋值rt_slist_append(&rbb->blk_list, &new_rbb->list);new_rbb->status = RT_RBB_BLK_INITED;new_rbb->buf = tail->buf + tail->size;new_rbb->size = blk_size;}elseif (empty2 >= blk_size){// 给 block 结构体赋值rt_slist_append(&rbb->blk_list, &new_rbb->list);new_rbb->status = RT_RBB_BLK_INITED;new_rbb->buf = rbb->buf;new_rbb->size = blk_size;}else{/* no space */new_rbb = NULL;}}else{/*** tail head* +----------------+-------------------------------------+--------+-----------+* | block3 | empty1 | block1 | block2 |* +----------------+-------------------------------------+--------+-----------+* rbb->buf*/// 获取空闲的空间empty1 = head->buf - (tail->buf + tail->size);// 判断剩余空间是否够本次的分配if (empty1 >= blk_size){// 给 block 结构体赋值rt_slist_append(&rbb->blk_list, &new_rbb->list);new_rbb->status = RT_RBB_BLK_INITED;new_rbb->buf = tail->buf + tail->size;new_rbb->size = blk_size;}else{ /* no space */new_rbb = NULL;}}}else{/* the list is empty */rt_slist_append(&rbb->blk_list, &new_rbb->list); // 把bew_rbb 链表插入到 rbbnew_rbb->status = RT_RBB_BLK_INITED; // 修改状态为 已经初始化new_rbb->buf = rbb->buf; // 设置缓冲区new_rbb->size = blk_size;// 设置块大小}}else{new_rbb = NULL;}return new_rbb;}相关文章:
rtthread学习笔记系列-- 23 环形缓冲块 ringblock
文章目录 23 环形缓冲块 ringblock23.1 初始化23.2 PUT & GET 块23.3 块释放23.4 rt_rbb_blk_queue_get23.5 rt_rbb_blk_alloc https://github.com/wdfk-prog/RT-Thread-Study 23 环形缓冲块 ringblock 环形块状缓冲区简称为:rbb。与传统的环形缓冲区不同的是&…...
HunyuanVideo 文生视频模型实践
HunyuanVideo 文生视频模型实践 flyfish 运行 HunyuanVideo 模型使用文本生成视频的推荐配置(batch size 1): 模型分辨率(height/width/frame)峰值显存HunyuanVideo720px1280px129f60GHunyuanVideo544px960px129f45G 本项目适用于使用 N…...
Qt——QTableWidget 限制单元格输入范围的方法(正则表达式输入校验法、自定义代理类MyItemDelegrate)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》...
深度学习论文: CAS-ViT: Convolutional Additive Self-attention Vision Transformers
深度学习论文: CAS-ViT: Convolutional Additive Self-attention Vision Transformers for Efficient Mobile Applications CAS-ViT: Convolutional Additive Self-attention Vision Transformers for Efficient Mobile Applications PDF:https://arxiv.org/pdf/2408.03703 PyT…...
PyCharm文档管理
背景:使用PyCharmgit做文档管理 需求:需要PyCharm自动识别docx/xslx/vsdx等文件类型,并在PyCharm内点击文档时唤起系统内关联应用(如word、excel、visio) 设置步骤: 1、file -》 settings -》file types 2、在Files opened i…...
QNAP 上常用的几款软件
当我们谈到 NAS(Network Attached Storage)时,QNAP 凭借多年的产品迭代、稳定的硬件性能和不断丰富的软件生态,已成为很多家庭及中小型企业的首选。除了存储本身,QNAP 提供的各种官方软件和应用,也为用户带…...
LabVIEW智能水肥一体灌溉控制系统
本文详细介绍了一种基于LabVIEW的智能水肥一体灌溉控制系统的设计与实现。该系统采用模糊控制策略,能够自动调节土壤湿度和肥液浓度,满足不同作物在不同生长阶段的需求,有效提高水肥利用效率,对现代精准农业具有重要的实践和推广价…...
提问:玩游戏输入法总弹出来咋回事哎
玩游戏时输入法总弹出来的问题,通常与电脑的输入法设置、操作系统配置以及游戏程序的兼容性有关。以下是一些常见的解决方法: 一、修改输入法快捷键 禁用不必要的输入法: 在系统的语言设置中,暂时禁用非活动的输入法,…...
链家房价数据爬虫和机器学习数据可视化预测
完整源码项目包获取→点击文章末尾名片!...
【微服务】面试题 5、分布式系统理论:CAP 与 BASE 详解
分布式系统理论:CAP 与 BASE 详解 一、CAP 定理 背景与定义:1998 年由加州大学科学家埃里克布鲁尔提出,分布式系统存在一致性(Consistency)、可用性(Availability)、分区容错性(Part…...
第十二章:算法与程序设计
文章目录: 一:基本概念 1.算法与程序 1.1 算法 1.2 程序 2.编译预处理 3.面向对象技术 4.程序设计方法 5.SOP标志作业流程 6.工具 6.1 自然语言 6.2 流程图 6.3 N/S图 6.4 伪代码 6.5 计算机语言 二:程序设计 基础 1.常数 …...
RAG技术:是将知识库的文档和问题共同输入到LLM中
RAG技术 RAG技术是将知识库的文档和问题共同输入到LLM中 RAG技术是先从知识库中检索出与问题相关的文档片段,然后将这些检索到的文档片段与问题一起输入到LLM中进行回答。具体过程如下: 文本分块 由于LLM的上下文窗口有限,需要将长文本资料分割成较小的块,以便LLM能够有…...
持续集成 01|Gitee介绍、Pycharm使用Gitee
目录 一、理论 二、 git的简介与安装 三、Gitee 1、注册网易163邮箱 2、注册Gitee账号 3、git和gitee管理代码工作原理 三、PyCharm安装配置Gitee 四、Pycharm使用Gitee插件的五种场景 1、将 Gitee的新仓库 Checkout(检出)到 Pycharm中 2、推送…...
信息安全、网络安全和数据安全的区别和联系
信息安全、网络安全和数据安全是信息安全领域的三大支柱,它们之间既存在区别又相互联系。以下是对这三者的详细比较: 一.区别 1.信息安全 定义 信息安全是指为数据处理系统建立和采用的技术和管理的安全保护,保护计算机硬件、软件和数据不…...
C++实现设计模式---抽象工厂模式 (Abstract Factory)
抽象工厂模式 (Abstract Factory) 抽象工厂模式 是一种创建型设计模式,提供一个接口,用于创建一组相关或互相依赖的对象,而无需指定它们的具体类。 意图 提供一个创建一组相关对象的接口,而无需指定它们的具体类。解决产品对象之…...
K8S开启/关闭审计日志
K8S默认禁用审计 开启/关闭 k8s 审计日志 默认 Kubernetes 集群不会输出审计日志信息。通过以下配置,可以开启 Kubernetes 的审计日志功能。 准备审计日志的 Policy 文件配置 API 服务器,开启审计日志重启并验证 准备审计日志 Policy 文件 apiVersio…...
css盒子水平垂直居中
目录 1采用flex弹性布局: 2子绝父相margin:负值: 3.子绝父相margin:auto: 4子绝父相transform: 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接:文字水平垂直居中-CSDN博客 以下为盒子…...
px、em 和 rem 的区别:深入理解 CSS 中的单位
文章目录 前言一、px - 像素 (Pixel)二、em - 相对父元素字体大小 (Ems)三、rem - 相对于根元素字体大小 (Root Ems)四、综合比较结语 前言 在CSS中,px、em和rem是三种用于定义尺寸(如宽度、高度、边距、填充等)的长度单位。它们各自有不同的…...
基于STM32设计的粮食仓库(粮仓)环境监测系统
一、前言 1.1 项目开发背景 随着现代农业的发展和粮食储存规模的扩大,粮仓环境的智能化监控需求日益增长。传统的粮仓管理方式通常依赖人工检测和定期巡查,效率低下且容易出现疏漏,无法及时发现潜在问题,可能导致粮食受潮、霉变…...
【后端面试总结】tls中.crt和.key的关系
tls中.crt和.key的关系 引言 在现代网络通信中,特别是基于SSL/TLS协议的加密通信中,.crt和.key文件扮演着至关重要的角色。这两个文件分别代表了数字证书和私钥,是确保通信双方身份认证和数据传输安全性的基石。本文旨在深入探讨TLS中.crt和…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...
