【STM32】CortexM0单片机中的非对齐访问造成的HardFault

1、问题引入和结论

在CortexM0单片机中,在使用指针进行内存访问的时候需要特别留意访问地址的合法性问题,否则稍有不慎就会进入HardFault,痛苦不堪。

这里先将结论抛出来:

1、u8类型的指针,读写任何地址均是合法的,不会进入HardFault
2、u16类型的指针,读写地址必须是2的倍数,否则会进入HardFault
3、u32类型的指针,读写地址必须是4的倍数,否则会进入HardFault

我们针对以上三个结论分别做测试。
PS:本试验涉及到结构体的字节对齐知识点,如果有疑惑的地方可以查看:结构体的字节对齐规则

2、测试平台

CortexM0 32位单片机

3、u8指针读写内存测试

首先是u8类型指针的测试,以下是测试代码,实际测试时,可以发现代码可以顺利跑下来,而不会进入HardFault。

#pragma pack(4)		//指定对齐是4字节
typedef struct
{
   
	u8 len;			//自身对齐是1,指定对齐是4,因此有效对齐是1, 0地址存放len
	u8 data[12];	//自身对齐是1,指定对齐是4,因此有效对齐是1, 1地址存放data[0],2地址存放data[1]...
}TEST;
#pragma pack()

TEST test;

u8  *p8;
u16 *p16;
u32 *p32;
volatile u32 temp;

void align_test_p8(void)
{
   
	p8  = (u8  *)&te
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值