ARM优化之结构体的定义
实验一:
我定义一个结构体:
typedef struct TestStruct
{
unsinged char Test1;
unsigned int Test2;
unsigned char Test3;
unsigned int Test4;
unsigned short Test5;
}TEST_STRUCT;
TEST_STRUCT TestStruct1;
然后我分别给这些成员都赋值,以便于在Memory里面观察。
TestStruct1.Test1 = 0x11;
TestStruct1.Test2 = 0x22334455;
TestStruct1.Test3 = 0x66;
TestStruct1.Test4 = 0x778899AA;
TestStruct1.Test5 = 0xBBCC;
然后我调用了sizeof函数来计算这个结构体的大小
sizeof(TestStruct1)
发现大小是20个Byte。而我原先预计的大小为1+4+1+4+2=12个Byte。
于是我利用AXD的内存监控查看了这段内存的分配(Little Endian),如下:
0x01,0x00,0x00,0x00,0x55,0x44,0x33,0x22,0x66,0x00,0x00,0x00,0xAA,0x99,0x88,0x77
0xCC,0xBB,0x00,0x00
发现ARM在编译的时候把原先不足Word长度的扩展成了Word长度。
实验二:
后来想到,可能ARM这么做是为了不破坏结构体的结构。于是把结构体改成了:
typedef struct TestStruct
{
unsinged char Test1;
unsigned char Test3;
unsigned short Test5;
unsigned int Test2;
unsigned int Test4;
}TEST_STRUCT;
再次调用sizeof,发现大小变成了12个Byte,符合了原先预计的大小。
再监控内存分配,如下:
0x01,0x06,0xCC,0xBB,0x55,0x44,0x33,0x22,0xAA,0x99,0x88,0x77
由此发现,原本松散的内存变得如此的紧凑。
实验三:
随后,又猜想,这样是否真的可以缩小内存损耗呢?ARM会不会在结构体的中间插入别的变量呢。
于是做了一个实验,建立了三个BYTE大小的变量。
unsigned char TestData0 = 0xDD;
unsigned char TestData1 = 0xEE;
unsigned char TestData2 = 0xFF;
然后结构体恢复成实验一的状态,监控了下内存,发现变成了:
0x01,0x00,0x00,0x00,0x55,0x44,0x33,0x22,0x66,0x00,0x00,0x00,0xAA,0x99,0x88,0x77
0xCC,0xBB,0x00,0x00,0xDD,0xEE,0xFF
看来ARM并没有在松散的结构体中插入别的变量。
实验四:
利用了自己的一个大的工程,200K左右的RO以及80K左右的RW+ZI,做了一下优化,发现效果明显,RW+ZI缩减了不少。
最后,想到了ADS里面的编译选项,三个级别的优化以及For time/For spce选项都不能改变这个结果。
结论:(本文基于ARM7TDMI)
ARM中结构体的成员的写法可以决定最后的耗用内存的大小,适当的优化可以节省大量宝贵的RAM。
ARM优化结构 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)