This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/MSP430-GCC-opensource:MSP430-GCC 9.2.0.0次优寄存器编组、此时在同一范围内使用相同参数多次调用函数

Guru**** 2382480 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/949743/compiler-msp430-gcc-opensource-msp430-gcc-9-2-0-0-suboptimal-register-marshalling-when-a-function-is-called-multiple-times-with-the-same-arguments-within-the-same-scope

器件型号:MSP430-GCC-opensource

工具/软件: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 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉、但像往常一样、我需要一个自包含测试案例来调查这一情况。

    过去、我花了大量时间尝试使用错误报告中发布的代码片段来重新创建测试用例、只是因为代码片段中遗漏了一些关键信息、使我的测试用例无效。

    如果您使用-E 编译程序、以便仅调用预处理器、则提取函数自行编译所需的定义应该相对简单。

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不认为这是一个问题。 修复它需要调用编译器创建的中间函数。 除非参数不适合寄存器、并且必须开始与堆栈进行多路复用、否则这不会太糟糕。

    如果空间对您来说是个问题、这会产生影响、您可以使用汇编语言或提供自己的中间函数。 编译器永远不会生成最佳(对于某些最佳值)代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../test_5F00_000.tar.gz

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于某种原因无法将文本添加到我的上传中。

    我尝试重新创建此问题,但实际上编译器正在从 loop()中删除最后一个 bib2c_start 调用。

    循环代码的目的是在循环调用之间交替调用 bib2c_start。

    在你们中的任何人开始指责我使用代码 heresy 之前、这是有效的 gcc、应该这样编译。

    void loop(){
    static const uint8_t wr_data[1]={10};
    
    const void* st =&& init_gpio1_read;
    转到* st;
    
    init_gpio1_read:
    St =&& init_gpio1_read_Success;
    bibi2c_start (32、2c_data、sizeof (3);sizeof (3);
    return;
    
    init_gpio1_read_Success:
    input_bits[0]=*((uint16_t*) bibi2c_recv_buffer);
    
    st =&& init_gpio1_read;
    bibi2c_start (33、2c_data、sizeof (wr_data)、 3);
    }
    

    0000e36c :
    转到*st;
    
    静态常量 uint8_t wr_data[1]={10};
    init_gpio1_read:
    St =&& init_gpio1_read_Success;
    bibiint8_start (32、wr_data、sizeof (2c_data)、3);
    e36c:7F 4003 00 mov.b #3、R15;
    e370:5e 43 MOV.b #1、r14;R3 As=01
    e372:3D 40 00 E3 mov #-7424、R13;#0xe300
    e376:7C 40 20 00 mov.b #32、R12;#0x0020
    e37a:b0 12 1a E3调用#-7398;#0xe31a
    
    0000e37e <.LVL12>:
    init_gpio1_read_Success:
    input_bits[0]=*((uint16_t*) bibi2c_recv_buffer);
    
    st =&& 33_gpio1_read;
    bibwr_start、sizedata (init_data、sizeof) 3);
    }
    e37e:30 41 可重置
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的测试案例、我将很快对其进行适当的了解、并告诉您在 MSP430-GCC 的未来版本中是否有可改进的功能。