avr-gcc bootloader section

Feb 06, 2006 2 Replies

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ń



jelen przemówił ludzkim głosem:

Zajrzyj tu:

formatting link
tu
formatting link
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.

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required