电子无聊大神的个人空间 https://bbs.21ic.com/?976962 [收藏] [复制] [RSS]

日志

结构体正确的数据布局

已有 685 次阅读2014-6-19 13:02 |个人分类:C语言|系统分类:ARM| 结构体, ARM

今天看一书《ARM Cortex-M0 微控制器原理与实践》。
看到ARM C语言编程 这一章。
看到一个之前不知道的知识点。
-------------------------------------------------------------
ARM系统开发中,使用结构体时要考虑怎么样控制存储器布局,已达到最优的空间配置。
(即结构体成员地址边界的对齐问题)。假设系统采用大段模式的存储器。
如下图

如后我也用STM32F4 DISCO开发板验证了。
       
  1. #include "stm32f4xx.h"
  2. #include "led.h"
  3. #include "key.h"

  4. typedef struct
  5. {
  6.         char a;
  7.         int  b;
  8.         char c;
  9.         short d;
  10. }A;

  11. typedef struct
  12. {
  13.         char a;
  14.         char c;
  15.         short d;
  16.         int b;
  17. }B;

  18. int main(void)
  19. {
  20.         A AA;
  21.         B BB;
  22.         Button_Init();
  23.         LED_Init();
  24.         
  25.         if((&AA.c-&AA.a) == 8)
  26.         {        
  27.                 LED_ON(LED1);
  28.                 LED_OFF(LED2);
  29.         }
  30.         
  31.         if(&BB.c - &BB.a ==1)
  32.         {
  33.                 LED_ON(LED3);
  34.                 LED_OFF(LED4);
  35.         }
  36.         
  37.         while(1)
  38.         {
  39. //                if(Button_GetState(Button1)!=0)
  40. //                {
  41. //                        LED_Toggle(LED1);
  42. //                }
  43.         }
  44.         
  45.         return 0;
  46. }
复制代码
结构体成员AA.c的地址减去AA.a,为8个字节。
结构体成员BB.c的地址减去BB.a,为1个字节。
LED的亮灭如期。
就这样。
-----------------------------------------------------------
结论,结构体成员不能随意排列,应该按照占用字节大小,从小到大排列。


~~个人学习笔记


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)