gpt4 book ai didi

c - __attribute__((OS_main)) 在 AVR 中导致奇怪的行为

转载 作者:太空宇宙 更新时间:2023-11-04 02:09:31 25 4
gpt4 key购买 nike

我不知道如何准确描述我看到的错误。如果我在 main() 中设置我的端口寄存器,一切都会按预期进行。但是,如果我尝试在函数中执行此操作,程序就会停止。

主.c:

__attribute__((OS_main)) int main(void);
int main(void) {
DDRD = 0xF0;
PORTD = 0xF0;
led( LED_GREEN, true );
while( true );
}

这会打开绿色 LED。但是,如果我将端口设置移动到一个单独的函数,则不会发生任何事情,如下所示:

__attribute__((OS_main)) int main(void);
int main(void) {
hwInit();
led( LED_GREEN, true );
while( true );
}

罪魁祸首似乎是 attribute 行,因为如果我将其注释掉,第二个示例将按预期工作。我的问题是理解为什么,因为据我所知,OS_main 属性应该只告诉编译器它不应该在进入或退出函数时存储任何寄存器。这不对吗?

最佳答案

以下是在 ArchLinux 下用 avr-gcc 4.8.0 编译的。分发应该与情况无关,但是编译器和编译器版本可能会产生不同的输出。代码:

#include <avr/io.h>

#define LED_GREEN PD7
#define led(p, s) { if(s) PORTD |= _BV(p); \
else PORTD &= _BV(p); }

__attribute__((OS_main)) int main(void);
__attribute__((noinline)) void hwInit(void);

void hwInit(void){
DDRD = 0xF0;
}

int main(void){

hwInit();
led(LED_GREEN, 1);

while(1);
}

生成:

000000a4 <hwInit>:
a4: 80 ef ldi r24, 0xF0 ; 240
a6: 8a b9 out 0x0a, r24 ; 10
a8: 08 95 ret

000000aa <main>:
aa: 0e 94 52 00 call 0xa4 ; 0xa4 <hwInit>
ae: 5f 9a sbi 0x0b, 7 ; 11
b0: ff cf rjmp .-2 ; 0xb0 <main+0x6>

编译时avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega168 -DF_CPU=1000000UL -MMD -MP -MF"core.d"- MT"core.d"-c -o "core.o""../core.c" 并相应链接。

注释来自上述来源的 __attribute__((OS_main)) int main(void); 对生成的程序集没有影响。然而,奇怪的是,从 hwInit() 中删除 noinline 指令具有编译器将函数内联到 main 中的效果,正如预期的那样,但函数本身仍然作为最终的二进制文件,即使使用 -Os 编译也是如此。

这让我相信您的编译器版本/编译器的参数正在生成一些不正确的程序集。可以的话,能否将相关区域的反汇编贴出来,以供进一步检查?

后期编辑添加了两个贡献,其中第二个解决了手头的问题:Hanno Binder 指出:“为了从二进制文件中删除那些‘未使用’的函数,您还需要 -ffunction-sections -Wl,--gc-sections。”

Asker 添加 [释义]:“我按照一个教程忽略了 avr-objcopy 创建 hex 文件的步骤。我假设为正确的目标编译和链接项目就足够了(出于某种原因,它是为了基本功能)。在添加 avr-objcopy 步骤来生成文件后,一切正常。”

关于c - __attribute__((OS_main)) 在 AVR 中导致奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16103979/

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