RTV forum PL | NewsGroups PL

Jak poprawnie umieścić funkcje bootloadera pod adresem 0x1E00 w avr-gcc?

avr-gcc bootloader section

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie umieścić funkcje bootloadera pod adresem 0x1E00 w avr-gcc?

jelen
Guest

Mon Feb 06, 2006 1:18 am   



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"? Wink
....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ń

Zbych
Guest

Mon Feb 06, 2006 10:03 pm   



jelen przemówił ludzkim głosem:

Quote:
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"? Wink

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:
Quote:
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.

jelen
Guest

Tue Feb 07, 2006 1:03 am   



Zbych wrote:
Quote:

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

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie umieścić funkcje bootloadera pod adresem 0x1E00 w avr-gcc?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map