avr-gcc bootloader section
Masz problem? Zapytaj na forum elektroda.pl
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ń
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.
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