Renesas 符号地址空间对齐
对齐方式定义头文件: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 符号地址空间对齐的更多相关文章
- Python的符号、对齐和用0填充
# 用0填充 print("用0填充:{0:010.2f}".format(math.pi)) # 用1填充(事实上,你无法实现“用1填充”,因为即使实现了,那也是另外一个数字) ...
- ARM 之一 ELF文件、镜像(Image)文件、可执行文件、对象文件 详解
[转]https://blog.csdn.net/ZCShouCSDN/article/details/100048461 ELF 文件规范 ELF(Executable and Linking ...
- PAT自测_打印沙漏、素数对猜想、数组元素循环右移、数字加倍重排、机器洗牌
-自测1. 打印沙漏() 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号 ...
- PAT算法题学习笔记
1001. 害死人不偿命的(3n+1)猜想 (15) 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去, ...
- python基础教程-第三章-使用字符串
本章将会介绍如何使用字符串何世华其他的值(如打印特殊格式的字符串),并简单了解下利用字符串的分割.联接.搜索等方法能做些什么 3.1 基本字符串操作 所有标准的序列操作(索引.分片.乘法.判断成员资格 ...
- PAT/图形输出习题集
B1027. 打印沙漏 (20) Description: 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ...
- MongoDB学习——基础入门
MongoDB--基础入门 MongoDB是目前比较流行的一种非关系型数据库(NoSql),他的优势这里不废话,我们关注怎么使用它. 安装 下载,首先肯定要去下载,我们去官网下载,在国内,可能没FQ可 ...
- python-day02数据类型-字符串和列表的操作
while循环: while True: 条件语句....... 关于break和continue,break:跳出当前的循环 contnu ...
- PAT 1027. 打印沙漏(20)
本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓"沙漏形状",是指每行 ...
随机推荐
- Qt 元对象系统(Meta-Object System)
(转自:http://blog.csdn.net/aladdina/article/details/5496891) Qt的元对象系统基于如下三件事情: 类:QObject,为所有需要利用原对象系统的 ...
- C#连接Oracle数据库查询数据
C#连接Oracle数据库可以实现许多我们需要的功能,下面介绍的是C#连接Oracle数据库查询数据的方法,如果您对C#连接Oracle数据库方面感兴趣的话,不妨一看. using System; u ...
- 使用Eclipse EE(汉化版) 创建一个JavaWeb工程
第一步:打开eclipse ee,单击“文件”-->单击“新建”-->单击“动态Web项目”. 若没找到“动态Web项目”,单击“其他” -->在弹出的窗口中打开“Web”下拉菜单 ...
- Appium 测试APK
介绍 Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持iOS.Android及FirefoxOS平台测试.Appium使用WebDriver的json w ...
- lcx端口转发 linux版
一.端口转发使用 1.攻击机上执行以下命令 ./lcx -p1 -p2 -m 在本地监听3389端口,并将发送到本机3389端口的数据传递到本机2222端口 2.跳板机上执行以下命令 ./lcx -h ...
- VPS安装metasploit-framework
一.安装过程 在/etc/apt/sources.list添加kali源: root@localhost:~# cat >> /etc/apt/sources.list << ...
- New Concept English there (2)Typing speed exercise
typing speed (11words/ seconds) our vicar ia always rising money for one cause or another, but he ha ...
- Ubuntu 中sendmail 的安装、配置与发送邮件的具体实现
一.安装 ubuntu中sendmail函数可以很方便的发送邮件,ubuntu sendmail先要安装两个包. 必需安装的两个包: 代码 sudo apt-get install sendmail ...
- 解决错误:This bundle is invalid - The file extension must be .zip
近期在 iOS 开发中遇到了一个很蛋疼的问题,Xcode 工程中接入了iMessage 壁纸的功能后,每次上传 ipa 包都会显示此包无效,并报上述的错误描述:This bundle is inval ...
- 深度学习(六十八)darknet使用
这几天因为要对yolo进行重新训练,需要用到imagenet pretrain,由于网络是自己设计的网络,所以需要先在darknet上训练imagenet,由于网上都没有相关的说明教程,特别是图片路径 ...