Forum: Compiler & IDEs stack/printf/va_arg Problem bei arm-none-eabi-gcc und STM32


von Weinga U. (weinga-unity)


Lesenswert?

Hallo,

mein Kollege und ich versuchen seit mehreren Tagen ein seltsames Problem 
zu fixieren:

Umgebung:
  STM32F103 mit arm-none-eabi-gcc (mit 4.6 und 4.7 bereits probiert)

Code (nur Prinzip):
1
void interrupt_1ms()
2
{
3
  printf("%f",1.234);
4
}
5
6
void test()
7
{
8
  // irgendwas
9
}
10
11
void main()
12
{
13
  while(1)
14
  {
15
    test();
16
  }
17
}

Symptom:
Meistens wird 1.234000 durch den printf erzeugt (und über RS232 
ausgegeben), und manchmal 0.000000. Wird test(); nicht aufgerufen, passt 
alles.

Ein Versuch printf selbst nachzuprogrammieren (unter Verwendung von 
va_arg) hat zu dem selben Ergebnis geführt. Es stimmen einfach manchmal 
die von va_arg zurückgegebenen Werte nicht wodurch printf ebenfalls 
seine Probleme hat.

Im Internet gefundene Lösungsvorschläge wie
http://www.coocox.org/forum/topic.php?id=346
haben das Problem nicht gelöst.

Unsere Vermutung ist, dass irgendwo das stack alignment sich nicht mit 
va_arg verträgt.

Hat jemand von euch dieses Problem auch schon gehabt und eine Lösung 
dazu finden können. Ich kann mir nicht vorstellen, dass printf einfach 
nicht gehen.

Besten Dank.

mfg, Weinga-Unity

: Gesperrt durch User
von Rattenschwanz (Gast)


Lesenswert?

Leider kann ich dir auch nur sagen, dass ich das Problem auch kenne 
jedoch auch keine Lösung habe !

von Mike (Gast)


Lesenswert?

FPU aktiviert?

von Mike (Gast)


Lesenswert?

>Umgebung: STM32F103
Ähm... wohl doch keine FPU! ;o)

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Komplettes Minimalbeispiel inkl. aller Quellen, Linkerscript und 
Makefile (Compiler und Linkeroptionen, Linkeraufruf)? printf wirklich in 
einer ISR? MSP und PSP in Gebrauch? Stack und Heap ausreichend groß? 
sbrk Implementierung? Welches Binärpacket der Toolchain oder selbst 
gebaut? Stack auf double-word ausgerichtet? Wie geprüft? Stack-pointer 
und "heap end"-Wert und Adressen der Argumente vor Aufruf von printf 
bzw. va_start/va_arg im debugger beobachtet?

(In Forum gcc verschoben.)

von Alex (Gast)


Lesenswert?

Das ganze hat mit dem Heap nichts zu tun. Die Variablen liegen auf dem 
Stack. Dein Stack ist an der Stelle nicht mehr 8-byte aligned 
(entsprechend double), damit hat vararg ein Problem.

https://answers.launchpad.net/gcc-arm-embedded/+question/235875

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Danke für's Exhumieren...

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.