gpt4 book ai didi

c - AtmelStudio编译代码: How to optimize compiler

转载 作者:行者123 更新时间:2023-11-30 15:15:21 25 4
gpt4 key购买 nike

对于代码:

uint8_t count;

ISR(TIMER1_OVF_vect, ISR_NAKED)
{
count++;
reti();
}

生成的程序集是:

--- F:\atmel-prj\compiler-test2\compiler-test2\Debug/.././compiler-test2.c -----
{
00000048 PUSH R1 Push register on stack
00000049 PUSH R0 Push register on stack
0000004A IN R0,0x3F In from I/O location
0000004B PUSH R0 Push register on stack
0000004C CLR R1 Clear Register
0000004D PUSH R24 Push register on stack
count++;
0000004E LDS R24,0x0100 Load direct from data space
00000050 SUBI R24,0xFF Subtract immediate
00000051 STS 0x0100,R24 Store direct to data space
}
00000053 POP R24 Pop register from stack
00000054 POP R0 Pop register from stack
00000055 OUT 0x3F,R0 Out to I/O location
00000056 POP R0 Pop register from stack
00000057 POP R1 Pop register from stack
00000058 RETI Interrupt return

现在,据我所知,至少一对、最多两对插入-弹出对可以被消除:

  1. 要节省一次插入式操作,请使用 r0 来消除 r24

    PUSH R1     Push register on stack 
    PUSH R0 Push register on stack
    IN R0,0x3F In from I/O location
    PUSH R0 Push register on stack
    CLR R1 Clear Register
    count++;
    LDS R0,0x0100 Load direct from data space
    SUBI R0,0xFF Subtract immediate
    STS 0x0100,R0 Store direct to data space
    ...
  2. 看到没有代码将 r1 用作 0 值,因此仅将 r1 用于所有目的。

    PUSH R1     Push register on stack 
    IN R1,0x3F In from I/O location
    PUSH R1 Push register on stack
    CLR R1 Clear Register
    count++;
    LDS R0,0x0100 Load direct from data space
    SUBI R0,0xFF Subtract immediate
    STS 0x0100,R0 Store direct to data space
    ...

这些都可以为我们节省宝贵的字节和微秒。

有没有办法可以将这些或类似的优化以某种方式放入 atmel studio 工具链/库中,以便我的编译代码生成得稍微好一些?
许多围绕中断和函数调用的代码以及一些 C 到汇编的翻译都可以得到很大的优化。

最佳答案

我还发现生成的汇编代码可以优化。那时我还没有使用 -On 选项。我发现被调用函数的代码(在寄存器中接受参数);将其复制到堆栈(以保留一个干净的副本作为“自动”C 变量...这在大多数情况下是无用的)并且进一步将此值复制回原始寄存器!而这个寄存器之前刚刚被读取过,GCC 应该知道它。

如果您使用 Atmel Studio 和默认编译器(GCC),您的二进制代码优化取决于工具链行为(因此,在其命令行上指定的选项)。

要获得最佳结果,您可以尝试直接使用 avr-gcc 编译源代码树(以设置 Atmel Studio 无法为您设置的选项)。

使用另一个工具链是获得(理论上)最好结果的另一种方法。无论如何,我怀疑任何其他工具链都会提供比 GCC 更好的(总体)结果。

关于c - AtmelStudio编译代码: How to optimize compiler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33680011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com