我创建了以下头文件,其中包含要在代码中使用的AVR引脚的定义。
#define LED_PORT PORTB
#define LED_PIN PINB
#define LED_DDR DDRB
#define LED0 PB0
我遇到了两个我无法解决的失败。
1)我在这个头文件中有两个问题,如下所示:
2)此外,我在USART. h文件的USART头文件中创建的函数(我实现的)也无法识别
我其实不明白为什么会这样。因为代码显然已经实现了头文件。
#ifndef F_CPU
#define F_CPU 1000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
#include "pinDefinition.h"
#include "USART.h"
int main(void) {
char serialCharacter;
LED_DDR = 0xff;
initUSART();
printString("Hello World!\r\n");
while (1) {
serialCharacter = receiveByte();
transmitByte(serialCharacter);
LED_PORT = serialCharacter;
}
return (0);
}
我使用的编译器是AVR-GCC。
此外,当我直接包含USART.c时,一切都工作正常。但我不明白为什么头文件不工作。
我创建了一个运行编译器/链接器的脚本:
#!/bin/bash
avr-gcc -g -Os -mmcu=atmega328p -c code.c util.c USART.c
avr-gcc -g -mmcu=atmega328p -o code.elf code.o
avr-objcopy -j .text -j .data -O ihex code.elf code.hex
avr-size --format=avr --mcu=atmega328p code.elf
这将返回上述错误。
USART.h如下所示:
/* These are defined for convenience */
#define USART_HAS_DATA bit_is_set(UCSR0A, RXC0)
#define USART_READY bit_is_set(UCSR0A, UDRE0)
#include <stdint.h>
void initUSART(void);
void transmitByte(uint8_t data);
uint8_t receiveByte(void);
void printString(const char myString[]);
void readString(char myString[], uint8_t maxLength);
void printByte(uint8_t byte);
void printWord(uint16_t word);
void printBinaryByte(uint8_t byte);
char nibbleToHex(uint8_t nibble);
char nibbleToHexCharacter(uint8_t nibble);
void printHexByte(uint8_t byte);
uint8_t getNumber(void);
我真的需要一些帮助,因为我正在努力解决这个问题,现在三天,并阅读了很多不同的来源(我得到我的绳子仍然与C,所以请注意)。C
1条答案
按热度按时间lhcgjxsq1#
我创建了一个运行编译器/链接器的脚本:
avr-gcc -g -Os -mmcu=atmega328p -c code.c util.c USART.c
此命令生成三个文件:
code.o
、util.o
和USART.o
,而以下链接命令仅链接一个目标文件:avr-gcc -g -mmcu=atmega328p -o code.elf code.o
因此,后两个编译单元的所有函数都丢失了,这导致了链接器中出现一串 “undefined reference to”。修复方法是链接所有三个目标文件:
avr-gcc -g -mmcu=atmega328p -o code.elf code.o util.o USART.o
头文件中未声明的标识符
C中的头文件(
module.h
)只包含模块(module.c
)中的函数声明,但函数的实现/定义在 *.c文件中。(一个例外是在头文件中定义的static inline
函数,但代码中未定义的引用不是这种情况。)