gebaut. Ein kleines Textprogramm läuft im Debugger (JlinkPro) an, aber
verzeigt ab _mainCRTStartup auf den Hard Fault Handler. Soweit ich das
erkennen kann, liegt das daran, dass _mainCRTStartup nicht in den thumb
mircocode übersetzt wird (Auszug):
1
00000194<_mainCRTStartup>:
2
addsl,sl,#256
3
#endif
4
#else
5
#ifdef ARM_RDI_MONITOR
6
/* Issue Angel SWI to read stack info. */
7
movsr0,#AngelSWI_Reason_HeapInfo
8
194:e3b00016movsr0,#22
9
adrr1,.LC0/* Point at ptr to 4 words to receive data. */
10
198:e28f10e8addr1,pc,#232;0xe8
11
#elif defined(__thumb2__)
12
/* We are in thumb mode for startup on armv7 architectures. */
13
AngelSWIAsmAngelSWI
14
#else
15
/* We are always in ARM mode for startup on pre armv7 archs. */
16
AngelSWIAsmAngelSWI_ARM
17
19c:ef123456svc0x00123456
18
#endif
19
ldrr0,.LC0/* Point at values read. */
20
1a0:e59f00e0ldrr0,[pc,#224];288<change_back+0x4>
21
22
ldrr1,[r0,#0]
23
1a4:e5901000ldrr1,[r0]
24
cmpr1,#0
25
...
Komischerweise finde ich _mainCRTStartup nicht im map-file. Die original
Sourcen finde ich aber in newlib. Alle anderen Funktionen (eigene,
sowohl aus der newlib) sind nach thumb übersetzt worden. Kann sich einer
von euch daraus einen Reim machen?
Mit freundlichen Grüßen und Dank im Voraus,
Torsten
Hallo Jim,
ich habe das ganze build directory von newlib nach "mcpu" durchsucht und
nix gefunden. Würde der Assembler den den Code in Thumb Op-Code
übersetzen, wenn das flag gesetzt ist? Vielleicht habe ich aber auch
noch nicht den Unterschied zwischen thumb und arm32 verstanden.
Danke für Deine Hilfe!
mfg Torsten
Ah, ich habe mich gerade mal durch den Wikipedia Artikel gelesen, dem
nach ist thumb ein etwas anders kodierter subset des arm32 Befehlssatz.
Dann werde ich mal in dieser Richtung weiter forschen!
Ich habe jetzt noch mal im build directory von newlib geguckt, und dort
ein arm-none-eabi/thumb/newlib/crt0.o gefunden. Wenn mir das mit objdump
-S angucke, bekomme ich:
Wie kommt in ein Disassemly bedingte Compilierung?
Das ist doch wohl eher der Quellcode. Und wie schön zu erkennen, wird
zwischen thumb2 für Cortex und Arm32 unterschieden.
Der Compiler oder Assembler muss also mit dem richtigen Zielbefehlssatz
angestoßen werden. Fürs Target ist irgendwo Cortex oder thumb2
anzugeben.
Die mit der newlib gelieferten startup-codes sind nicht unbedingt erste
Wahl für "kleine" Controller. Gibt es einen Grund dafür, nicht die vom
Hersteller gelieferten Startup-Codes zu nutzen? Diese liegen meist den
CMSIS-Packeten auch für GCC bei, dort in Verzeichnissen für IDEs, die
GCC im Hintergrund nutzen (Attolic u.a.).
Hallo Thomas,
Martin Thomas schrieb:> Gibt es einen Grund dafür, nicht die vom> Hersteller gelieferten Startup-Codes zu nutzen?
im SDK von Nordic (Zielhardware ist ein nRF51422) habe ich startup files
gefunden, die Verwende ich auch. Dieses ruft dann auch _mainCRTStartup()
(bzw. _start) auf. Ich hätte aber gerne auch eine C runtime, die muss ja
auch initialisiert werden und main() aufrufen. Vielleicht bin ich aber
auch auf dem Holzweg.
mfg Torsten
Hallo thumb2,
thumb2 schrieb:> Wie kommt in ein Disassemly bedingte Compilierung?
das ist ein elf binary mit debug-Informationen.
> Das ist doch wohl eher der Quellcode. Und wie schön zu erkennen, wird> zwischen thumb2 für Cortex und Arm32 unterschieden.
Dies ist der übersetzte Output des C Preprozessors. Im original
Quellcode, sieht man z.B. dass sich das #elif defined(_thumb2_) nicht
auf #ifdef ARM_RDI_MONITOR, sondern auf ein #ifdef THUMB_V7M_V6M
bezieht. _thumb2_ war also offensichtlich beim Übersetzen definiert.
> Der Compiler oder Assembler muss also mit dem richtigen Zielbefehlssatz> angestoßen werden. Fürs Target ist irgendwo Cortex oder thumb2> anzugeben.
Ich würde davon ausgehen, dass die newlib mit --enable-multilib mehrere
Version der Library baut und ich beim Linken später gegen die "richtige"
linke. Laut map-file linkt er
/usr/local/arm-none-eabi/lib/gcc/arm-none-eabi/4.9.0/../../../../arm-non
e-eabi/lib/thumb/crt0.o. Dem Namen nach, scheint das die "richtige" zu
sein. Disassembliere ich das Object-File, sehe ich aber genau den
opcode, der nicht funktioniert.
mfg Torsten
Wenn du genau hinsiehst, erkennt du, dass _thumb2_ nicht definiert
war. Vor der Zeile in dem Block steht keine Nummer!!! Du hast also nicht
für thumb und nicht für Cortex über setzt!!!
Compiliere ohne Debugsymbole und schau dir den Teil dann noch einmal an.
Es ist sooooooooo easy!!!!!
thumb2 schrieb:> Wenn du genau hinsiehst, erkennt du, dass thumb2 nicht definiert> war.
stimmt, ergibt so auch mehr Sinn.
> Vor der Zeile in dem Block steht keine Nummer!!! Du hast also nicht> für thumb und nicht für Cortex über setzt!!!
Es ist nicht mein Code, mit dem ich ein Problem habe, es ist die newlib.
Der opcode der newlib scheint durchgängig thumb code zu enthalten, mit
einer Ausnahme: crt0.o und dort auch nur die Funktion
_mainCRTStartup/_start.
mfg Torsten