对齐方式定义头文件:bsp_compiler_support.h

#define BSP_SECTION_STACK  ".stack"
#define BSP_SECTION_HEAP ".heap"
#define BSP_SECTION_VECTOR ".vectors"
#define BSP_SECTION_ROM_REGISTERS ".rom_registers"
#define BSP_PLACE_IN_SECTION(x) __attribute__ ((section(x))) __attribute__ ((__used__))
#define BSP_DONT_REMOVE
#define BSP_ALIGN_VARIABLE(x) __attribute__ ((aligned (x)))
#define BSP_PACKED __attribute__ ((aligned(1)))

系统默认为4字节自然地址对齐方式。

“符号”对齐配置:

typedef struct _SystemActive_
{
TempStatus sTemp;
LedStatus sLed;
Cup sCup;
bool bSetWaterCircle;
BuzzerType eBuzzer;
bool bPumpMotor;
}SystemActive; typedef struct _SystemStatus_
{
PoolStat ePool;
uint32_t u32PoolTemp;
uint32_t u32CompressTemp;
CupSet aCup[CUP_MAX];
bool bIsCool;
bool bIsCoolHeatChange;
bool bIsAutoCup;
bool bIsCleanMode;
CupStatus eCup;
bool bIsTestSelf;
uint32_t u32Magic;
}SystemStatus BSP_ALIGN_VARIABLE(16); SystemStatus g_sysSta;
SystemActive g_sysAct;

地址空间如下:

g_netif_init_done/g_sysSta 地址空间相邻,g_netif_init_done 地址空间为“0x2003b994”,大小为“4”个字节,以此推,下一个符号g_sysSta 的地址应为 0x2003b994 + 4 = 0x2003b998
但g_sysSta 设置的对16字节齐方式“BSP_ALIGN_VARIABLE(16)”,如下g_sysSta地址为“0x2003b9a0” 16字节对齐
[kk@Debug]$readelf -s iotBaidu.elf | sort -k  > ss.c

: 2003b982 1  OBJECT GLOBAL DEFAULT  dev_stat
: 2003b984 OBJECT GLOBAL DEFAULT g_active_interface
: 2003b994 OBJECT GLOBAL DEFAULT g_netif_init_done
: 2003b9a0 OBJECT GLOBAL DEFAULT g_sysSta
: 2003b9d8 OBJECT GLOBAL DEFAULT g_pumpWaterStartTick

如果设置为“256”字节对齐,地址空间如下:

 : 2003ba12      OBJECT  GLOBAL DEFAULT     dev_stat
: 2003ba14 OBJECT GLOBAL DEFAULT g_active_interface
: 2003ba24 OBJECT GLOBAL DEFAULT g_netif_init_done
: 2003bb00 OBJECT GLOBAL DEFAULT g_sysSta
: 2003bb38 OBJECT GLOBAL DEFAULT g_pumpWaterStartTick

那么在两个符号之间,0x2003ba24->0x2003bb00造成了比较大的空间浪费(0x2003bb00 - 0x2003ba24 - 4 = 216字节浪费)。

__attribute__ ((aligned (x))) 位置比较关键:

  书写在不同的位置,符号占用空间是不一样的。

[kk@Debug]$ readelf -s iotBaidu.elf | sort -k 

typedef struct _SystemStatus_
{
PoolStat ePool;
uint32_t u32PoolTemp;
uint32_t u32CompressTemp;
CupSet aCup[CUP_MAX];
bool bIsCool;
bool bIsCoolHeatChange;
bool bIsAutoCup;
bool bIsCleanMode;
CupStatus eCup;
bool bIsTestSelf;
uint32_t u32Magic;
}SystemStatus BSP_ALIGN_VARIABLE(); //符号只是地址空间256字节对齐,符号的大小是没有变化的,即56字节
: 2003ba24 OBJECT GLOBAL DEFAULT g_netif_init_done
: 2003bb00 OBJECT GLOBAL DEFAULT g_sysSta
: 2003bb38 OBJECT GLOBAL DEFAULT g_pumpWaterStartTick typedef struct _SystemStatus_
{
PoolStat ePool;
uint32_t u32PoolTemp;
uint32_t u32CompressTemp;
CupSet aCup[CUP_MAX];
bool bIsCool;
bool bIsCoolHeatChange;
bool bIsAutoCup;
bool bIsCleanMode;
CupStatus eCup;
bool bIsTestSelf;
uint32_t u32Magic;
}BSP_ALIGN_VARIABLE() SystemStatus; //符号的地址空间对齐方式和占用大小均为256字节
: 2003ba24 OBJECT GLOBAL DEFAULT g_netif_init_done
: 2003bb00 OBJECT GLOBAL DEFAULT g_sysSta
: 2003bc00 OBJECT GLOBAL DEFAULT g_pumpWaterStartTick

结构体内部的对齐方式:

1、使用#pragma pack(x) / #pragma pack()

2、使用 “__attribute__((packed))”对齐,相当于#pragma pack(1)

typedef struct _SystemStatus_
{
PoolStat ePool;
uint32_t u32PoolTemp;
uint32_t u32CompressTemp;
CupSet aCup[CUP_MAX];
bool bIsCool;
bool bIsCoolHeatChange;
bool bIsAutoCup;
bool bIsCleanMode;
CupStatus eCup;
bool bIsTestSelf;
uint32_t u32Magic;
}__attribute__((packed)) SystemStatus; //注意位置,地址空间及占用大小
//注意:这种方式黄色区域还是自然4字节对齐,其它1字节对齐,所以最后占用51字节
: 2003b994 OBJECT GLOBAL DEFAULT g_netif_init_done
: 2003b998 OBJECT GLOBAL DEFAULT g_sysSta
: 2003b9cc OBJECT GLOBAL DEFAULT g_pumpWaterStartTick

