arm 精准总线错误与非精准总线错误

一、总线错误

1.1 arm总线设计

要了解什么是总线错误,就要先了解arm的总线设计。

AMBA(Advanced Micro-Controller Bus Architecture)是由ARM Limited公司推出的On-Chip Bus片上总线规范,是目前芯片总线的主流标准(该标准在不断演进),常用的总线:高性能总线(AdvancedHigh Performance Bus,AHB)、系统总线(AdvancedSystem Bus,ASB)和外设总线(Advanced PeripheralBus,APB)。

ARM 处理器内核系列典型内核型号AMBA 版本主要总线协议应用场景
Cortex-M0/M0+Cortex-M0, Cortex-M0+AMBA 2.0AHB-Lite, APB低功耗、低成本微控制器
Cortex-M3/M4/M7Cortex-M3, Cortex-M4, M7AMBA 3.0AHB-Lite, APB主流嵌入式应用
Cortex-M23/M33/M55Cortex-M23, Cortex-M33, M55AMBA 4.0AXI4, APB安全关键型应用、IoT
Cortex-A 系列(早期)Cortex-A5, A7, A9AMBA 3.0AHB, AXI3智能手机、平板电脑
Cortex-A 系列(现代)Cortex-A15, A53, A57, A72AMBA 4.0AXI4, ACE, ACE-Lite高性能移动设备、服务器
Cortex-A 系列(最新)Cortex-A76, A78, X1AMBA 5.0CHI, AXI5旗舰手机、数据中心
Cortex-R 系列Cortex-R4, R5, R7, R8AMBA 3.0/4.0AXI3, AXI4汽车电子、工业控制(实时应用)
ARM7/ARM9 系列(经典内核)ARM7TDMI, ARM926EJ-SAMBA 2.0AHB, ASB, APB传统嵌入式系统
Neoverse 系列(服务器)Neoverse N1, E1, V1AMBA 5.0CHI, AXI5云计算、数据中心

ARM 系统总线BUS从 CPU 内核开始。这是在 MMU 和 CPU 缓存单元之后,它连接到外围设备。此 CPU 总线由主时钟 (fclk) 运行。这与高频时钟是同一个概念。对于内存和低速外围设备来说,这个时钟非常高。因此,有一个桥bridge将时钟除以 4 倍(hclk),这用于高速外设。此总线也称为 AHB 或 ARM 高速总线。内存和图形外设(Memory and Graphics peripherals)应连接到此总线。同样,这个 AHB 进入一个桥,以进一步将时钟除以 2。这用于低速外围设备。这称为 APB。ARM 外设总线 (APB)。低速外设(Low speed peripherals),如串行端口、I2C、SPI。

动图

M0采用冯诺依曼结构,而M3,M4采用哈佛结构,具有独立的数据总线和指令总线。这种将数据总线和指令总线分开的结构,可以大大提高总线的数据存储量,消除瓶颈效应。
在上图中,对应总线矩阵(Bus Matrix), 总线矩阵中还有其他总线。需要注意的是,虽然M3,M4的数据总线和指令总线分开,两者的存储并没有分开。以M4内核为例,从官方参考手册(Documentation – Arm Developer)上可以看出:

I-Code 总线
I-Code的作用是取指令&执行指令,只和指令有关,I-Code 总线是一条基于 AHB-Lite 总线协议的 32 位总线,负责在 0x0000_0000 – 0x1FFF_FFFF 之间的取指操作。取指以字(32位)的长度执行,即使是对于 16 位指令也如此。因此 CPU 内核可以一次取出两条 16 位 Thumb 指令。

D-Code 总线
D-Code 的作用是对数据读写访问,只和数据有关,D-Code 总线也是一条基于 AHB-Lite 总线协议的 32 位总线,负责在 0x0000_0000 – 0x1FFF_FFFF(与I-Code相同)之间的数据访问操作。尽管 CM3 支持非对齐访问,但你绝不会在该总线上看到任何非对齐的地址,这是因为处理器的总线接口会把非对齐的数据传送都转换成对齐的数据传送。因此,连接到 D-Code总线上的任何设备都只需支持 AHB-Lite 的对齐访问,不需要支持非对齐访问。

系统总线
系统总线也是一条基于 AHB-Lite 总线协议的 32 位总线,负责在 0x2000_0000 – 0xDFFF_FFFF 和0xE010_0000 – 0xFFFF_FFFF 之间的所有数据传送,取指和数据访问都算上。和 D-Code 总线一样,所有的数据传送都是对齐的

外设总线
这是一条基于 APB 总线协议的 32 位总线。此总线来负责 0xE004_0000 – 0xE00F_FFFF 之间的私有外设访问。但是,由于此 APB 存储空间的一部分已经被 TPIU、 ETM 以及 ROM 表用掉了,就只留下了 0xE004_2000-E00F_F000 这个区间用于配接附加的(私有)外设。

