STM32F103_HAL库+寄存器学习笔记20 - CAN发送中断+ringbuffer + CAN空闲接收中断+接收所有CAN报文+ringbuffer

导言


在这里插入图片描述
如上所示,在[[STM32F103_HAL库+寄存器学习笔记19 - CAN发送中断+CAN接收中断+接收所有CAN报文+ringbuffer数据结构]]的基础上,为CAN发送端也引入了ringbuffer(环形缓冲区)机制。CAN发送有三个发送邮箱,为什么还另外需要ringbuffer?

  1. 三邮箱限制:STM32F103 的 CAN 控制器只有三个发送邮箱,当应用层在短时间内产生超过3条待发帧时,多余的帧无法立即写入邮箱,只能被丢弃或阻塞等待(阻塞更可靠,但可能降低响应速度)。
  2. 突发流量平滑:环形缓冲区可以暂存超出邮箱数的那些帧,在邮箱空闲时再依次发送,避免丢帧。
  3. 解耦业务与硬件:应用层只需往环形缓冲区写入数据,不用关心底层邮箱是否空闲,降低了发送接口的耦合度。

总结来说,在CAN发送链路中引入ringbuffer,能有效解决上述问题,尤其是邮箱数量限制和突发流量平滑问题。

项目地址:
github:

  • HAL库: https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_hal_library20_Can_Send_Rec_With_RB
  • 寄存器方式: https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library20_Can_Send_Rec_With_RB
    gitee(国内):
  • HAL库: https://gitee.com/wallace89/MCU_Develop/tree/main/stm32f103_hal_library20_Can_Send_Rec_With_RB
  • 寄存器方式: https://gitee.com/wallace89/MCU_Develop/tree/main/stm32f103_ll_library20_Can_Send_Rec_With_RB

使用for循环一口气发送50条CAN报文

为验证ringbuffer对“三邮箱限制”和“突发流量平滑”问题的缓解效果。在主循环里调用for循环,一口气发送50条CAN报文,看看效果!
在这里插入图片描述
在这里插入图片描述
如上所示:

  1. 在debug模式里,将对应的全局变量置1,就可以运行对应的测试函数。

测试一口气发送50条CAN报文,没有ringbuffer

在这里插入图片描述
如图所示,将全局变量 test 置为1,运行函数 CAN_Test_Send50Frames() 连续发送50条报文。结果显示,CAN分析仪仅接收到3条报文。原因很简单,另外47条报文因为发送邮箱挤满了,所以都溢出了。

测试一口气发送50条CAN报文,有ringbuffer

在这里插入图片描述
如上所示,将全局变量testRB置1,运行函数CAN_Test_Send50Frames_Use_Ringbuffer()一口气发送50条报文。接着,CAN分析仪接收到50条报文。实践证明,ringbuffer作为二级缓存能有效解决突发高流量问题与三个邮箱的局限性问题。

一、代码(HAL库)


1.1、myCanDrive.c

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2、stm32f1xx_it.c

在这里插入图片描述

1.3、main.c

在这里插入图片描述
在这里插入图片描述

1.4、代码编译

在这里插入图片描述

二、代码(寄存器方式)


1.1、myCanDrive_reg.c

在这里插入图片描述
如上所示,RX Ringbuffer与TX Ringbuffer都是二级缓存。
在这里插入图片描述
在这里插入图片描述
如上所示,这两个函数基本跟HAL库一样,只是开与关中断的函数改为寄存器方式直接操作。
在这里插入图片描述
如上所示,在CAN发送完成中断函数USB_HP_CAN1_TX_IRQHandler()里调用函数CAN_Get_CANMsg_From_RB_To_TXMailBox_IT(),在中断里将ringbuffer里的CAN报文放入空闲的发送邮箱。

1.2、main.c

在这里插入图片描述
在这里插入图片描述

1.3、代码编译

在这里插入图片描述

1.4、测试

在这里插入图片描述
如上所示,测试结果跟HAL库一样。

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

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

相关文章

Windows 环境下安装 MariaDB 及 HeidiSQL 使用教程

