Forum: Mikrocontroller und Digitale Elektronik startup stm32f __use_two_region_memory


von Sina A. (sinapse)


Lesenswert?

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

von Sina A. (sinapse)


Lesenswert?

help?

von Arne Maximilian R. (arnemaximilian_r)


Lesenswert?

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

von Sina A. (sinapse)


Lesenswert?

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ß?

von Bernardo F. (bernardo)


Lesenswert?

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

von Sina A. (sinapse)


Lesenswert?

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

von Arne Maximilian R. (arnemaximilian_r)


Lesenswert?

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).

von Bernardo F. (bernardo)


Lesenswert?

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

von Sina A. (sinapse)


Lesenswert?

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
Noch kein Account? Hier anmelden.