Forum: Compiler & IDEs _mainCRTStartup nicht tumb


von Torsten (Gast)


Lesenswert?

Hallo,
ich versuche hier gerade den build für ein Projekt mit ARM cortex m0 
µControllern aufzusetzen. Ich habe die newlib mit
1
configure --target=$target --prefix=$prefix --enable-interwork --enable-multilib --disable-nls

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
  add  sl, sl, #256
3
#endif
4
#else
5
#ifdef ARM_RDI_MONITOR
6
  /*  Issue Angel SWI to read stack info.  */
7
  movs  r0, #AngelSWI_Reason_HeapInfo
8
     194:  e3b00016   movs  r0, #22
9
  adr  r1, .LC0  /*  Point at ptr to 4 words to receive data.  */
10
     198:  e28f10e8   add  r1, pc, #232  ; 0xe8
11
#elif defined(__thumb2__)
12
  /*  We are in thumb mode for startup on armv7 architectures.  */
13
  AngelSWIAsm  AngelSWI
14
#else
15
  /*  We are always in ARM mode for startup on pre armv7 archs.  */
16
  AngelSWIAsm  AngelSWI_ARM
17
     19c:  ef123456   svc  0x00123456
18
#endif
19
  ldr  r0, .LC0  /*  Point at values read.  */
20
     1a0:  e59f00e0   ldr  r0, [pc, #224]  ; 288 <change_back+0x4>
21
22
  ldr     r1, [r0, #0]
23
     1a4:  e5901000   ldr  r1, [r0]
24
  cmp     r1, #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

von Jim M. (turboj)


Lesenswert?

Vielleich fehlt dem Assembler das -mcpu=cortex-m0 flag?

von Torsten (Gast)


Lesenswert?

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

von Torsten (Gast)


Lesenswert?

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!

von thumb2 (Gast)


Lesenswert?


von thumb2 (Gast)


Lesenswert?

Thumb sind 16bit Befehlscodes.

von Torsten (Gast)


Lesenswert?

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:
1
arm-none-eabi/thumb/newlib/crt0.o:     file format elf32-littlearm
2
3
4
Disassembly of section .text:
5
6
00000000 <_mainCRTStartup>:
7
  add  sl, sl, #256
8
#endif
9
#else
10
#ifdef ARM_RDI_MONITOR
11
  /*  Issue Angel SWI to read stack info.  */
12
  movs  r0, #AngelSWI_Reason_HeapInfo
13
   0:  e3b00016   movs  r0, #22
14
  adr  r1, .LC0  /*  Point at ptr to 4 words to receive data.  */
15
   4:  e28f10e8   add  r1, pc, #232  ; 0xe8
16
#elif defined(__thumb2__)
17
  /*  We are in thumb mode for startup on armv7 architectures.  */
18
  AngelSWIAsm  AngelSWI
19
#else
20
  /*  We are always in ARM mode for startup on pre armv7 archs.  */
21
  AngelSWIAsm  AngelSWI_ARM
22
   8:  ef123456   svc  0x00123456
23
#endif
24
  ldr  r0, .LC0  /*  Point at values read.  */
25
   c:  e59f00e0   ldr  r0, [pc, #224]  ; f4 <change_back+0x4>
26
27
  ldr     r1, [r0, #0]
28
  10:  e5901000   ldr  r1, [r0]
29
  cmp     r1, #0
30
  14:  e3510000   cmp  r1, #0
31
  bne     .LC32
32
  18:  1a000001   bne  24 <_mainCRTStartup+0x24>
33
...

das sieht nicht wirklich nach thumb aus oder?

mfg Torsten

von thumb2 (Gast)


Lesenswert?

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.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

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

von Torsten (Gast)


Lesenswert?

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

von Torsten (Gast)


Lesenswert?

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

von thumb2 (Gast)


Lesenswert?

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!!!!!

von Torsten (Gast)


Lesenswert?

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

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.