几个月前,如果我定义了ISR,我用C语言编写的闪烁程序在Arduino R3 Uno上闪存到ATmega328p上,为什么总是失败.我最终将问题缩小到Makefile的编写方式(我在avr-gcc
和avrdude
中使用它),并通过将代码复制粘贴到Arduino IDE中并使用内置工具上载来绕过它.
现在,我想回到过go ,确切地了解Makefile失败的原因.我已经浏览了avr-gcc
和avrdude
的文档,我相信我已经将问题缩小到我正在写入的内存区域.我正在使用的示例C项目如下:
int main(void)
{
// set the data direction for the pin connected to
// onboard LED
DDRB |= _BV(DDB5);
PORTB |= _BV(PORTB5);
// no-op loop
while (1) ;;
// keep compiler happy
return 0;
}
该程序故意很简单;它只需打开板载LED并保持亮起.此时,使用下面的make文件可以很好地工作:
AVRFLAGS = -F -v -p m328p -c arduino -P /dev/ttyACM0 -U flash:w:blink.hex
default: blink.elf
avr-objcopy -O ihex blink.elf blink.hex
blink.o:
avr-gcc -g -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o blink.o blink.c
blink.elf: blink.o
avr-gcc -o blink.elf blink.o
flash:
sudo avrdude ${AVRFLAGS} blink.hex
clean:
rm -rf *.o *.hex *.elf
HOWEVER,当我将ISR添加到文件顶部时:
ISR (TIMER1_COMPA_vect)
{
PORTB ^= _BV(PORTB5);
}
并试图闪光,一切都崩溃了.我已经try 过使用和不使用定时器/计数器1设置代码(出于演示目的而在此处编辑),我不认为它会影响闪存的成功.我已经使用了这个完全相同的ISR--和计时器/计数器1完全相同的设置代码--在其他运行良好的程序中,provided I flash them using the Arduino IDE built-in tool;否则,Arduino Uno闪烁它正在接收数据,然后板载LED开始闪烁并保持闪烁.每当任何程序的闪存不佳时,都会出现完全相同的闪存模式.我收集了-j .text -j .data
、.eeprom
和其他选项,但都无济于事.
我只想知道为什么这失败了.