对齐方式定义头文件: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. 杀死dialog

    先 pkill -9 normal.sh 和  pkill -9 terminal_ui.sh 然后在pkill -9 dialog

  2. rsync技巧

    rsync格式: # 拷贝本地文件.当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式.如:rsync -a /data /backup rsync [OPTION]... S ...

  3. webmin 安装

    webmin 安装1.下载:wget http://prdownloads.sourceforge.net/webadmin/webmin-1.850-1.noarch.rpm2.安装依赖环境:yum ...

  4. 访问IO设备

    http://blog.csdn.net/goodluckwhh/article/details/16986871 内存屏障主要解决的问题是编译器的优化和CPU的乱序执行.编译器在优化的时候,生成的汇 ...

  5. SpringMVC札集(03)——基于注解的SpringMVC入门完整详细示例

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  6. [Python] 比较两个数组的元素的异同

    通过set()获取两个数组的交/并/差集: print set(a) & set(b) # 交集, 等价于set(a).intersection(set(b)) print set(a) | ...

  7. 什么时候应该使用Autorelease Pool

    csdn首发:http://blog.csdn.net/guijiewan/article/details/46470285 Objective c使用ARC之后,一般都不需要再手动调用retain, ...

  8. Aria2 - OS X 下载百度云资源神器

    官网介绍: (Aria2 is a light weight multi-protocol & multi-source command-line download utility. It s ...

  9. 单机ZooKeeper配置

    1.创建zoo.cfg copy D:\zookeeper3.4.6\conf\zoo_sample.cfg zoo.cfg 修改追加如下内容 dataDir=D:/zookeeper3.4.6/da ...

  10. 使用TR1的智能指针

    作为C++程序员,在没有智能指针,手动管理内存的蛮荒岁月里,可以说是暗无天日,痛苦异常.直到上帝说,还是要有光,于是智能指针进了标准.C++码农的日子总算好起来了. 虽然一直鄙视着没有显式指针的语言, ...