调试访问端口总线
调试访问端口总线接口是一条基于“增强型 APB 规格”的 32 位总线,它专用于挂接调试接口,例如 SWJ-DP 和 SW-DP。

1.2 总线错误

当 AHB 接口上正在传送数据时,如果回复了一个错误信号(error response),则会产生总线 faults,产生的场合可以是:
  • 取指,通常被称作“预取流产”(prefetch abort)
  • 数据读/写,通常被称作“数据流产”(data abort)

哪些因素会导致 AHB 回复一个错误信号? 

  1. 企图访问无效的存储器 region。常见于访问的地址没有相对应的存储器。
  2. 设备还没有作好传送数据的准备。比如,在尚未初始化 SDRAM 控制器的时候试图访问 SDRAM。 
  3. 在企图启动一次数据传送时,传送的尺寸不能为目标设备所支持。例如,某设备只接受字型数据,却试图送给它字节型数据。 
  4. 因为某些原因,设备不能接受数据传送。例如,某些设备只有在特权级下才允许访问,可当前却是用户级。

二、非精准总线错误的由来

非精准总线错误(Imprecise Bus Fault)的存在主要源于现代处理器为提高性能而采用的异步内存访问机制硬件优化设计。这类错误的核心特点是:内存访问失败与异常触发之间存在时间差,导致处理器无法精确定位错误发生点。以下是具体原因和场景分析:

1. 写缓冲(Write Buffer)机制

  • 原理:处理器为加速内存写入操作,会将写请求暂存到写缓冲中,继续执行后续指令而不必等待内存写入完成。若写缓冲在后续刷新到内存时失败(如地址未映射、总线断开),则触发非精准错误。

2. DMA(直接内存访问)操作

  • 原理:DMA 控制器直接访问系统总线进行数据传输,与处理器并行工作。若 DMA 访问内存失败(如地址冲突、外设故障),处理器无法立即感知,需等待 DMA 完成或错误检测机制触发。
  • 示例
    // 启动DMA传输(从外设到内存)
    DMA_StartTransfer(src_addr, dst_addr, size);// 处理器继续执行其他代码(不等待DMA完成)
    do_something_else();
    
    若 DMA 传输过程中dst_addr无效,错误会在 DMA 操作后期被检测到,此时处理器可能已执行多条指令。

3. 缓存(Cache)与预取(Prefetch)机制

  • 缓存失效:若缓存行失效后需要从主存重新加载数据,但主存地址不可访问,可能触发非精准错误。
  • 指令预取失败:处理器预取指令时若发生内存访问错误,可能继续执行已预取的后续指令,导致错误报告延迟。

4. 多周期内存访问

  • 突发传输(Burst Transfer):处理器进行连续内存访问时(如读取数组),可能采用突发模式。若传输过程中某地址出错,整个突发操作可能完成后才报告错误。
  • 示例
    // 连续读取数组(可能触发突发传输)
    for (int i = 0; i < 1000; i++) {sum += array[i];
    }
    
    array[500]地址无效,错误可能在循环结束后才被检测到。

5. 外设总线异步错误

  • 外设通信失败:如 SPI、I2C 等外设访问共享内存时发生错误,可能通过中断或状态标志异步通知处理器,导致错误与处理不同步。
  • 示例
    // 向外设发送数据(通过内存映射寄存器)
    PERIPHERAL_DATA_REG = data;// 继续执行其他代码(外设可能在后台处理数据)
    

    若外设访问内存时出错,处理器可能已执行到后续代码。

三、小结

特性精准的总线错误非精准的总线错误
错误发生与处理的关系同步:指令执行立即暂停,异常立即触发异步:指令继续执行,异常在后续阶段触发
错误定位精确性精确:BFAR 寄存器保存错误地址不精确:BFAR 通常无效,无法准确定位错误
LR 寄存器(链接寄存器)值指向引发错误的指令指向错误检测点之后的指令
BFAR 寄存器有效性SCB->HFSR.BFARVALID = 1(有效)SCB->HFSR.BFARVALID = 0(无效)
典型触发场景指令直接访问内存失败(如访问未映射地址)外设或 DMA 异步操作导致的内存访问失败

触发条件对比

精准的总线错误
  • 内存访问未映射地址:例如访问0xFFFFFFFF
  • 内存访问权限冲突:如向只读区域写入数据。
  • 非对齐访问:例如在不支持非对齐访问的架构上执行非对齐的字访问。
  • 指令预取失败:取指阶段访问指令存储器失败。
非精准的总线错误
  • DMA 操作错误:直接内存访问过程中发生总线故障。
  • 外设异步错误:如 SPI/I2C 传输时的 FIFO 溢出。
  • 缓存或写缓冲错误:写缓冲刷新到内存时失败。
  • 多周期内存访问:如突发传输(burst transfer)过程中出错。

