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个"*",要求按下列格式打印 ***** *** * *** ***** 所谓"沙漏形状",是指每行 ...
随机推荐
- this指针逃逸问题
this指针逃逸是指在构造函数返回之前,其他线程已经就持有了该对象的应用,产生的结果自然和预期可能会产生差异.常见的this指针逃逸,在并发编程实战一书中,作者指出:在构造函数中注册事件监听,在构造函 ...
- window环境下创建Flask项目需要安装常见模块命令
安装Flask环境 pip install flask==0.10.1 使用命令行操作 pip install flask-script 创建表单 pip install flask-wtf 操作数据 ...
- 【python】matplotlib进阶
参考文章:https://liam0205.me/2014/09/11/matplotlib-tutorial-zh-cn/ 几个重要对象:图像.子图.坐标轴.记号 figure:图像, subplo ...
- win2008 服务器文件夹权限配置
通过控制文件夹权限来提高站点的安全性. 这一篇权限设置包括二个方面,一个是系统目录.盘符的权限,一个是应用程序的上传文件夹权限设置. 系统目录 确保所有盘符都是NTFS格式,如果不是,可以用命令 co ...
- sar工具使用详细介绍
一:命令介绍:参考资料:http://linux.die.net/man/1/sar sar(System ActivityReporter系统活动情况报告)是目前Linux上最为全面的系统性能分析工 ...
- MySQL安装部署及调优
MySQL安装 二进制安装 - mysql-5.5.49 mkdir /home/oldboy/tools -p cd /home/oldboy/tools/ rz #mysql-5.5.49-lin ...
- ICE:slice语言常识整理
ICE:Slice语言(二)--源文件和词法规则: 文件命名 Slice的源文件以.ice为扩展名. 对于大小写不区分的系统(例如DOS),文件的扩展名可以大写,也可以小写,例如Cli ...
- c语言第4次作业
题目7-2九九乘法表 1.代码: #include<stdio.h> int main() { int N, i, j, q; scanf("%d",&N); ...
- storyboard出口回退问题
问题 直接在Main.storyboard拖动添加到出口的时候总是出一些不知名的错误.猜想可能是swift4又TM换了新特性(不过好喜欢啊哈哈哈哈) 解决 其实可以先拖动添加@IBAction函数到代 ...
- does not contain bitcode ShardSDK等三方库
今天升级了XCode到7.0 重新编译项目出现了下面这些错误提示, ShardSDK/ShareSDK.framework/ShareSDK' does not contain bitcode. ...