Forum: Compiler & IDEs init0 bis init5 section für arm7 realisieren, datenproblem


von armneuling (Gast)


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

von Johann L. (gjlayde) Benutzerseite


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.

von armneuling (Gast)


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

von Johann L. (gjlayde) Benutzerseite


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

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

In Assembler werden Literal Pools mit Hilfe von ".ltorg" (GCC) bzw. 
"LTORG" (ARM) händisch platziert. Ansonsten behalten sich Assembler bzw. 
Compiler vor, Literal Pools automatisch zwischen Codeblöcken einzufügen, 
was aber auch vom Linker bei der Adressberechnung korrekt gehandhabt 
wird (bzw. werden sollte).

von armneuling (Gast)


Lesenswert?

Hallo Andreas,

sieht soweit gut aus ;-)

       b _next_section
       .ltorg                   /* start a new literal pool */
_next_section:
       bl     main

ich dank euch & gruss

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.