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个"*",要求按下列格式打印 ***** *** * *** ***** 所谓"沙漏形状",是指每行 ...
随机推荐
- 快速切题 sgu 112. a^b-b^a 大数 次方 难度:0 非java:1
112. a^b-b^a time limit per test: 0.25 sec. memory limit per test: 4096 KB You are given natural num ...
- C#中使用GUID
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...
- hdu 6113 度度熊的01世界(结构体的赋值问题)
题目大意: 输入n*m的字符串矩形,判断里面的图形是1还是0,还是什么都不是 注意:结构体中放赋值函数,结构体仍旧能定义的写法 #include <iostream> #include&l ...
- 说说C++多重继承
尽管大多数应用程序都使用单个基类的公用继承,但有些时候单继承是不够用的,因为可能无法为问题域建模或对模型带来不必要的复杂性.在这种情况下,多重继承可以更直接地为应用程序建模. 一.基本概念 多重继承是 ...
- SpringInAction-- 配置Profile Bean
Profile Bean 使用场景描述: 在开发软件的时候,在数据库方面,往往不是一个库就能解决的,一般分为开发库.测试库.生产库,在这些库设置链接的时候,也会配置其对应的数据. 现有一种方式,就是单 ...
- java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB3' for column 'Content' at row 1
在尝试将 emoji 表情符号 插入MySQL数据库时,遇到以下错误信息: ### The error occurred while setting parameters ### SQL: INSER ...
- 《利用Python进行数据分析》笔记---第2章--1880-2010年间全美婴儿姓名
写在前面的话: 实例中的所有数据都是在GitHub上下载的,打包下载即可. 地址是:http://github.com/pydata/pydata-book 还有一定要说明的: 我使用的是Python ...
- Nginx 作为反向代理优化要点proxy_buffering
当nginx用于反向代理时,每个客户端将使用两个连接:一个用于响应客户端的请求,另一个用于到后端的访问: 那么,可以从如下配置起步: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- java入门学习(3)—循环,选择,基础算法,API概念
1.顺序结构:也就是顺着程序的前后关系,依次执行.2.选择分支:利用if..else , / switch(){case [ 这个必须是常量]:}; / if..else if….. ….else.. ...
- [QT]数据库SQLITE使用错误记录
1.仿照创建数据库的例程编写代码,出现以下问题: ① 创建QSqlQuery query; 注意:这里没有将 query 与 QSqlSatabase db, 关联,正确的应该是 : QSqlQu ...