为atmega128编译程序集时找不到“avr/io.h”

问题描述 投票:0回答:1

我是汇编器和 atmega128 的新手。

我遇到的问题是我无法编译我的汇编文件。完成此步骤后,我想将程序上传到 STK-300。

这是代码

.include "avr/io.h"

.org 0x0000
    rjmp reset

reset:
    ldi r16,0xff
    out DDRB,r16

loop:
    in r16,PIND
    ori r16,0b00000010
    andi r16,0b11110111
    out PORTB,r16
    rjmp loop

我尝试用

编译它
~ avr-gcc -mmcu=atmega128 -I/usr/lib/avr/include -o main.elf main.S
/tmp/cctvJInM.s: Assembler messages:
/tmp/cctvJInM.s:5: Error: can't open avr/io.h for reading: No such file or directory

现在我已经安装了

avr-gcc
avr-libc
binutils-avr

我真的不知道如何调试这个。我检查了 avr 目录并找到了文件

~ ls /usr/lib/avr/include/avr/
boot.h         ioa6285.h      iom168p.h       iom32.h         iom88pa.h    iotn828.h     iox256a3.h
builtins.h     ioa6286.h      iom169a.h       iom32hvb.h      iom88pb.h    iotn841.h     iox256a3u.h
common.h       ioa6289.h      iom169.h        iom32hvbrevb.h  iom88p.h     iotn84a.h     iox256c3.h
cpufunc.h      ioa6612c.h     iom169pa.h      iom32m1.h       iom8a.h      iotn84.h      iox256d3.h
crc16.h        ioa6613c.h     iom169p.h       iom32u2.h       iom8.h       iotn85.h      iox32a4.h
delay.h        ioa6614q.h     iom16a.h        iom32u4.h       iom8hva.h    iotn861a.h    iox32a4u.h
eeprom.h       ioa6616c.h     iom16.h         iom32u6.h       iom8u2.h     iotn861.h     iox32c3.h
fuse.h         ioa6617c.h     iom16hva2.h     iom406.h        iomx8.h      iotn87.h      iox32c4.h
interrupt.h    ioa664251.h    iom16hva.h      iom48a.h        iomxx0_1.h   iotn88.h      iox32d3.h
io1200.h       ioa8210.h      iom16hvb.h      iom48.h         iomxx4.h     iotn9.h       iox32d4.h
io2313.h       ioa8510.h      iom16hvbrevb.h  iom48pa.h       iomxxhva.h   iotnx4.h      iox32e5.h
io2323.h       ioat94k.h      iom16m1.h       iom48pb.h       iotn10.h     iotnx5.h      iox384c3.h
io2333.h       iocan128.h     iom16u2.h       iom48p.h        iotn11.h     iotnx61.h     iox384d3.h
...

我尝试使用

.include "avr/iom128.h
包含更具体的头文件(但我真的不知道我到底需要哪一个)。

有人知道问题是什么,或者有任何调试技巧吗?

提前致谢。

assembly include avr atmega avr-gcc
1个回答
0
投票

avr/io.h
是一个使用 C 预处理器的 C/C++ 头文件,因此使用

#include <avr/io.h>

.include
将使用gas的预处理器,它具有不同的语法并在不同的时间运行(CPP在汇编器之前运行,而gas的则由汇编器本身运行)。

avr-gcc -mmcu=atmega128 -I/usr/lib/avr/include ...

我会删除该包含路径:一个理智的工具链会知道在哪里可以找到它的标头。如果没有找到系统标头,那么您的安装就损坏了。

© www.soinside.com 2019 - 2024. All rights reserved.