gcc i alokacja funkcji w pamieci (__attribute__)

witam

zeby umiescic funckje pod danym adresem w pamieci robi sie cos takiego:

#define boot_loader __attribute__ ((section (".bootloader"))) void boot_loader(void) BOOTLOADER_SECTION;

ale.. jak umiescic wiecej fukcji w jednym obszarze pamieci? powiedzmy, moj bootloader sie sklada z wiekszej ilosci funkcji.

jak zrobilem cos takiego:

#define boot_loader __attribute__ ((section (".bootloader"))) void boot_loader(void) BOOTLOADER_SECTION; void Putc(char c) BOOTLOADER_SECTION;

to jedna funkcja nadpisuje druga.. najbardziej by mi odpowiadalo danie wszystkich funkcji z jednego pliku do danego obszaru pamieci (i dalaczenie go w #include)

mozna oczywiscie kazdej funkcji przypisac osobna sekcje i w linkerze umieszczac je w kolejnych obszarach pamieci bootloadera, ale moze jest jakis "ladniejszy" sposob? cos w stylu assemblerowego .org na czesc programu

pozdr, oscar

Reply to
Oskar W
Loading thread data ...

Oskar W przemówił ludzkim głosem:

Jeśli funkcje są przypisane do tej samej sekcji to są umieszczane jedna za drugą, ty nic nie musisz robić.

^^^^^^^^^^^^^

^^^^^^^^^^^^^^^^^

Ten kod jest trochę dziwny. Najpierw definiujesz stałą boot_loader a potem nazywasz tak samo funkcję ?

U mnie umieszczanie funkcji w sekcjach działa bez zarzutu. Kawałek kodu na atmega8:

#include <avr/io.h>

#define BootSection __attribute__ ((section(".aaa")))

BootSection void a(void){ PORTA=0xFF; }

BootSection void b(void){ PORTA=0; }

// Program główny int main(void) { a(); b(); while(1); }

Jako parametr linkowania dodałem -Wl,--section-start=.aaa=0x001E00 - czyli sekcja aaa, ma się zaczynać od bajtowego adresu 1e00.

Funkcje zostały ułożone jedna za drugą:

BootSection void a(void){ PORTA=0xFF; 1e00: 8f ef ldi r24, 0xFF ; 255 1e02: 8b bb out 0x1b, r24 ; 27 1e04: 08 95 ret }

BootSection void b(void){ PORTA=0; 1e06: 1b ba out 0x1b, r1 ; 27 1e08: 08 95 ret }

Reply to
Zbych

Zbych snipped-for-privacy@onet.pl napisał(a):

moj blad.. chcialem dac define'a z boot.h: #define BOOTLOADER_SECTION __attribute__ ((section (".bootloader")))

dobra.. sprawdzilem i faktycznie dziala.. jednak problem jest gdzie indziej.. da sie wymusic, zeby dana procedura znajdowala sie na poczatku sekcji?

ogolnie dostaje cos takiego:

bootloader:00000000 _delay bootloader:00000026 WriteSPI bootloader:0000002e ReadPageDflash bootloader:000000ee putc bootloader:000000fe boot_loader text:00000000 main

a potrzebuje, zeby boot_loader znajdowal sie na poczatku..

pozdr, oscar

Reply to
Oskar W

Oskar W przemówił ludzkim głosem:

[...]

Przychodzą mi dwa rozwiązania do głowy:

  1. umieszczenie tej funkcji jako pierwszej w pliku i sprawdzanie co jakiś czas czy linker nie zmienił kolejności :-)
  2. zdefiniowanie dwóch sekcji. Pierwszej na samym początku obszaru bootloadera, i drugiej zaraz za nią (dwa bajty odstępu powinny wystarczyć). W pierwszej sekcji powinnno się znaleźć jedynie wywołanie głównej funkcji bootloadera (skok).

#define BootSection __attribute__ ((section(".aaa"))) #define BootStart __attribute__ ((section(".bbb"))) __attribute__ ((naked))

BootSection void BootLoader(void){...}

BootStart void a(void){ asm("rjmp BootLoader"); }

Tylko trzeba przesunać trochę sekcje:

-Wl,--section-start=.bbb=0x001E00

-Wl,--section-start=.aaa=0x001E02

Reply to
Zbych

Zbych snipped-for-privacy@onet.pl napisał(a):

dokladnie: aaa=0x001E04 bo tam jest ret, ktory moze przypadkiem nadpisac czesc kodu..

Disassembly of section .bootloader:

0001e000 <boot_init>: 1e000: 20 c0 rjmp .+64 ; 0x1e042 1e002: 08 95 ret

probowalem juz tego, ale niestety nie dziala.. najlepsze jest to, ze jak zrobilem objdump -d to kod w assemblerze wyglada dobrze (przyklad powyzej)

coz, dzieki za odpowiedzi.. na razie zostane przy jednej procedurce, ktora na pewno chodzi.. na szczescie w at128 jest 4k bootloadera i sie zmieszcze :)

pozdr, oscar

Reply to
Oskar W

Oskar W przemówił ludzkim głosem:

^^^^^^^^^^^^^^^

Jak dodasz atrybut 'naked', to kompilator nie wstawi ret'a i będziesz dwa bajty do przodu :-).

ok. powodzenia :-)

Reply to
Zbych

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.