本帖最后由 WCHTech37 于 2021-12-13 13:25 编辑
代码占用空间异常增大现象,可能与定义结构体时加了__attribute__((packed))属性有关,非必要时可选择不添加该语句。
如下面代码:
typedef struct __PACKED _struct_test1 {
UINT8 data1;
UINT16 data2;
UINT32 data3;
} struct_test1, *Pstruct_test1;
typedef struct _struct_test2 {
UINT8 data1;
UINT16 data2;
UINT32 data3;
} struct_test2, *Pstruct_test2;
void test1()
{
Pstruct_test1 p = (Pstruct_test1)0x40000000;
p->data3 = 0x87654321;
}
void test2()
{
Pstruct_test2 p = (Pstruct_test2)0x80000000;
p->data3 = 0x12345678;
}
int main(void)
{
......
test1();
test2();
......
}
test1和test2汇编代码如下:
test1():
p->data3 = 0x87654321;
21c:400007b7 lui a5,0x40000
220:02100713 li a4,33
224: 00e781a3 sb a4,3(a5) # 40000003 <_eusrstack+0x1fffb003>
228:04300713 li a4,67
22c:00e78223 sb a4,4(a5)
230:06500713 li a4,101
234:00e782a3 sb a4,5(a5)
238: f8700713 li a4,-121
23c:00e78323 sb a4,6(a5)
test1函数的总大小是0x23c-0x21c=0x20,32字节
test2():
p->data3 = 0x12345678;
240:123457b7 lui a5,0x12345
244:80000737 lui a4,0x80000
248:67878793 addi a5,a5,1656 # 12345678 <_data_lma+0x12343c30>
24c:c35c sw a5,4(a4)
test2函数的总大小是0x24c-0x240=0xc,12字节
test1()对成员变量data3访问时以字节的方式,test2()对成员变量data3访问时以4字节的方式. armcc对test1也是一样的处理以字节的方式,所不同的是ARM提供了sb的16位的压缩指令,但是RISC-V没有,RISC-V只提供sw的16位压缩指令。
如果要进一步分析代码变大的原因,需要比较ARM和RISC-V两个版本的MAP文件,看哪些函数变得特别大,然后再分析相应代码的汇编代码。
|