hallo,
im startup code für meinen stm32f4 lautet es:
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
__use_two_region_memory wird gar nicht verwendet... wozu wird es
importiert? was tut das?
so wie ich das beobachtet habe wird einfach bei BX in die main()
gesprungen. weshalb werden vor dem sprung die Heap/Stack Adressen in den
Registern R0-R3 abgelegt?
danke schonmal fuers lesen
lg
So, wie ich es verstehe wird das Import dafuer verwendet, um ein Symbol fuer die spaeteren Prozesse zu erzeugen. Die Register R0-R3 werden soweit ich das beurteilen kann als Rueckgabeparameter verwendet, damit der aufrufende Code die Parameter bekommt und damit weiter arbeiten kann. Ein paar Infos gibt es hier: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0179b/CHDEGGBA.html
Vielen Dank für die Antwort. Den Link kannt ich schon... wurde aber noch nicht wirklich schlau daraus. Irgendwie gibt das iNet nicht so viel her, was dieses thema angeht. hmmm... vielleicht findet sich ja noch jmd, der mehr weiß?
Hallo sina,
mit "IMPORT __use_two_region_memory" wird dem Linker mitgeteilt, dass
-im Vergleich zum Standard one-region model- zwei verschiedene
Speicherbereiche für Stack und Heap verwendet werden sollen.
Mit "__user_initial_stackheap" werden dann jeweils die Basisadressen und
Speichergrößen von Stack und Heap festgelegt.
Die Zuordnung zwischen Registern und Rückgabewerten ist dabei (siehe
Festlegungen in rt_misc.h):
struct __initial_stackheap {
unsigned heap_base; // r0: low-address end of initial heap
unsigned stack_base; // r1=sp: high-address end of initial stack
unsigned heap_limit; // r2: high-address end of initial heap
unsigned stack_limit; // r3=sl: low-address end of initial stack
};
extern __value_in_regs struct __initial_stackheap
__user_initial_stackheap(unsigned /*r0*/, unsigned /*sp*/,
unsigned /*r2*/, unsigned /*sl*/);
Mit der bx lr Anweisung wird nur ein indirekter Rücksprung zur der
Speicheradresse, die im Link Register liegt, ausgeführt; normalerweise
ist das die aufrufende Funktion, und zwar mit den modifizierten
Registerinhalten in r0-r3.
Vielleicht auch noch interessant: die Speicheradressen nehmen für den
Stack ab (full descending) und für den Heap zu (increasing address
order).
Viele Grüße
bernardo
wow das hat schonmal viel geholfen. falls du/jmd noch das folgende beantworten könntest. ------------------------ wenn ich mir die erklärung zu "IMPORT symbol" durchlese http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/Babcjehh.html "The symbol is treated as a program address." demnach müsste doch __use_two_region_memory einfach nur eine programmadresse sein... wie kann es dann plötzlich eine linkeroptionseinstellung sein? oder werden auch so linker/compiler einstellungen in assembler getätigt (ist IMPORT also äquivalent zu #pragma's sobald man spezielle symbolnamen verwendet)? ------------------------ bei rt_misc steht: * This can be defined to override the standard memory models' way * of determining where to put the initial stack and heap. wo ist der standard memory models way, der durch unser __initial_stackheap() überschrieben wird? wo wird eigentlich __initial_stackheap() aufgerufen? ------------------------ woher weißt du das alles? was muss ich lesen damit ich die ganzen hintergründe verstehe? ist das die standard lib? vielen dank
sina anargo schrieb: > wenn ich mir die erklärung zu "IMPORT symbol" durchlese > > http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/Babcjehh.html > > "The symbol is treated as a program address." > > demnach müsste doch __use_two_region_memory einfach nur eine > programmadresse sein... wie kann es dann plötzlich eine > linkeroptionseinstellung sein? oder werden auch so linker/compiler > einstellungen in assembler getätigt (ist IMPORT also äquivalent zu > #pragma's sobald man spezielle symbolnamen verwendet)? Das verstehst du leider etwas falsch. Das Import wirkt wir ein Define in C oder ein Define für den Compiler. Bei einem Define kann es sich um einen Zahlenwert (z.B. eine Adresse im Speicher) oder einfach nur um ein "Da: Ja/Nein" handeln. In diesem Fall geht es offensichtlich nur um ein "Der Wert ist da", welches vom Linker genutzt wird. sina anargo schrieb: > woher weißt du das alles? was muss ich lesen damit ich die ganzen > hintergründe verstehe? ist das die standard lib? Das ist das wesentliche Problem. Es handelt sich hierbei um eine Geschichte, die auf den C-Standards und auf dem ausgewählten Compiler basiert. Bei diesen Geschichten kann man sich leider nur unzählige Dokus und Datenblätter durchlesen. Richtige Bücher und Blogs gibt es kaum und wenn, dann sind sie kaum aktuell. Was du hier versuchst raus zu bekommen (was lobenswert ist!), dass sind leider Details, die zu wenige Leute interessieren und nur ein paar Leute wissen/anwenden (wenn überhaupt brauchst du pro Firma vielleicht eine Person, die das ganze einmal einrichtet).
Hallo sina, Arne hat vollkommen recht, blöd ist eben nur, wenn man einer dieser Exoten ist :-D... Die Startup-Prozedur wird standardmäßig von den C-Libraryfunktionen übernommen, also im Wesentlichen läuft das über die Aufrufkette Startup.s -> __main -> __rt_entry -> C main() /* Beginn des eigenen Benutzerprogramms */. Stack und Heap werden dabei in __rt_entry auf die Standardwerte eingestellt. __rt_entry ist keine vollwertige Funktion, da ja Stack und Heap noch nicht eingerichtet sind. Details zum Startup findet man in der Application Note AN241 - ARM Compiler C Library Startup and Initialization, siehe hier: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0241b/index.html Viele Grüße bernardo
danke... jetzt weiss ich zumindest, dass ich aufhoeren kann lange rumzugoogeln. dann mach ich mich mal auf in den application note wald... mal sehen wie lange ich lust dazu habe mfg
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.