avr-gcc atmega164pa 错误端口未声明
avr-gcc atmega164pa error port undeclared
编译以下代码时:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void) {
DDRC = 255;
while(1){
PORTC=255;
_delay_ms(200);
PORTC=0;
_delay_ms(200);
}
return 0;
}
ATMega16 没问题:
avr-gcc -w -Os -DF_CPU=1000000UL -mmcu=atmega16 -c -o main.o main.c
但是,对于 ATMega164PA,我收到以下错误:
avr-gcc -w -Os -DF_CPU=1000000UL -mmcu=atmega164pa -c -o main.o main.c
error: DDRC
undeclared (first use in this function)
DDRC=255;
^
error: PORTC
undeclared (first use in this function)
PORTC=255;
^
atmega164p
甚至可以,但 atmega164pa
这个问题似乎是因为文件 io.h
中没有包含 MCU 类型 __AVR_ATmega164PA__
的特定文件;只有: __AVR_ATmega164P__
和 __AVR_ATmega164A__
。我认为 164PA 的代码必须编译为 164P。
这是文件中的部分代码io.h
#elif defined (__AVR_ATmega163__)
# include <avr/iom163.h>
//------------------------------------------------------------ To note
#elif defined (__AVR_ATmega164P__) || defined (__AVR_ATmega164A__)
# include <avr/iom164.h>
//--------------------------------------------------------------------
#elif defined (__AVR_ATmega165__) || defined (__AVR_ATmega165A__)
# include <avr/iom165.h>
如果您看到编译器输出,您可能会注意到更多警告:
In file included from avr164.c:3:0:
--------------------------------------------> To note
/usr/lib/avr/include/avr/io.h:428:6: warning: #warning "device type not defined" [-Wcpp]
# warning "device type not defined"
^
To note <---------------------------------------------
avr164.c: In function ‘main’:
avr164.c:8:1: error: ‘DDRC’ undeclared (first use in this function)
DDRC = 255;
^
avr164.c:8:1: note: each undeclared identifier is reported only once for each function it appears in
avr164.c:28:1: error: ‘PORTC’ undeclared (first use in this function)
PORTC=255;
^
第一个警告:io.h:428:6: warning: #warning "device type not defined"
表明预处理器已经解析了 io.h
文件,直到发出警告的那一行。
在文件的以下行中 io.h
您可能会看到发出警告的位置。
#elif defined (__AVR_M3000__)
# include <avr/iom3000.h>
#else // <<<---------------------- To note!
// To note -------------------------------
# if !defined(__COMPILING_AVR_LIBC__)
# warning "device type not defined"
# endif
// To note -------------------------------
#endif
发出的警告表明您可能没有针对指定目标的库(并且 "fortunately" 出于我的调试目的也表明感兴趣的部分结束)。
如果您尝试在不管理 PORTC
和 DDRC
(评论它们的使用)的情况下编译软件,您应该得到如下结果:
In file included from avr164.c:3:0:
/usr/lib/avr/include/avr/io.h:428:6: warning: #warning "device type not defined" [-Wcpp]
# warning "device type not defined"
^
---------------------------> Note
/usr/lib/gcc/avr/4.8.2/../../../avr/bin/ld: cannot find crtm164pa.o: No such file or directory
collect2: error: ld returned 1 exit status
Note <---------------------------
结果表明您在链接器环境中没有 crtm164pa.o 文件。 (这是另一个问题!)
我用过:avr-gcc (GCC) 4.8.2
编译以下代码时:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void) {
DDRC = 255;
while(1){
PORTC=255;
_delay_ms(200);
PORTC=0;
_delay_ms(200);
}
return 0;
}
ATMega16 没问题:
avr-gcc -w -Os -DF_CPU=1000000UL -mmcu=atmega16 -c -o main.o main.c
但是,对于 ATMega164PA,我收到以下错误:
avr-gcc -w -Os -DF_CPU=1000000UL -mmcu=atmega164pa -c -o main.o main.c
error:
DDRC
undeclared (first use in this function)DDRC=255;
^
error:
PORTC
undeclared (first use in this function)PORTC=255;
^
atmega164p
甚至可以,但 atmega164pa
这个问题似乎是因为文件 io.h
中没有包含 MCU 类型 __AVR_ATmega164PA__
的特定文件;只有: __AVR_ATmega164P__
和 __AVR_ATmega164A__
。我认为 164PA 的代码必须编译为 164P。
这是文件中的部分代码io.h
#elif defined (__AVR_ATmega163__)
# include <avr/iom163.h>
//------------------------------------------------------------ To note
#elif defined (__AVR_ATmega164P__) || defined (__AVR_ATmega164A__)
# include <avr/iom164.h>
//--------------------------------------------------------------------
#elif defined (__AVR_ATmega165__) || defined (__AVR_ATmega165A__)
# include <avr/iom165.h>
如果您看到编译器输出,您可能会注意到更多警告:
In file included from avr164.c:3:0:
--------------------------------------------> To note
/usr/lib/avr/include/avr/io.h:428:6: warning: #warning "device type not defined" [-Wcpp]
# warning "device type not defined"
^
To note <---------------------------------------------
avr164.c: In function ‘main’:
avr164.c:8:1: error: ‘DDRC’ undeclared (first use in this function)
DDRC = 255;
^
avr164.c:8:1: note: each undeclared identifier is reported only once for each function it appears in
avr164.c:28:1: error: ‘PORTC’ undeclared (first use in this function)
PORTC=255;
^
第一个警告:io.h:428:6: warning: #warning "device type not defined"
表明预处理器已经解析了 io.h
文件,直到发出警告的那一行。
在文件的以下行中 io.h
您可能会看到发出警告的位置。
#elif defined (__AVR_M3000__)
# include <avr/iom3000.h>
#else // <<<---------------------- To note!
// To note -------------------------------
# if !defined(__COMPILING_AVR_LIBC__)
# warning "device type not defined"
# endif
// To note -------------------------------
#endif
发出的警告表明您可能没有针对指定目标的库(并且 "fortunately" 出于我的调试目的也表明感兴趣的部分结束)。
如果您尝试在不管理 PORTC
和 DDRC
(评论它们的使用)的情况下编译软件,您应该得到如下结果:
In file included from avr164.c:3:0:
/usr/lib/avr/include/avr/io.h:428:6: warning: #warning "device type not defined" [-Wcpp]
# warning "device type not defined"
^
---------------------------> Note
/usr/lib/gcc/avr/4.8.2/../../../avr/bin/ld: cannot find crtm164pa.o: No such file or directory
collect2: error: ld returned 1 exit status
Note <---------------------------
结果表明您在链接器环境中没有 crtm164pa.o 文件。 (这是另一个问题!)
我用过:avr-gcc (GCC) 4.8.2