我正在努力学习AVR C,并在摆弄atmega 328P微控制器.我正在使用Linux Mint上的avr-GCC工具链来编译我的代码并将其刷新到Arduino板上.
因此,我试图使用函数调用来闪烁两个LED灯.我做了两个功能--一个是LED闪烁,连接到我的Arduino板的第7针,另一个是LED闪烁,连接到Arduino板的第13针.
这些函数正在工作,但在我修改代码时,我注意到了一个奇怪的行为.在main()之外,这些函数是按照它们在中定义的顺序调用和执行的;而不是按照它们从int main()
内部调用的顺序.
这是我的代码
#include <avr/io.h>
#include <util/delay.h>
void blinkPin13() {
while(1) {
DDRB = DDRB | (1 << DDB5);
PORTB = PORTB | (1 << PORTB5);
_delay_ms(5000);
PORTB = PORTB & ~(1 << PORTB5);
_delay_ms(500);
}
}
void blinkPin7() {
while(1) {
DDRD = DDRD | (1 << DDD7);
PORTD = PORTD | (1 << PORTD7);
_delay_ms(1000);
PORTD = PORTD & ~(1 << PORTD7);
_delay_ms(500);
}
}
int main(void) {
blinkPin7();
blinkPin13();
return 0;
}
这是用于编译和刷新代码的Makefile
default:
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o led.o led.c
avr-gcc -o led.bin led.o
avr-objcopy -O ihex -R .eeprom led.bin led.hex
sudo avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex
因此,当我在我的Arduino板上闪烁上述代码时,连接到管脚13的LED闪烁,即使首先调用了函数blinkPin7()
.我注意到,函数的执行顺序始终对应于在main()外部定义函数的顺序,而不是从main()内部调用函数的顺序.
为甚麽会这样呢?