Hallo,
ich baue in einem Projekt eine CMSIS Library.
Jetzt habe ich unterschiedlich schnelle Speicherbereiche.
Startup -> soll in den langsamen Teil
Alles andere -> passt dann gerade noch so in den schnellen Teil:
1
SECTIONS
2
{
3
.text_DDR_startup : /*ONLY_IF_RO /* see initial ATTENTION! */
4
{
5
KEEP(*(.vectors))
6
*libCMSIS.a:*startup_ARM_CM3.S.obj(.text)
7
/**libCMSIS.a:(.text)*/
8
} > SLOW_MEM
9
10
...
11
}
Das wäre jetzt das korrekte Handling nach meinem Verständnis gewesen.
Er zieht aber nicht die Section raus.
Mit auskommentieren vom *libCMSIS.a:(.text*) funktioniert es, aber dann
liegt mehr in dem langsamen Bereich als soll.
Wer kann mich schnell bezüglich meines Syntax Fehlers/Verständins
Problems aufklären?
Wenn ich mir das *.a File genauer mit objdump und readelf anschaue,
scheint eine Zuteilung aufgrund des ürspringlichen *.obj-Files ja noch
möglich zu sein!?
Vermutlich hast du irgendwo ein *(.text) für den schnellen Speicher?
Dies hat dann wahrscheinlich Priorität. Verschiebe die Section für den
schnellen Speicher mal hinter den für den langsamen...
Niklas G. schrieb:> Versuch mal "libCMSIS.a(.text)" und "libCMSIS.a(.text*)", ohne führendes> Sternchen.
?
"*libCMSIS.a:(.text)" funktioniert ja für die ganze Lib.
Nur da sind halt auch Sachen drin, die zur Laufzeit in relevantem Maße
aufgerufen werden und dann auch im langsamen Speicher liegen.
...
Ich kann natürlich umbauen, dass keine Lib gebaut wird. Aber eigentlich
sollte das hier doch ganz einfach funktionieren. Kann doch nicht sein
grr.
Aber schon mal danke fürs draufschauen!
TuNichtGut schrieb:> "*libCMSIS.a:(.text)" funktioniert ja für die ganze Lib.> Nur da sind halt auch Sachen drin, die zur Laufzeit in relevantem Maße> aufgerufen werden und dann auch im langsamen Speicher liegen.
Und wo/wie wählst du die kritischen Sachen aus, die im schnellen
Speicher landen sollen? Das müsste dann vor diesem "Catch-All" stehen.
Oder willst du die gesamte CMSIS im schnellen Speicher haben?
... ist ja eigentlich egal ob ich mir zuerst den kleinen langsamen Teil
rauspicke, oder den schnellen Teil. Solange ich zu doof für die
scheinbar richtige Syntax bin :(.
Aktuell passt alles gerade so rein, wenn ich nur die paar Bytes Startup
rausschmeiße ;).
Alles danach funktioniert Problemlos, da ich dann für .text nur noch ein
1
.text :
2
{
3
__data2_start__ = .;
4
*(.text*)
5
*(.rodata*)
6
7
KEEP(*(.eh_frame*))
8
__data2_end__ = .;
9
} > FAST_MEM AT SLOW_MEM
mache. Davor ist noch der ganze C++ kram mit den Konstruktor/Destruktor,
Stackunwinding und so Kram der nicht verwendet wird. Basiert auf einem
ARM Beispiel, hier wird nur C verwendet.
TuNichtGut schrieb:> ... ist ja eigentlich egal ob ich mir zuerst den kleinen langsamen Teil> rauspicke, oder den schnellen Teil
Ja, aber mit "libCMSIS.a:(.text)" pickst du nicht den langsamen Teil
raus, sondern nimmst alles in den langsamen Speicher. Wenn du danach
versuchst etwas schnelles heraus zu picken, klappt das nicht (wird
ignoriert).
TuNichtGut schrieb:> Solange ich zu doof für die> scheinbar richtige Syntax bin :(.
Ich glaube nicht dass die Syntax der Fehler ist. Die Anweisungen müssen
in der richtigen Reihenfolge kommen.
TuNichtGut schrieb:> Ich kann natürlich umbauen, dass keine Lib gebaut wird.
Das ändert auch nichts. Auch hier ist die Reihenfolge wichtig.
Woher soll der Linker wissen was schnell ist und in den schnellen
Speicher soll?
Niklas G. schrieb:> TuNichtGut schrieb:>> ... ist ja eigentlich egal ob ich mir zuerst den kleinen langsamen Teil>> rauspicke, oder den schnellen Teil>> Ja, aber mit "libCMSIS.a:(.text)" pickst du nicht den langsamen Teil> raus, sondern nimmst alles in den langsamen Speicher. Wenn du danach> versuchst etwas schnelles heraus zu picken, klappt das nicht (wird> ignoriert).>> Woher soll der Linker wissen was schnell ist und in den schnellen> Speicher soll?
Aber ja "nur" von der gebauten CMSIS Lib.
War auch nur der Test, ob ich da was komplett verkehrt mache.
Deswegen will ich ja eigentlich über den spezifischeren Pfad:
1
"./libCMSIS.a:startup_ARM_CM3.S.obj"(.text)
gehen.
Allerdings klappt das ja nicht. Dabei verstehe ich die Doku so, ...
och miste!
1
ld Doku: "For instance, you cannot extract a from an archive by using "archive:file" in an INPUT command."
Ach, jetzt verstehe ich es erst. Nur "startup_ARM_CM3.S.obj" aus der
CMSIS soll in den langsamen, der ganze Rest in den schnellen Speicher?
TuNichtGut schrieb:> ld Doku: "For instance, you cannot extract a from an archive by using> "archive:file" in an INPUT command."
Das ist dann doof. Du kannst mit ".section" den Startup-Code in eine
spezielle Section packen, und die dann mit *(.StartupCode) o.ä. in den
langsamen Speicher übernehmen.
Niklas G. schrieb:> Ach, jetzt verstehe ich es erst. Nur "startup_ARM_CM3.S.obj" aus> der> CMSIS soll in den langsamen, der ganze Rest in den schnellen Speicher?>> TuNichtGut schrieb:>> ld Doku: "For instance, you cannot extract a from an archive by using>> "archive:file" in an INPUT command.">> Das ist dann doof. Du kannst mit ".section" den Startup-Code in eine> spezielle Section packen, und die dann mit *(.StartupCode) o.ä. in den> langsamen Speicher übernehmen.
Genau!
So werd ich es wohl machen (müssen). Oder halt das ganze vorab nicht
zusammenpacken. Aber das ist nicht mein Bereich ;), da mische ich mich
jetzt nicht mehr ein.
Aber noch Danke!