avr-gcc bootloader section



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: jelen <jelo_at_nospam_wytnijto.sheep.one.pl>
Subject: avr-gcc bootloader section
Date: Mon, 06 Feb 2006 02:18:10 +0100


Witam,


void bootloader(void) _attribute_ ((section (".bootloader")));
void Delay_1ms(int Delay) _attribute_ ((section (".bootloader")));
void (...) _attribute_ ((section (".bootloader")));
(...)

CFLAGS = -Wall -Os -mmcu=$(MCU) -Wl,--section-start=.bootloader=0x1E00

Jak zrobić, żeby pod 0x1E00 kompilator wcisną void bootloader(void){}
bo on mi tam daje zupełnie co innego, czy może można jakoś zaznaczyć co
w sekcji jest "main"? ;)
...a do sekcji .text (0x000-0x1DFF) umie wciskać jakiś podprocedury z
libc... jakbym mógł komuś podesłać całość, bo sam dłubie już to N godzin
i chyba nie zdłubie... chodzi o to żeby całość bootloaderowa z
procedurami dookoła poszła na koniec kodu... i żeby to co ma być pod
0x1E00 było tam a nie gdzieś dalej. o.

Pozdrawiam,
jeleń



Poprzedni Następny
Wiadomość
Spis treści
From: Zbych <abuse_at_nospam_onet.pl>
Subject: Re: avr-gcc bootloader section
Date: Mon, 06 Feb 2006 23:03:48 +0100


jelen przemówił ludzkim głosem:

Jak zrobić, żeby pod 0x1E00 kompilator wcisną void bootloader(void){}
bo on mi tam daje zupełnie co innego, czy może można jakoś zaznaczyć co
w sekcji jest "main"? ;)

Zajrzyj tu:
http://groups.google.com/group/pl.misc.elektronika/browse_thread/thread/638204a833a124c8/4970d4718cda9ce7?lnk=st&q=zbych+gcc&rnum=13&hl=en#4970d4718cda9ce7
i tu
http://groups.google.com/group/pl.misc.elektronika/browse_frm/thread/24a6c87e3c581f4/9abc814c672d9f71?lnk=st&q=bootloader+section+group%3Apl.misc.elektronika&rnum=6#9abc814c672d9f71

Ogólnie mówiąc musisz umieścić sobie na początku bootsekcji procedurę,
która zainicjalizuje to co trzeba (zmienne w ramie, rejestr zerowy,
stos, czyli wszystko to co zazwyczaj robi crt) i z niej wykonać skok do
właściwej obsługi bootloadera.

Czyli definiujesz:

#define BootSection _attribute_ ((section(".bootloader")))
#define BootStart _attribute_ ((section(".qwerty"))) _attribute_
((naked))

a potem używasz tak:
> void bootloader(void) BootSection;
> void Delay_1ms(int Delay) BootSection;
> void (...) BootSection;
> (...)

Gdzieś w kodzie umieszczasz jeszcze funkcję która znajdzie się pod
adresem 0x1e00:

BootStart void Start(void){ asm("rjmp bootloader"); }

Ponieważ jest to jedyna procedura w sekcji qwerty to nie istnieje
ryzyko, że kompilator coś poprzestawia. Zwróć też uwagę na to, że
funkcja ta jest pozbawiona prologu i epilogu.

Na koniec musisz poinstruować linker co i gdzie ma umieścić:
-Wl,--section-start=.qwerty=0x001E00
-Wl,--section-start=.bootloader=0x001E02

Pamiętaj o tym, że przy tak uproszczonej konstrukcji nie będziesz miał
zainicjalizowanych żadnych zmiennych, stosu (!!), ani nawet wyzerowanego
rejestru r1 (gcc potrzebuje tego do prawidłowego działania). Wszystkie
te rzeczy powinieneś umieścić w funkcji Start i w zależności od jej
długości przesunąć początek sekcji bootloader.


Poprzedni Następny
Wiadomość
Spis treści
From: jelen <jelo_at_nospam_wytnijto.sheep.one.pl>
Subject: Re: avr-gcc bootloader section
Date: Tue, 07 Feb 2006 02:03:25 +0100


Zbych wrote:
Zajrzyj tu:
http://groups.google.com/group/pl.misc.elektronika/browse_thread/thread/638204a833a124c8/4970d4718cda9ce7?lnk=st&q=zbych+gcc&rnum=13&hl=en#4970d4718cda9ce7
i tu
http://groups.google.com/group/pl.misc.elektronika/browse_frm/thread/24a6c87e3c581f4/9abc814c672d9f71?lnk=st&q=bootloader+section+group%3Apl.misc.elektronika&rnum=6#9abc814c672d9f71
>(...)

OK. Dzieki wielkie! rano to przetestuje,
a moze w ogole lepiej zrobioć to w ASM, albo uzyc gotowca, ale od tego
ostatniego szczegolnie chce uciec... :)

PS. gotowca znalazlem, ale [z microsyl'a] jest pod jakis windziany
kompilator i niewiele z tego umiem wywnioskować,
i jeszcze jakies jedno znalazlem, ale tez nieprzejrzyste...
a reszta w ASM...


Pozdrawiam,
jelen