簡體   English   中英

在 AVR 閃爍程序中聲明函數使其發生故障

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM