工具/软件:TI C/C++编译器
在我的情况下、我有一个 bitbang i2c 函数、用于从具有不同地址的2个模块收集数据。
唯一更改的参数是 i2c 地址。
我使用以下标志进行编译:
CFLAGS =-mmcu=$(MCU)-std=gnu11 -g -OS -fno-IPA-ICF 函数\
-wound-wunused_ffunion-sections -fdata-sections -f省 略-frame-pointer -fwrapv -MMD
{ 静态常量 uint8_t wr_data[1]={P64P_INPUT}; init_GPIO1_READ: MOD_MASK = 1; s_idx = 2; bbi2c_start (GPIO1_ADDR、wr_data、sizeof (wr_data)、3); 返回; init_gpio1_read_Success: input_bits[0]=*((uint16_t*) bbi2c_recv_buffer); init_gpio2_read: MOD_MASK = 2; s_idx = 3; bbi2c_start (GPIO2_ADDR、wr_data、sizeof (wr_data)、3); 返回; }
但是、调用函数时、gcc 生成的代码会复制 R13-R15寄存器分配。
f2c0、f2c4和 f2c6上的指令是冗余的。
f2a6上的指令应该位于 f29c 之前、而 f2ce 上的 JMP 应该针对 R15分配、而不是调用。
0000f29c <.Loc.484.2>: bbi2c_start (GPIO1_ADDR、wr_data、sizeof (wr_data)、3); f29c:7F 4003 00 mov.b #3、R15; f2a0:5e 43 MOV.b #1、r14;R3 As=01 f2a2:3D 40 29 E3 mov #-7383、R13;#0xe329 f2a6:7C 40 21 00 mov.b #33、R12;#0x0021 0000f2aa <.L287>: bbi2c_start (GPIO2_ADDR、wr_data、sizeof (wr_data)、3); f2aa:b0 12 04 EC 调用#-5116;#0xec04 0000f2ae <.LVL226>: 返回; f2ae:e7 3f JMP 48美元 ;abs 0xf27e 0000f2b0 <.L251>: input_bits[0]=*((uint16_t*) bibi2c_recv_buffer); f2b0:92 42 c0 26 mov &0x26c0、&0x26b8;0x26c0 f2b4:B8 26 0000f2b6 <.L252>: MOD_MASK = 2; f2b6:E2 43 93 26 mov.b #2、&0x2693;R3 A=10 0000f2ba <.Loc.492.2>: s_idx = 3; f2ba:B2 40 03 00 mov #3、&0x2028; f2be:28 20 0000f2c0 <.Loc.493.2>: bbi2c_start (GPIO2_ADDR、wr_data、sizeof (wr_data)、3); f2c0:7F 4003 00 mov.b #3、R15; f2c4:5e 43 MOV.b #1、r14;R3 As=01 f2c6:3D 40 29 E3 mov #-7383、R13;#0xe329 f2ca:7C 40 20 00 mov.b #32、R12;#0x0020 f2ce:ED3f JMP 36美元 ;abs 0xf2aa