当我使用以下代码时,我对atmega32有一个问题:
#include "../HAL/led/Led.h"
#define F_CPU 16000000UL
#include "../MCAL/Interrupt/ExtIntREG.h"
#include <avr/interrupt.h>
int flag = 0;
int main(void)
{
SET_BIT(MCUCR, ISC00);
SET_BIT(MCUCR, ISC01);
SET_BIT(GICR, INT0);
SET_BIT(SREG, I);
Led_init(LED0);
while(1)
{
Led_on(LED0);
}
}
/*
ISR(INT0_vect)
{
//flag = 1;
Led_on(LED2);
}
*/我用它来测试LED,如果它不使用中断,只需要测试LED是否包含avr/interintert.hlib,但是除非我评论了库的包含,否则LED不能工作。
编辑:当禁用中断但仍然包括中断头时,led仍然不能工作。
这是我的制作文件:
DEVICE = atmega32
FILENAME = APP/main
FREQ = 16000000UL
COMPILE = avr-gcc -Wall -Os -mmcu=$(DEVICE)
ADDITIONAL = BIT_MATH.h REG.h STD.h
HELPERS = MCAL/DIO/Dio.c MCAL/DIO/Dio.h
BUZZER = HAL/buzzer/Buzzer.c HAL/buzzer/Buzzer.h HAL/buzzer/BuzzerCfg.h
LED = HAL/led/Led.h HAL/led/Led.c
PUSHBUTTON = HAL/push_button/PushButton.c HAL/push_button/PushButton.h HAL/push_button/PushButtonCfg.h
LCD = HAL/lcd/Lcd.c HAL/lcd/Lcd.h HAL/lcd/LcdCfg.h
SSD = HAL/SSD/SSD.h HAL/SSD/SSDCfg.h HAL/SSD/SSD.c
INT = MCAL/Interrupt/ExtInt.c MCAL/Interrupt/ExtInt.h MCAL/Interrupt/ExtIntCfg.h MCAL/Interrupt/ExtIntREG.h
ADC = MCAL/ADC/ADC_CONFIG.h MCAL/ADC/ADC_INTERFACE.h MCAL/ADC/ADC_REG.h MCAL/ADC/ADC.c
defualt: compile upload
compile:
$(COMPILE) $(FILENAME).c $(ADDITIONAL) $(INT) $(HELPERS) $(BUZZER) $(ADC) $(LED) $(SSD) $(PUSHBUTTON) $(LCD) -o $(FILENAME).o
$(COMPILE) -o $(FILENAME).elf $(FILENAME).o -nostartfiles
avr-objcopy -j .text -j .data -O ihex $(FILENAME).elf $(FILENAME).hex
avr-size --format=avr --mcu=$(DEVICE) $(FILENAME).elf
upload:
sudo avrdude -p m32 -c usbasp -e -U flash:w:$(FILENAME).hex -F -P usb
clean:
rm $(FILENAME).o
rm $(FILENAME).elf
rm $(FILENAME).hex当我不使用-nostartfiles时,这个错误就会出现
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega32.o:(.text+0x0):-gcc -Wall -Os -mmcu=atmega32 -o APP/main.亲自应用/main.o APP/main.o:在函数__vector_1': (.text+0x78): multiple definition of __bad_interrupt‘Main.o中,APP/main.o:在函数__vectors': (.text+0x0): multiple definition of __vectors’/usr/lib/gcc/avr/5.4.0/./../avr/lib/avr5/crtatmega32.o:(.vectors+0x0):首先在这里定义collect2: ld返回一个退出状态:* makefile:19:编译错误1
发布于 2022-10-24 13:59:54
你正在做的事:
在第一个$(COMPILE)命令中,您将向编译器抛出一堆.c和.h文件:
$(COMPILE) <bunch-of-c-and-h-files> -o $(FILENAME).oavr所做的是构建一个可执行的静态链接的ELF,名为APP/main.o.忽略它的名称,这不是通常所指的“对象文件”。
在第二个命令中,您接受名为APP/main.o的完全链接的ELF文件,并(尝试)再次链接它()
$(COMPILE) -o $(FILENAME).elf $(FILENAME).o -nostartfiles这意味着您再次喜欢所有库和启动代码。因为您已经启动了代码(以及向量表等)从第一个完整的链接开始,您就不能再次链接它们,因此会出现错误,这是正确的。
Makefile的通常布局是这样的
.elf是通过将所有对象文件(和库)链接在一起生成的。.o都是从一个源文件aka编译和组装的。编译单元.c、.cpp或.S并使用gcc -c模c -o模o
module.o一般依赖于一堆头文件,但是不想编译头文件,只需要预编译的头文件.。
GCC的功能是自动生成依赖关系,并将其包含在Makefiles中,但这超出了这个答案的范围。目前,您正在像shell脚本一样错误地使用Makefile,这可能更容易掌握make的worflow和语法。
顺便说一下,avrdude理解ELF,所以不需要构建Intex十六进制文件。
https://stackoverflow.com/questions/73452220
复制相似问题