avr-gcc bootloader section

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ń

Reply to
jelen
Loading thread data ...

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.

Reply to
Zbych

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

Reply to
jelen

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.