Cortex-M7地址非对齐访问

本文只是做个记录,脑子不好容易忘记。
重点参考几个ARM手册:

手册链接
DDI0489F_cortex_m7_trm.pdfhttps://developer.arm.com/documentation/ddi0489/f/?lang=en
DUI0646B_cortex_m7_dgug-20240202.pdfhttps://developer.arm.com/documentation/dui0646/c/?lang=en

Cortex-M7是支持地址非对齐访问的,但是使用时还是需要多注意细节之处的。
在这里插入图片描述
几个重要指令:LDRLDRHSTRSTRH

非对齐访问中断

Configuration and Control Register:
在这里插入图片描述
在这里插入图片描述
当前寄存器的bit无论使能与否,都会产生中断错误,只是产生错误的中断是HradFault还是UsageFault

Memory类型

在这里插入图片描述
Memory分为三大类:

  • Normal
  • Device
  • Strongly-ordered

类型可以由MPU来配置属性,如果属性为Normal则支持地址非对齐访问;如果属性为Device或Strongly-ordered,则禁止非对齐访问,一旦非对齐访问,则进入HardFault或UsageFault错误中断。

编译选项

  • -mno-unaligned-access
    这个选项告诉编译器不要生成任何非对齐的内存访问指令。这通常是一个安全的选项,但可能会导致性能下降,因为编译器会避免任何可能导致非对齐访问的代码。
  • -munaligned-access
    这个选项告诉编译器可以生成非对齐的内存访问指令。这可以提高性能,但也可能增加硬件异常的风险,特别是在不支持非对齐访问的硬件上。

没有设置上述两个参数情况下,由编译器的版本默认配置参数。
当使用“-mno-unaligned-access”,在编译时,会将地址非对齐情况下的代码进行优化,将“str”命令转为“strb”,以避免对齐问题。如:

  test_a a;
  a.a = 9;
 800093a:	2309      	movs	r3, #9
 800093c:	607b      	str	r3, [r7, #4]
  a.b = 2;
 800093e:	2302      	movs	r3, #2
 8000940:	723b      	strb	r3, [r7, #8]
  a.c = 3;
 8000942:	2300      	movs	r3, #0
 8000944:	f043 0303 	orr.w	r3, r3, #3
 8000948:	727b      	strb	r3, [r7, #9]
 800094a:	2300      	movs	r3, #0
 800094c:	72bb      	strb	r3, [r7, #10]
 800094e:	2300      	movs	r3, #0
 8000950:	72fb      	strb	r3, [r7, #11]
 8000952:	2300      	movs	r3, #0
 8000954:	733b      	strb	r3, [r7, #12]
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值