打印
[STM32F1]

keil mdk+stm32的ac5和 ac6两个编译器下的字节对齐操作方法

[复制链接]
143|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
geraldbetty|  楼主 | 2024-4-30 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在使用ac6.9的编译器,编译速度是真的很快,使用stm32的hal库编译速度也比ac5的编译器快很多。
本文试验stm32中字节对齐的代码测试,主要是结构体,因为结构体中实际项目中用到最多,同时在仿真环境中打印出来。
ac5的测试结果:
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

#ifdef CC_ARM_AC5
//该方式只是使用ac5编译器,结构体不对齐的方式1,结构体的长度,就是各个变量长度的和
__packed typedef  struct _li_st
{
    uint8_t a;   //1个
    uint16_t b; //2个
    uint32_t c; //4个
    uint64_t d; //8个      
}li_st;

//ac5编译器的结构体不对齐的方式2,结构体的长度,就是各个变量长度的和
typedef  struct _li_st_2
{
    uint8_t a;   //1个
    uint16_t b; //2个
    uint32_t c; //4个
    uint64_t d; //8个      
}__attribute__((__packed__)) li_st_2;

//)到4字节,同样可指定对齐到8字节。
typedef struct student_4B
{
    char name[7];       //7+1=8
    uint32_t id;        //4
    char subject[5];    //5+3=8
} __attribute__((aligned(4))) li_st_4B;

#pragma pack (1) /*指定按1字节对齐方式3*/
typedef  struct _li_st_1B
{
    uint8_t a;   //1个
    uint16_t b; //2个
    uint32_t c; //4个
    uint64_t d; //8个      
}li_st_1B;
#pragma pack () /*取消指定对齐,恢复缺省对齐*/

#pragma pack (2) /*指定按2字节对齐*/
typedef  struct _li_st_2B
{
     char b;
     int a;
     short c;
}li_st_2B;
#pragma pack () /*取消指定对齐,恢复缺省对齐*/



测试结果如下:
ac6的测试结果:
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

#elif (CC_ARM_AC6)

//ac6 ac5通用,的结构体不对齐方式,结构体的长度,就是各个变量长度的和
typedef  struct _li_st_ac6
{
    uint8_t a;   //1个
    uint16_t b; //2个
    uint32_t c; //4个
    uint64_t d; //8个      
}__attribute__((packed)) li_st_ac6  ;

//ac6 ac5通用,的结构体不对齐方式2,结构体的长度,就是各个变量长度的和
#pragma pack (1) /*指定按1字节对齐*/
typedef  struct _li_st_ac6_1B
{
    uint8_t a;   //1个
    uint16_t b; //2个
    uint32_t c; //4个
    uint64_t d; //8个      
}li_st_ac6_1B;
#pragma pack () /*取消指定对齐,恢复缺省对齐*/


//ac6 ac5通用,下面的定义和8字节一样的大小,主要看内存分布
#pragma pack (4) /*指定按4字节对齐*/
typedef  struct _li_st_ac6_4B
{
    uint8_t a;   //1个 + 1
    uint16_t b; //2个
    uint32_t c; //4个
    uint64_t d; //8个      
}li_st_ac6_4B;
#pragma pack () /*取消指定对齐,恢复缺省对齐*/




使用特权

评论回复
沙发
键盘手没手| | 2024-4-30 14:32 | 只看该作者
该方式只是使用ac5编译器,结构体不对齐的方式1,结构体的长度,就是各个变量长度的和

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

1162

帖子

0

粉丝