init0 bis init5 section für arm7 realisieren, datenproblem

Gast #2248981
Lesenswert?

Hallo,

ich möchte mir für meinen ARM7 (ADUC70xx) init0 .. init5 sections 
anlegen die im bootvorgang automatisch hintereinander durchlaufen werden 
und in die man startroutinen legen kann (ohne pro- und epilog. der gcc 
unterstützt das als attribute). soetwas gibt es z.b. beim avr-gcc.

wenn ich jetzt code in eine section lege und da z.b. auf einen speicher 
zugreife:

.section .init0,"x"
.code 32

_init0:
         ldr    r0, =__MMR_OFFSET
....

(__MMR_OFFSET ist preprocessed und ist 0xffff0000)

dann findet man nachher im listing ganz am schluss vom codefragment der 
in die section init0 geht:

800cc:  3afffffc   bcc  800c4 <zero>
         bl     main
   800d0:  eb00004f   bl  80214 <main>
   800d4:  ffff0000   undefined instruction 0xffff0000

d.h. hinter dem branch main (das ist am ende der init0 section) werden 
daten für das codestück aus der init0 section abgelegt (hier 
0xffff0000). stört mich insoweit als wenn da nicht ein bl stehen würde 
und ich gleich init1 ausführen wollte dass dann alles abstürtzt.

Meine Frage:

Wie haben die AVR leute das gelöst?
Bzw. wie bekomme ich die daten da weg?

Viele Grüße
Persönliche Seite #2249021
Lesenswert?

Da steht aber nun mal ein bl main :-) das wohl aud einer init9-Section 
stammt?

Bei AVR gibt's dieses Problem nicht, weil dort keine Constant-Pools 
verwendet werden.

Wenn di in asm programmierst, musst du dich selber um Anlegen/Platzieren 
von Constant-Pools kümmern, und wenn du in C programmierst, sollte gcc 
das richten.

Durch deine Frage wird auch nicht klar, was in C und was in Assembler 
geschrieben wird. Schreib einfach ein stückchen in C und schau wie gcc 
das umsetzt.
Gast #2249118
Lesenswert?

Hallo Johann,

den prozessor setze ich selber quasi "blank" auf. das bl steht am ende 
einer target initialisierungsroutine in assembler die ich derzeit nach 
.init0 werfe (siehe posting oben). inhalt: stackpointer setzen, bss 
nullen und data kopieren etc. am schluss branch nach void main(void). 
den branch werde ich in eigenverantwortung in die init9 werfen und 
hinter init1 mittels C beiliebigen initialisierungscode einfügen - nach 
dem prinzip:

 _attribute_ ((naked))
 _attribute_ ((section(".init1")));
void test(void)
{
}

Soweit zumindest die Wunschliste.

Was mir weiterhilft ist schon mal der hinweis mit dem literal pool.
evt. ein tipp auf ein gutes howto (oder wonach ich suchen muss) wie ich 
die platzierung vom literal pool in assembler und in C steuern kann?

Viele Grüße
Persönliche Seite #2249140
Lesenswert?

Im Assembler bist du delbst zuständig den Pool anzulegen und zu 
verwalten.

Anstatt einer init-Section geht vielleicht auch ein Constructor 
via __attribute__((constructor))?

Eigentlich kümmert sich der Compiler um .bss und .data, braucht man 
nicht von Hand machen.

Mit ARM bzw arm-gcc kenne ich mich nicht aus, also Suchmachine bemühen 
oder nachfragen nach Anmeldung bei gcc-help@gcc.gnu.org, siehe 
http://gcc.gnu.org/ml

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren