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