Skocz do zawartości

WinAVR problemy z kompilacją


PiotrekR

Pomocna odpowiedź

Cześć!

Ostatnio chciałem sięgnąć po jakiś uC. Sięgnąłem bo forbotowy kurs C, a właściwie po to, aby zobaczyć w jaki sposób programuje się kontrolery ( ze zwykłym programowaniem już do czynienia miałem) i niestety WinAVR nie chce współpracować.

Podczas próby kompilowania banalnego programu, wyskakują błędy. Czy ktoś może zna ich przyczynę?

Program:

/* "led.c" - programik do testowania środowiska WinAVR */
/* układ ATmega 1MHz */
/* PB0,PB1 - diody LED; PD0 - przycisk */

#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>                

int main(void)
{
   DDRB  |= _BV(0)|_BV(1);
   PORTB |= _BV(0);
   PORTB &= ~_BV(1);
   DDRD  &= ~_BV(0);
   PORTD |=  _BV(0);

   while (1) 
   {
       PORTB ^=_BV(0);
       PORTB ^=_BV(1);

       _delay_ms((PIND & _BV(0))? 1000: 200);
   }
}

Oraz to co wytyka środowisko:

> "make.exe" all
     0 [main] sh 9288 sync_with_child: child 10904(0x1A0) died before initialization with status code 0xC0000142
 52997 [main] sh 9288 sync_with_child: *** child state waiting for longjmp
/usr/bin/sh: fork: Resource temporarily unavailable
     0 [main] sh 8968 sync_with_child: child 10828(0x1A0) died before initialization with status code 0xC0000142
 16729 [main] sh 8968 sync_with_child: *** child state waiting for longjmp
/usr/bin/sh: fork: Resource temporarily unavailable

-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling C: led.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./led.lst  -std=gnu99 -MMD -MP -MF .dep/led.o.d led.c -o led.o 
led.c:5:1: warning: "F_CPU" redefined
<command-line>: warning: this is the location of the previous definition
led.c:24: fatal error: opening dependency file .dep/led.o.d: No such file or directory
compilation terminated.
make.exe: *** [led.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:02
Link do komentarza
Share on other sites

WinAVR to nierozwijany od 5 lat zabytek. Pobierz sobie Atmel Studio 7

_delay_ms w nowszej wersji może przyjmować tylko parametry w postaci cyfr czyli

np. _delay_ms(1000); nie można tam wrzucać _delay_ms(my_variable);

Jak chcesz to ominąć to wystarczy napisać taką funkcję:

void wait_ms(uint16_t time) {
for(uint16_t i = 0; i <= time; i++) {
	_delay_ms(1);
}
}

i używać jej zamiast _delay_ms();

lub napisać to tak:

if(PIND & _BV(0))
{
_delay_ms(1000);
}
else
{
_delay_ms(200);
}

Tej formuły

#define F_CPU 1000000L

już też się nie używa, zamiast tego robi się to w ustawieniach projektu;

http://mikrokontrolery.blogspot.com/2011/04/atmel-studio-spis-tresci.html

http://mikrokontrolery.blogspot.com/p/spis-tresci.html

http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html - czytaj do końca !

http://mikrokontrolery.blogspot.com/2011/04/gcc-avr-funkcje-opoznienia-delay.html

To nie błąd w programie, ale błąd kompilatora/linkera do delay_ms musi być włączony optymalizacja chyba maksymalna (nie pamiętam dokładnie).

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.