- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于代码:
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
现在,据我所知,至少一对、最多两对插入-弹出对可以被消除:
要节省一次插入式操作,请使用 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
...
看到没有代码将 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/
在 CAN 传输设置过程中,指针被损坏(它从有效的 0x00000bd0 变为超出 RAM 范围的 0x84520000)。该指针也与 CAN 事件无关。损坏的原因是,union64 被写入了指针的地
我需要将大字符数转换为长字符数,以便在 AtmelStudio 上对我的 Atmega8 芯片进行编程。 我尝试使用 atol() 和 strtoul() 但它不起作用。我在谷歌上看到 strtoul
我正在尝试在 Windows 7 上安装 AtmelStudio 7,但安装在一段时间后停止。显示以下错误消息: An error occured AVR8 Device Support 到目前为止我
每当我构建任何项目时,我都会遇到同样的两个错误: ../ ./main.c: No such file or directory no input files 即使我开始一个新项目并只使用提供的默认
我是一名优秀的程序员,十分优秀!