#pragma pack(x)方式:

#pragma pack(1)
... ... ...
typedef struct _SystemStatus_
{
PoolStat ePool;
uint32_t u32PoolTemp;
uint32_t u32CompressTemp;
CupSet aCup[CUP_MAX];
bool bIsCool;
bool bIsCoolHeatChange;
bool bIsAutoCup;
bool bIsCleanMode;
CupStatus eCup;
bool bIsTestSelf;
uint32_t u32Magic;
}SystemStatus;
... ... ...
#pragma pack() //这种方式,在#pragma pack(1) 到 #pragma pack()定义的类型都是1字节对齐,如下占用39字节 为最小占用
: 2003b994 OBJECT GLOBAL DEFAULT g_netif_init_done
: 2003b998 OBJECT GLOBAL DEFAULT g_sysSta
: 2003b9c0 OBJECT GLOBAL DEFAULT g_pumpWaterStartTick

Renesas 符号地址空间对齐的更多相关文章

  1. Python的符号、对齐和用0填充

    # 用0填充 print("用0填充:{0:010.2f}".format(math.pi)) # 用1填充(事实上,你无法实现“用1填充”,因为即使实现了,那也是另外一个数字) ...

  2. ARM 之一 ELF文件、镜像(Image)文件、可执行文件、对象文件 详解

    [转]https://blog.csdn.net/ZCShouCSDN/article/details/100048461 ELF 文件规范   ELF(Executable and Linking ...

  3. PAT自测_打印沙漏、素数对猜想、数组元素循环右移、数字加倍重排、机器洗牌

    -自测1. 打印沙漏() 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号 ...

  4. PAT算法题学习笔记

    1001. 害死人不偿命的(3n+1)猜想 (15) 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去, ...

  5. python基础教程-第三章-使用字符串

    本章将会介绍如何使用字符串何世华其他的值(如打印特殊格式的字符串),并简单了解下利用字符串的分割.联接.搜索等方法能做些什么 3.1 基本字符串操作 所有标准的序列操作(索引.分片.乘法.判断成员资格 ...

  6. PAT/图形输出习题集

    B1027. 打印沙漏 (20) Description: 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ...

  7. MongoDB学习——基础入门

    MongoDB--基础入门 MongoDB是目前比较流行的一种非关系型数据库(NoSql),他的优势这里不废话,我们关注怎么使用它. 安装 下载,首先肯定要去下载,我们去官网下载,在国内,可能没FQ可 ...

  8. python-day02数据类型-字符串和列表的操作

    while循环: while True: 条件语句....... 关于break和continue,break:跳出当前的循环                               contnu ...

  9. PAT 1027. 打印沙漏(20)

    本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓"沙漏形状",是指每行 ...

随机推荐

  1. java中容器的学习与理解

    以前一直对于java中容器的概念不理解,虽然学习过,但始终没有认真理解过,这几天老师提出了这样一个问题,你怎么理解java中的容器.瞬间就蒙了.于是各种搜资料学习了一下,下面是我学习后整理出来的的一些 ...

  2. log4j打印不同颜色

    1.首先在eclipse中安装一个插件: ANSI COLOR 在Eclipse Marketplace 中直接搜索  ANSI COLOR 然后安装 2.在log4j 中加入红色字体部分: < ...

  3. SQL 动态PIVOT查询

    DECLARE @sql_str VARCHAR(8000)DECLARE @sql_col VARCHAR(8000) SELECT @sql_col = ISNULL(@sql_col + ',' ...

  4. web.xml文件模板

     Servlet 2.3 deployment descriptor 注:web.xml中提示错误The content of element type "web-app" mus ...

  5. Android内存优化(三)避免可控的内存泄漏

    相关文章 Android性能优化系列 Java虚拟机系列 前言 内存泄漏向来都是内存优化的重点,它如同幽灵一般存于我们的应用当中,有时它不会现身,但一旦现身就会让你头疼不已.因此,如何避免.发现和解决 ...

  6. Vue(2) : Vue for Gank.io

    简介 最近学习Vue2.0,由于不懂前端知识,学习过程比较缓慢.文档学习过程如下: 通读vue官文 通读vue-router 2中文指南 学习axios 通读vuex官文 数据接口 再次感谢代码家的G ...

  7. linux另一种安装方式

    linux中其实没有“安装”的概念:安装就是设下路径,拷贝文件,复制文件,运行下脚本这些(windows也应该如此) 法一.把bin运行路径设成环境变量 法二.ln一下,例如: 解压下载的文件: ta ...

  8. js之无缝轮播图

      HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...

  9. 【解题报告】13级个人结业赛(二) ——动(dou)态(bu)规(hui)划(zuo)专场

    额.果然是动(dou)态(bu)规(hui)划(zuo)专场... A: 翻倍序列 dp[i][j]表示第i个位置是j的情况的个数那么dp[i][j]=∑dp[i-1][k]   (j%k==0)初始 ...

  10. matlab 相关系数的计算

    1. 首先说说自相关和互相关的概念.     这 个是信号分析里的概念,他们分别表示的是两个时间序列之间和同一个时间序列在任意两个不同时刻的取值之间的相关程度,即互相关函数是描述随机信号 x(t),y ...