ThreadX/Azure RTOS, Example baut nicht

OP #7691246
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

Angehängte Dateien:
#7691364
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

(Firma: SEGGER) #7691386
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

OP #7691673
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

OP #7691726
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

OP #7691834
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren