变量定义如下
u8 TempMD5[16];// 16Byte,0x200216DB~0x200216F1
u8 j; // r5
u32 sector = 0; // r6
u8 buf[5]; // sp 5Byte 0x200216D0~0x200216D7=
u8 *p; // r4
p = buf;
*p = 0x01;
buf[0] = 0x02;
*buf = 0x03;
*(p+1) = 0x11;
buf[1] = 0x12;
*(p+6) = 0x21;
buf[6] = 0x22; //
- 变量分布
进入函数后可以看到汇编语句SP移动,但是两个数据加到一块有21(16+5=21)个字节,与24(0x18)不对应。
然后又查看Memory,buf从0x200216D0开始,而TempMD5是从0x200216DB开始并不是从0x200216D5。这是因为STM32F4系列是32字节对齐,所有buf占用地址为~0x200216D7,实际只用了5个字节。所以定义数组时长度尽量要用4的整位数。
- 数组与指针
执行*(p+6) =0x21;语句将p指向的地址偏移6个单位后的字节赋值0x21,但buf[6]=0x22;MDK有告警提示,运行时没有溢出,查看汇编只将0x22赋给r0寄存器,就这一条指令。
STM32F4内存对齐与数组使用
本文解析了STM32F4系列MCU中内存分配及数组使用时遇到的问题,重点讨论了32字节对齐规则如何影响局部变量的地址分配,并给出了数组定义与初始化的具体实例。
1443

被折叠的 条评论
为什么被折叠?