四、调试与排查建议

场景精准错误排查方法非精准错误排查方法
错误地址定位读取SCB->BFAR分析上下文,检查 DMA / 外设操作
寄存器检查SCB->HFSR.BFARVALID == 1SCB->HFSR.BFARVALID == 0
典型代码问题野指针、数组越界、错误的内存映射DMA 配置错误、外设中断处理不当

ref:

HardFault错误信息分析定位_hardfault定位问题-CSDN博客

https://mbb.eet-china.com/forum/topic/114149_1_1.html

HardFault全解析:从寄存器诊断到精准定位-CSDN博客

Documentation – Arm Developer

《ARMv7-M Architecture Reference Manual》

C 总线错误 (bus error) - 段错误 (segmentation fault)-CSDN博客

ARM异常处理(3):Bus faults、Memory management faults、Usage faults、Hard faults详解-CSDN博客

Cortex‐M3 权威指南》 ,第七章,总线 Faults

AMBA – Arm®

 ARM bus hierarchy - ARM highspeed bus/AHB and ARM peripheral bus/APB

AMBA Specifications – Arm®

嵌入式调试必修课11_MCU总线接口深度解析(Part I):I-Code/D-Code/S-Bus的工作原理_哔哩哔哩_bilibili

Cortex-M3 I-Code,D-Code,系统总线及其他总线接口_m3 编译区分 如何d总线,s总线-CSDN博客 

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

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

相关文章

Unity UGUI的Canvas以及内部元素之间遮挡关系调整

调UI遮挡关系有三种思路&#xff1a; 调Sorting Layer&#xff0c;层级越后渲染到越前面调Order in Layer&#xff0c;数字越大渲染到越前面修改UI材质调RenderQueue&#xff0c;数字越大越后渲染 对前两种比较陌生的同学可以看一下我以前写的这篇&#xff0c;不看也没事&…

SpringCloud系列(46)--SpringCloud Bus实现动态刷新全局广播

前言&#xff1a;上一节中我们简单的介绍了什么是SpringCloud Bus&#xff0c;SpringCloud Bus的用处&#xff0c;而本节内容则是使用SpringCloud Bus来实现动态刷新全局广播。 实现动态刷新全局广播的设计思想的架构图 注&#xff1a;在实现SpringCloud Bus动态刷新全局广播前…

Java+Vue开发的电子招投标管理系统,实现全流程线上操作,高效规范,助力招投标活动透明公正开展

前言&#xff1a; 在数字化浪潮席卷全球的当下&#xff0c;传统招投标模式面临着效率低下、信息不透明、管理成本高等诸多挑战。电子招投标管理系统应运而生&#xff0c;它借助先进的互联网技术和信息化手段&#xff0c;实现了招投标全流程的电子化、自动化和智能化管理。该系…

MyBatisPlus-02-核心功能

文章目录【README】【1】MyBatis-plus常见注解【2】MyBatis-Plus常见配置【2.1】MyBatis-Plus配置示例【3】MyBatisPlus核心内容【3.1】条件构造器【3.1.1】业务场景1-带多字段条件的查询-使用QueryWrapper【3.1.2】业务场景2-带条件的更新-使用QueryWrapper【3.1.3】业务场景3…

ZYNQ MPSOC GTH aurora8b10b IP的修改与仿真