引言 本报告旨在提供一份详尽的操作指南。内容将覆盖在 Windows 操作系统上安装 MariaDB Community Server 的全过程。我们还将探讨如何利用 HeidiSQL 这款图形用户界面(GUI)工具,直观地预览和管理我们新安装的数据库。除了安装与配置的步骤…

美团2024年春招第一场笔试 C++

目录 1&#xff0c;小美的平衡矩阵 2&#xff0c;小美的数组询问 3&#xff0c;小美的MT 4&#xff0c;小美的朋友关系 1&#xff0c;小美的平衡矩阵 【题目描述】 给定一个n*n的矩阵&#xff0c;该矩阵只包含数字0和1。对于 每个i(1<i<n)&#xff0c;求在该矩阵中&am…

09-DevOps-Jenkins实现CI持续集成

前面已经把harbor搭建好了&#xff0c;也可以向harbor中推送自定义镜像。 原计划是在Jenkins这台服务器上&#xff0c;完成镜像构建&#xff0c;然后把镜像推送的harbor仓库中。现在改变计划了&#xff0c;Jenkins所在的服务器&#xff08;192.168.1.10&#xff09;不负责镜像…

Postman设置了Cookies但是请求不携带Cookie

1 问题说明 使用Postman工具往往要向本地服务器发送请求携带Cookie便于测试接口&#xff0c;但是在Send下面的Cookies选项中设置域名127.0.0.1&#xff0c;并添加Cookie&#xff0c;发现发送的请求怎么都不会携带Cookie&#xff1a; 通过Fiddler抓包发现并没有Cookie&#xff1…

【unity】Vulkan模式下部分Android机型使用VideoPlayer组件播放视频异常问题

一、问题背景 考虑到Vulkan高性能的优势&#xff0c;项目组决定打包设置为vulkan优先&#xff0c;opengl es次之的方案&#xff1b;但由于部分低端设备或者部分模拟器对Vulkan的兼容性良莠不齐&#xff0c;导致诸如使用VideoPlayer组件无法正常播放视频等问题频发&#xff0c;而…

0802api设计和实战-网络ajax请求1-react-仿低代码平台项目

文章目录 1 API设计1.1 用户功能1.1.1 获取用户信息1.1.2 注册1.1.3 登录 1.2 问卷功能1.2.1 获取单个问卷1.2.2 获取问卷列表1.2.3 创建问卷1.2.4 更新问卷1.2.5 批量彻底删除问卷1.2.6 复制问卷 1.3 小结 2 实战2.1配置axios2.2 封装API和测试2.3 新建问卷2.4 自定义hooks封装…

Android Kotlin AIDL 完整实现与优化指南

本文将详细介绍如何在Android中使用Kotlin实现AIDL&#xff08;Android Interface Definition Language&#xff09;&#xff0c;并提供多种优化方案。 一、基础实现 1. 创建AIDL文件 在src/main/aidl/com/example/myapplication/目录下创建&#xff1a; IMyAidlInterface.…

【数据结构】_栈和队列相关面试题

&#x1f525; 数据结构修炼场 &#x1f525; &#x1f4a5; 栈与队列 终极试炼 &#x1f4a5; &#x1f680; 理论已加载完毕&#xff0c;代码之魂觉醒时刻&#xff01; ⚡️ 是时候用实战点燃你的算法之力了—— 「题目风暴&#xff0c;来袭&#xff01;」 &#xff08;握…

精益数据分析(8/126):从Airbnb案例看精益创业与数据驱动增长

精益数据分析&#xff08;8/126&#xff09;&#xff1a;从Airbnb案例看精益创业与数据驱动增长 大家好&#xff01;一直以来&#xff0c;我都坚信在创业和技术的领域里&#xff0c;持续学习与分享是不断进步的关键。今天&#xff0c;咱们继续深入学习《精益数据分析》&#x…

专题二十:路由策略与策略路由

一、路由策略 1.1 路由策略的概念 路由策略是通过修改路由表的路由条目来控制数据流量的可达性。即对接受和发布的路由进过滤。这种方式称为路由策略 路由策略功能相关作用控制路由的发布可通过路由策略对所要发布的路由信息进行过滤&#xff0c;只允许发布满足条件的路由信…

