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
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.
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
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
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.