我正在学习Arduino在GNU / Linux上的汇编编程,使用带有AVR Atmega 16u2微控制器的Arduino UNO R3作为测试板。
在我阅读本文https://www.cypherpunk.at/2014/09/native-assembler-programming-on-arduino/时,说明必须是:
avr-as -g -mmcu=atmega16u2 -o simple_led_blink.o simple_led_blink.s
#to assemble
avr-ld -o simple_led_blink.elf simple_led_blink.o
#to link
但是,当我尝试执行第二条指令时,它会显示以下错误:
avr-ld: avr:35 architecture of input file `simple_led_blink.o' is incompatible with avr output
我已经检查了avr-as架构支持,并且支持这种架构。
可能是什么问题?
更新:最后,正如David所说,主微控制器是328p,而不是16u2 我使用指南中的说明,它运行良好
答案 0 :(得分:1)
通过运行avr-gcc test.c -v -mmcu=atmega16u2
,我们可以看出ATmega16U2的正确AVR架构版本为avr35
。
因此,要编译程序集,请运行如下命令:
avr-as -mavr35 -g -o test.o test.s
avr-ld -mavr35 -o test.elf test.o
请注意,您可能需要将其他选项传递给链接器,以确保正确设置程序大小和RAM大小,但如果您的程序很小,这可能无关紧要。
另请注意,ATmega16U2不是Arduino UNO的主处理器;主要是ATmega328P。
我不知道为什么教程中的-mmcu
选项不再起作用。也许近年来binutils的AVR端口被简化为仅了解AVR架构而不了解每个芯片。