STM32 - LDRD Problem + Lösung

OP #2015251
Lesenswert?

Ich experimentiere gerade mit STM32 Value Line Discovery Board + Atollic 
True Studio herum.

Nachdem ich mich eigentlich recht gut unterwegs wähnte und schon einige 
Hürden mit der I2C Pheriperie überwunden hatte, mich sogar mit 
Strukturpointern angefreundet hatte, begegnete mir dieses Phänomen, was 
erst mal die ein herber Rückschlag wirkte:

Ich hatte mir ein Problem eingehandelt in I2C-Funktionen die vorher in 
dieser und anderen Programmen eigentlich schon stabil funktioniert 
hatten. Diese unscheinbare und eigentlich völlig unkritische wirkende 
Zeile hier war fast 2 Wochen mein Problem:

   I2C_Send7bitAddress(I2C1,i2c_adress, I2C_Direction_Receiver);

Nach dem Ausführen diese Zeile wurde immer wieder die lokale Variable 
"i2c_adress" gelöscht und das Programm blieb komplett hängen weil die 
nachfolgende while Bedingung nicht mehr "wahr" wurde:

Im Polling Mode folgt hier ja immer:
/* Test on EV6 and clear it */
while (!I2C_CheckEvent(I2C1, 
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
Aber diese Zeile hat nichts mit dem Problem zu tun...


Heute weiss woran das liegt. Schuld daran ist der ASM Befehl LDRD der im 
Zuge der Funktion I2C_Send7bitAddress() ausgeführt wird. Das entscheidet 
zumindest der GCC. Dieser Befehl aber ist buggy und sollte vom Compiler 
lieber vermieden werden. Aber das muss man dem erst einmal beibringen, 
wie ich später herausfinden sollte.

Beim Debuggen fiele mir im Disassembly der Befehl LDRD erstmalig auf, 
denn danach war die lokale Variable plötzlich 0x00. Als ich nachschaute, 
was dieser Befehl denn so tut, gelangte ich über ein paar Umwege dann zu 
diesem entscheidenden Link, fast schon durch Zufall. Von ARM selbst gibt 
es ein Document (Errata Notice) was ein Fehlverhalten des Cores erklärt. 
Man findet es hier: 
http://infocenter.arm.com/help/topic/com.arm.doc.eat0420c/Cortex-M3-Errata-r2p0-v2.pdf

Die Lösung war schiesslich der Einsatz der Compiler Option
-mfix-cortex-m3-ldrd
in den Build Options des GCC.

Ich hoffe, diese Info hilft einigen von Euch weiter, die mit seltsamen 
Erscheinungen zu kämpfen haben. Es sind ja auch noch anderes Fehler im 
Cortex-M3 Core beschrieben. Man sollte solche Erratas tatsächlich nicht 
ignorieren...
Gast #3183938
Lesenswert?

Vielen dank !!!!!

 Ich hatte vergessen diesen fix beim compiler Anruf einzufügen.....hat 
mir 3 Tagen debuggen mit dem I2C CPAlv2 Biliothek auf STM32F373 
gekostet. Ach ja, so lernt man immer noch etwas neues.

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