今天看一书《ARM Cortex-M0 微控制器原理与实践》。
看到ARM C语言编程 这一章。
看到一个之前不知道的知识点。
-------------------------------------------------------------
ARM系统开发中,使用结构体时要考虑怎么样控制存储器布局,已达到最优的空间配置。
(即结构体成员地址边界的对齐问题)。假设系统采用大段模式的存储器。
如下图
如后我也用STM32F4 DISCO开发板验证了。
- #include "stm32f4xx.h"
- #include "led.h"
- #include "key.h"
- typedef struct
- {
- char a;
- int b;
- char c;
- short d;
- }A;
- typedef struct
- {
- char a;
- char c;
- short d;
- int b;
- }B;
- int main(void)
- {
- A AA;
- B BB;
- Button_Init();
- LED_Init();
-
- if((&AA.c-&AA.a) == 8)
- {
- LED_ON(LED1);
- LED_OFF(LED2);
- }
-
- if(&BB.c - &BB.a ==1)
- {
- LED_ON(LED3);
- LED_OFF(LED4);
- }
-
- while(1)
- {
- // if(Button_GetState(Button1)!=0)
- // {
- // LED_Toggle(LED1);
- // }
- }
-
- return 0;
- }
复制代码结构体成员AA.c的地址减去AA.a,为8个字节。
结构体成员BB.c的地址减去BB.a,为1个字节。
LED的亮灭如期。
就这样。
-----------------------------------------------------------
结论,结构体成员不能随意排列,应该按照占用字节大小,从小到大排列。
~~个人学习笔记