当前位置: 首页 > news >正文

编译器使用优化后出现的busfault

遇到的问题:
未开优化是正常执行,打开优化,无法运行,定位到异常语句

//ADC_REG 是ADC结果寄存器地址
uint32 adc = *(uint32 *)ADC_REG;
uint32 temp = adc&0xffff;

未优化汇编代码

//uint32 adc = *(uint32*)ADC_REG;
MOVW	 	R8 ,	#0X0824					//加载高16位地址
MOVT		R8 ,	#4090					//加载低16位地址
LDR.W		R0,		[R8]					//读取32位数据
//uint32 temp = adc&0xffff;
UBFX 		R2 , 	R0,		#0,		#16		进行与运算

优化汇编代码

//uint32 adc = *(uint32 *)ADC_REG;
//uint32 temp = adc&0xffff;
MOVW	 	R8 ,	#0X0824					//加载高16位地址
MOVT		R8 ,	#4090					//加载低16位地址
LDRH		R0,		[R8]					//半字节数据读取数据到R0

问题就在 LDRH指令;由于通用寄存器读取外设寄存器需要按照32位读取,并且需要使用的数据刚好就是半字,编译器优化后就使用LDRH指令进行半字读取,从功能上是等效的,但是由于内核寄存器对外设寄寄存器需要使用32位读取即LDR.W指令,编译器优化使用16位读取即LDRH,故此出现 busfault 。解决办法,即在读取时添加volatile,不使用用编译器优化。

volatile优化汇编代码

//uint32 adc = *(volatile uint32*)ADC_REG;
MOVW	 	R8 ,	#0X0824					//加载高16位地址
MOVT		R8 ,	#4090					//加载低16位地址
LDR.W		R0,		[R8]					//读取32位数据
UBFX 		R0, 	R0,		#0,		#16		//进行与运算
http://www.lryc.cn/news/222217.html

相关文章:

  • rebase current onto selected作用
  • 深度学习入门
  • 嵌入式图像处理机器视觉库YMCV使用
  • vscode设置pycharm中的项目路径和debug方法
  • 10-27 maven概念
  • SQL审计是什么意思?目的是什么?有什么好处?
  • CSS 网页布局
  • 智慧燃气管网监测系统功能简要介绍
  • 深度解析:如何开发一对一交友App的关键要素和流程
  • ClickHouse 学习之从高级到监控以及备份(二)
  • 「随笔」IT行业哪个方向比较好就业
  • Halcon WPF 开发学习笔记(0):开篇介绍
  • SLAM中求导相关的公式总结
  • 在微信小程序中怎么做投票活动
  • 如何使用 NFTScan NFT API 在 Arbitrum 网络上开发 Web3 应用
  • 线上问题排查方法
  • 智能柜+MRO:制造业中的自动售货机
  • flutter笔记:骨架化加载器
  • 关于视频封装格式和视频编码格式的简介
  • npm发布自己的包
  • 【漏洞复现】weblogic-10.3.6-‘wls-wsat‘-XMLDecoder反序列化(CVE-2017-10271)
  • CRM中的销售机会管理是什么?三个步骤帮你创建销售渠道
  • X(原Twitter)怎么发推文最有效?技巧分享
  • Ionic 模块组件的理解
  • sql:1对多获取最新一条数据
  • CDN加速技术:降低企业云服务成本的有效利用
  • 设计模式——享元模式(Flyweight Pattern)+ Spring相关源码
  • vue3中el-tree设置默认选中节点和展开节点
  • 软件测试需求分析是什么?为什么需要进行测试需求分析?
  • GreenPlum简介