[英]declaring function in AVR blinking program makes it malfunction
我有這個閃爍的 LED 程序(它每秒閃爍 L LED)
#include <avr/io.h>
#include <util/delay.h>
#define DELAY 1000
int main (void) {
DDRB |= _BV(DDB5);
while(1) {
PORTB |= _BV(PORTB5);
_delay_ms(DELAY);
PORTB &= ~_BV(PORTB5);
_delay_ms(DELAY);
}
return 0;
}
這工作正常但是當我添加如下功能時 L LED 不閃爍我打算這樣做。 即使我從主函數中刪除了所有代碼,它仍然以相同的方式閃爍。
#include <avr/io.h>
#include <util/delay.h>
#define DELAY 1000
int main (void) {
DDRB |= _BV(DDB5);
while(1) {
PORTB |= _BV(PORTB5);
_delay_ms(DELAY);
PORTB &= ~_BV(PORTB5);
_delay_ms(DELAY);
}
return 0;
}
int test(){
return 0;
}
我使用 avrdude 來刷新程序。 處理器是atmega328p。 這是我使用的 Makefile
defualt:
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o led.o speaker.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
rm led.bin
rm led.o
rm led.hex
我嘗試刪除參數、更改返回類型、添加原型函數,但沒有一個有效。
如果將代碼粘貼到主函數下方,則必須定義一個原型,例如:
#define F_CPU 16000000UL
#define DELAY 1000
#include <avr/io.h>
#include <util/delay.h>
void blink(volatile unsigned char *port, unsigned char pin);
int main (void)
{
DDRB |= _BV(DDB5);
while(1) {
blink(&PORTB, PINB5);
}
return 0;
}
void blink(volatile unsigned char *port, unsigned char pin)
{
*port |= _BV(pin);
_delay_ms(DELAY);
*port &= ~(_BV(pin));
_delay_ms(DELAY);
}
所以編譯器知道函數頭,然后進行鏈接。
需要
volatile
因為直接在 RAM 中訪問PORT
參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.