1 ip设置好后的顶层模块接口: 根据自己的开发板修改接口如下: odule gtwizard_ultrascale_0_example_top (// Differential reference clock inputsinput wire mgtrefclk0_x0y1_p,input wire mgtrefclk0_x0y1_n,// Serial data ports for transceiver channel 0input w…

机器学习之线性回归

主要参考&#xff1a; 机器学习| 算法笔记-线性回归&#xff08;Linear Regression&#xff09; - 知乎 (zhihu.com) 2-2 线性回归_哔哩哔哩_bilibili Python机器学习实战&#xff1a;线性回归模型预测波士顿房价_哔哩哔哩_bilibili 回归分析 在数学和统计学中&#xff0c;回归…

Boost.Asio学习(2):同步读写

Asio 的 buffer 是什么&#xff1f; boost::asio::buffer(...) 是一个函数模板&#xff0c;用于创建一个通用的 buffer 对象&#xff0c;可传递给 I/O 函数&#xff08;如 read, write, read_some, write_some 等&#xff09;。 它返回的是 mutable_buffer 或 const_buffer 的…

Java中如何枚举正则表达式捕获组的名字

在使用正则表达式在匹配文本时&#xff0c;除了可以通过表达式捕获命中的文本串外&#xff0c;还可以对捕获的文本串进行命名。尤其是在解析日志的场景中&#xff0c;经常会被用到。表达式如下&#xff1a; \<(?<pri>\d)\>(?<time>.*) (?<host>\S)…

CentOS 系统高效部署 Dify 全攻略

系列文章目录 CentOS系统高效部署fastGPT全攻略 文章目录 系列文章目录一、前言二、准备工作与系统要求三、安装 Docker 与 Docker Compose四、部署 Dify 核心服务五、数据库与存储配置六、网络与安全优化七、监控与运维八、升级与扩展九、附录与资源关键命令速查表官方文档…

xyctf2025第三届京麒CTF

一.MISC 1.XGCTF 直接ai搜索一遍找到了出题人的博客LamentXU 2024-2025年终总结 - LamentXU - 博客园 知道了原题是ciscn中的 在LamentXU的博客乱逛Patriot CTF 2024 MISC 部分 wp - LamentXU - 博客园 找到了博客网站,让后搜索ciscn扎到了博客 CISCN华东南WEB-Polluted |…

Python爬虫 模拟登录 requests版

前言 网站必须是登录状态才能查看网站信息,是最常见的反爬手段,下面我分享一下request模拟登录状态进行请求 目录 模拟登录的原理 直接复制网站Cookie模拟登录状态 通过登录接口信息破解出Cookie模拟登录状态 模拟登录的原理 网站是使用Cookie和session记录网站的登录状态…

一些改进策略

1.要计算一个神经网络模型的总参数量、可训练参数量以及计算量&#xff08;FLOPs&#xff09;&#xff0c;可以使用以下步骤&#xff1a; ### 计算总参数量和可训练参数量&#xff1a; 1. **逐层计算参数量**&#xff1a; - 对于每一层&#xff0c;确定该层的参数量。这通…

React Native响应式布局实战:告别媒体查询,拥抱跨屏适配新时代

前言:当设计师说"这个页面要适配所有手机和平板…" “什么?React Native不支持CSS媒体查询?那怎么实现响应式布局?”——这是很多刚接触React Native的开发者会遇到的灵魂拷问。 但别慌,没有@media,我们照样能玩转多端适配!想象一下:你的App在iPhone SE的小…

[Java恶补day39] 整理模板·考点六【反转链表】

考点六【反转链表】 【考点总结】 1. 206. 【题目】 【核心思路】 【复杂度】 时间复杂度&#xff1a; O ( ) O() O()。 空间复杂度&#xff1a; O ( ) O() O()。 【代码】 92. 【题目】 【核心思路】 【复杂度】 时间复杂度&#xff1a; O ( ) O() O()。 空间复杂度&a…

7,TCP服务器

1,创建一个工程 文件目录:

Modbus_TCP_V5 新功能

odbus TCP 服务器指令 MB_SERVER V5.0 新功能概述 如下图1所示服务器指令 MB_SERVER 从 V5.0 以后增加了三个新功能&#xff0c;分别为&#xff1a; 访问数据块中的数据区域&#xff0c;而不是直接访问 MODBUS 地址过程映像区的读访问限制统计变量 NDR_immediate 和 DR_immed…

2-RuoYi-UI管理平台的启动

RuoYi-UI是RuoYi后端框架的管理中心(基于 Vue.js 的前端项目)的详细配置与启动指南,结合官方文档和常见实践整理,涵盖环境准备、配置修改、启动流程及问题排查。 ⚙️ 一、环境准备 Node.js 版本要求:≥12.0(推荐 ≥14.0 或 18.18+ 适配 Vue3) 安装后验证: node -v …

WPF学习笔记(21)ListBox、ListView与控件模板

ListBox与控件模板 一、 ListBox默认控件模板详解二、ItemsPresenter集合数据呈现1. 概述2. 示例 三、 ListView默认控件模板详解1. 概述2. 示例 一、 ListBox默认控件模板详解 WPF 中的大多数控件都有默认的控件模板。 这些模板定义了控件的默认外观和行为&#xff0c;包括控…

操作系统【2】【内存管理】【虚拟内存】【参考小林code】

本文完全参考 虚拟内存内存分段内存分页段页式内存管理Linux内存管理 一、虚拟内存 1. 单片机的绝对物理地址 以单片机作为引子&#xff0c;它没有操作系统&#xff0c;每次写完程序是借助工具将程序烧录进单片机&#xff0c;程序才能运行。 单片机由于没有操作系统&#…

【王树森推荐系统】召回05:矩阵补充、最近邻查找

概述 这节课和后面几节课将详细讲述向量召回&#xff0c;矩阵补充是向量召回最简单的一种方法&#xff0c;不过现在已经不太常用这种方法了本节课的矩阵补充是为了帮助理解下节课的双塔模型上节课介绍了embedding&#xff0c;它可以把用户ID和物品ID映射成向量 矩阵补充 模型…