VSCode 扩展离线下载方法

学习自该文章&#xff0c;感谢作者&#xff01; 2025 年 VSCode 插件离线下载攻略&#xff1a;官方渠道一键获取 - 知乎 获取扩展关键信息 方法一&#xff1a;官网获取 打开 VSCode 扩展官方网站 搜索要下载的扩展&#xff0c;以 CodeGeeX 为例&#xff0c;网址为&#xf…

一 、环境的安装 Anaconda + Pycharm + PaddlePaddle

《从零到一实践&#xff1a;系统性学习生成式 AI(NLP)》 一 、环境的安装 Anaconda Pycharm PaddlePaddle 1. Anaconda 软件安装 Anaconda 软件安装有大量的教程&#xff0c;此处不在说明&#xff0c;安装完成之后界面如下&#xff1a; 2. 创建 Anaconda 虚拟环境 Paddl…

软考教材重点内容 信息安全工程师 第23章 云计算安全需求分析与安全保护工程

23.1.云计算基本概念 云计算就是在这样的需求驱动下而产生的一种计算模式。云计算通过虚拟化及网络通信技术&#xff0c;提供一种按需服务、弹性化的 IT 资源池服务平台。云计算的主要特征如下。 1. IT 资源以服务的形式提供 IT 资源以一种服务产品的形式提供&#xff0c;满…

蓝桥杯 19. 最大比例

最大比例 原题目链接 题目描述 X 星球的某个大奖赛设了 M 级奖励。每个级别的奖金是一个正整数。 并且&#xff0c;相邻两个级别间的比例是一个固定值&#xff0c;也就是说&#xff1a;所有级别的奖金构成一个等比数列。 例如&#xff1a; 奖金数列为 16, 24, 36, 54&…

基于 Python 的自然语言处理系列(82):Transformer Reinforcement Learning

&#x1f517; 本文所用工具&#xff1a;trl、transformers、peft、bitsandbytes &#x1f4d8; 官方文档参考&#xff1a;https://huggingface.co/docs/trl 一、引言&#xff1a;从有监督微调到 RLHF 全流程 随着语言大模型的发展&#xff0c;如何在大规模预训练模型基础上更精…

JAVA猜数小游戏

import java.util.Random; import java.util.Scanner;public class HelloWorld {public static void main(String[] args) {Random rnew Random();int luck_number r.nextInt(100)1;while (true){System.out.println("输入猜数字");Scanner sc new Scanner(System…

GPU渲染阶段介绍+Shader基础结构实现

GPU是什么 &#xff08;CPU&#xff09;Center Processing Unit:逻辑编程 &#xff08;GPU&#xff09;Graphics Processing Unit&#xff1a;图形处理&#xff08;矩阵运算&#xff0c;数据公式运算&#xff0c;光栅化&#xff09; 渲染管线 渲染管线也称为渲染流水线&#x…

Spring Boot + MyBatis 动态字段更新方法

在Spring Boot和MyBatis中&#xff0c;实现动态更新不固定字段的步骤如下&#xff1a; 方法一&#xff1a;使用MyBatis动态SQL&#xff08;适合字段允许为null的场景&#xff09; 定义实体类 包含所有可能被更新的字段。 Mapper接口 定义更新方法&#xff0c;参数为实体对象&…

单例模式:确保唯一实例的设计模式

单例模式&#xff1a;确保唯一实例的设计模式 一、模式核心&#xff1a;保证类仅有一个实例并提供全局访问点 在软件开发中&#xff0c;有些类需要确保只有一个实例&#xff08;如系统配置类、日志管理器&#xff09;&#xff0c;避免因多个实例导致状态混乱或资源浪费。 单…

UnoCSS原子CSS引擎-前端福音

UnoCSS是一款原子化的即时按需 CSS 引擎&#xff0c;其中没有核心实用程序&#xff0c;所有功能都是通过预设提供的。默认情况下UnoCSS应用通过预设来实现相关功能。 UnoCSS中文文档&#xff1a; https://www.unocss.com.cn 前有很多种原子化的框架&#xff0c;例如 Tailwind…