首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带atmega32问题的avr中断库

带atmega32问题的avr中断库
EN

Stack Overflow用户
提问于 2022-08-23 00:30:42
回答 1查看 105关注 0票数 0

当我使用以下代码时,我对atmega32有一个问题:

代码语言:javascript
复制
#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仍然不能工作。

这是我的制作文件:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2022-10-24 13:59:54

你正在做的事:

在第一个$(COMPILE)命令中,您将向编译器抛出一堆.c.h文件:

代码语言:javascript
复制
$(COMPILE) <bunch-of-c-and-h-files> -o $(FILENAME).o

avr所做的是构建一个可执行的静态链接的ELF,名为APP/main.o.忽略它的名称,这不是通常所指的“对象文件”。

在第二个命令中,您接受名为APP/main.o的完全链接的ELF文件,并(尝试)再次链接它()

代码语言:javascript
复制
$(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十六进制文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73452220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档