Forum: Mikrocontroller und Digitale Elektronik STM32 - LDRD Problem + Lösung


von Michael H. (arm4arme)


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

von Ewout Boks (Gast)


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.

von Stefan (Gast)


Lesenswert?

Aber der Cortex-M4 ist von dem LDRD Bug doch gar nicht betroffen...

von Peter D. (peda)


Lesenswert?

Stefan schrieb:
> Aber der Cortex-M4 ist von dem LDRD Bug doch gar nicht betroffen...

Da es geholfen hat, vermutlich doch.

Ist garnicht so selten, daß Bugs in neuere MCs mitgeschleift werden, 
wenn der Hersteller sie als nicht kritisch ansieht.
Oder wenn sie nur von einzelnen Bastlern reportet werden und nicht von 
einem Großkunden.

von Heiko J. (heiko_j)


Lesenswert?

Stefan schrieb:
> Aber der Cortex-M4 ist von dem LDRD Bug doch gar nicht betroffen...

Das STM32 value line Discovery hat aber nen M3. Genau gesagt nen 
STM32F100RB. Die Compileroption "-mfix-cortex-m3-ldrd" ist übrigens beim 
Aufruf mit "-mcpu=cortex-m3" implizit enthalten.

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.