Forum: Mikrocontroller und Digitale Elektronik ThreadX/Azure RTOS, Example baut nicht


von Thomas T. (runout)


Angehängte Dateien:

Lesenswert?

Hallo Gemeinde,

ich möchte ein Beispielprogramm für ThreadX kompilieren/Linken.
Target ist ein Cortex-M4. (gibts auch mit M0)
GCC/GDB = 12.3.1/13.2

Dieses RTOS liegt hier:
https://github.com/eclipse-threadx/threadx

unter: ports\cortex_m4\gnu\example_build\ ist ein Beispielprogramm
welches eine Selbstläufer sein sollte...

build_threadx.bat - läuft fehlerfrei

build_threadx_sample.bat - scheitert beim Linken (siehe Ausgabe)

Die ganzen "undefined reference" beziehen sich auf die Datei 
"cortexm4_crt0.S" und konkret auf den RAM. (/* Copy initialised sections 
into RAM if required. */
)

Im Linker-Skript (sample_threadx.ld) sind keine entsprechenden
Referenzen drin.

Frage:
Brauche ich überhaupt RAM an dieser Stelle?
Kann das raus?

Bin Einsteiger bei ThreadX/Azure RTOS.

Ausgabe: output_as.txt

Viele Grüße
runout

: Bearbeitet durch User
von J. S. (jojos)


Lesenswert?

und wenn man es mit Cmake baut? Die ganzen Projekte sind für Cmake 
ausgelegt wie es aussieht.

edit:
in dem commit für Version 6.1.12 wurde massiv geändert, seitdem gibt es 
die angemeckerten Symbole nicht mehr im Linkerfile. Das ist das Problem 
bei so Megarepos, das Testen kostet mehr als die Entwicklung wenn so 
viele Plattformen unterstützt werden. Vielleicht mal ein Issue 
aufmachen.

https://github.com/eclipse-threadx/threadx/commit/8c3c08f10826c4d5332a6d8e2fdf014b793a456a#diff-e40e468407adc3c2d2068b19f92afb2c40de1a2474da3d51fa6d5dd37956ed58

: Bearbeitet durch User
von Til S. (Firma: SEGGER) (til_s)


Lesenswert?

Thomas T. schrieb:
> Die ganzen "undefined reference" beziehen sich auf die Datei
> "cortexm4_crt0.S" und konkret auf den RAM. (/* Copy initialised sections
> into RAM if required. */
> )

Wahrscheinlich wird das der Startup Code sein, der u.a. als Teil der 
Segmentinitialisierung etwas ins RAM kopieren möchte. Hast du denn diese 
Datei und könntest sie mit ins Buildscript aufnehmen?

Alternativ (Achtung Werbung!): 
https://www.segger.com/downloads/embos/embOS_CortexM_EmbeddedStudio_Trial

von J. S. (jojos)


Lesenswert?

Also crt0.S und das Linkerfile passen nicht zusammen, für den CM3 
scheint es richtig angepasst worden zu sein.
Also einfach das dieses crt0.S benutzen:
https://github.com/eclipse-threadx/threadx/blob/master/ports/cortex_m3/gnu/example_build/cortexm3_crt0.S

von Thomas T. (runout)


Lesenswert?

Hallo,

danke für die Hinweise.
Wenn ich aus der "crt0.S" die Referenzen auskommentiere baut alles.

Werde alles mit Cmake aufsetzen, das konkrete Target
ist der Raspi PI Pico (Dual-M0).

Läuft im Moment nur mit einem Kern.

Angeblich unterstützt das OS mehrere Kerne (SMP).
siehe:
https://www.st.com/en/partner-products-and-services/azure-rtos-threadx.html

Ich bleibe erst mal bei ThreadX.
Das ist sicherheitsgerichtet und unterstützt SIL 4.
Ansonsten nutze ich HW aus dem Hause S***r natürlich gern (@ Til S.) :-)



Viele Grüße
runout

: Bearbeitet durch User
von J. S. (jojos)


Lesenswert?

Das dürfte nicht gut sein weil dann ja die Initialisierung der 
statischen Variablen und der C++ Konstruktoren fehlt.

von Thomas T. (runout)


Lesenswert?

Ja könnte sein.
der eigentliche Code (aus cortexm0_crt0.S) sieht so aus

/* Copy initialised sections into RAM if required. */
1
  ldr r0, =__data_load_start__
2
  ldr r1, =__data_start__
3
  ldr r2, =__data_end__
4
  bl crt0_memory_copy
5
  ldr r0, =__text_load_start__
6
  ldr r1, =__text_start__
7
  ldr r2, =__text_end__
8
  bl crt0_memory_copy
9
  ldr r0, =__fast_load_start__
10
  ldr r1, =__fast_start__
11
  ldr r2, =__fast_end__
12
  bl crt0_memory_copy
13
  ldr r0, =__ctors_load_start__
14
  ldr r1, =__ctors_start__
15
  ldr r2, =__ctors_end__
16
  bl crt0_memory_copy
17
  ldr r0, =__dtors_load_start__
18
  ldr r1, =__dtors_start__
19
  ldr r2, =__dtors_end__
20
  bl crt0_memory_copy
21
  ldr r0, =__rodata_load_start__
22
  ldr r1, =__rodata_start__
23
  ldr r2, =__rodata_end__
24
  bl crt0_memory_copy
beim STM32 (z.B STM43 F4, startup_stm32f429zitx.S) sieht das so aus:

/* Copy the data segment initializers from flash to SRAM */
1
  ldr r0, =_sdata
2
  ldr r1, =_edata
3
  ldr r2, =_sidata
4
  movs r3, #0
5
  b LoopCopyDataInit
6
7
CopyDataInit:
8
  ldr r4, [r2, r3]
9
  str r4, [r0, r3]
10
  adds r3, r3, #4
11
12
LoopCopyDataInit:
13
  adds r4, r0, r3
14
  cmp r4, r1
15
  bcc CopyDataInit
Ich bin jetzt auf Visual Studio/VisualGDB gewechselt.
Das sind Cmake-Projekte. (erzeugt mit Wizard)

Grüße
Runout

von Harald K. (kirnbichler)


Lesenswert?

Thomas T. schrieb:
> Ansonsten nutze ich HW aus dem Hause S***r natürlich gern (@ Til S.) :-)

Hilft die Sch*r* im K*pf, oder w*s s*ll d*e Z*ns*r?

von Thomas T. (runout)


Lesenswert?

J. S. schrieb:
> Also crt0.S und das Linkerfile passen nicht zusammen, für den CM3
> scheint es richtig angepasst worden zu sein.
> Also einfach das dieses crt0.S benutzen:
> 
https://github.com/eclipse-threadx/threadx/blob/master/ports/cortex_m3/gnu/example_build/cortexm3_crt0.S

kann funktionieren, muss aber nicht.
cortexm3_crt0.S und cortexm0_crt0.S haben unterschiedlichen Code
im Copy-Loop (crt0_memory_copy).

Trotzdem schade, dass das ThreadX-Zeug nicht konsistent ist.

Runout

von J. S. (jojos)


Lesenswert?

Ein M4 ist aber ein M3 mit FPU die hier nicht behandelt wird, von daher 
passt der M3 Code für den M4.

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.