GCC



Das Programm stürzt trotz scheinbar fehlerfreiem C-Code undeterministisch ab

Fehler
Ein laufendes C-Programm verhält sich auf dem SpartanMC scheinbar völlig willkürlich. Ein semantischer Fehler im C-Quellcode lässt sich aber weitestgehend aussschließen.

Mögliche UrsacheLösung̣
Der Compiler hat wegen eingeschaltetem Inlining fehlerhaften Code erzeugt, da Inlining derzeit (GCC r118) nicht zuverlässig zu arbeiten scheint.Inlining mittels GCC-Schalter -fno-inline deaktivieren.
ACHTUNG: In älteren Projekten (erzeugt vor testing r1379) steht im Makefile config-build.mk im Firmware-Verzeichnis noch ein falscher Schalter -fno-inline-functions. Dieser hat NICHT die beabsichtigte Wirkung, das Inlining auszuschalten. Bitte durch -fno-inline ersetzen!
Der Stack läuft über. Wenn der Stack, der vom oberen Speicherende nach unten hin wächst, sich bis in den Programmcode ausdehnt, wird dieser zerstört.Programm verkleinern oder mehr BlockRAMs für den SpartanMC verwenden.


Schlechte Optimierung (fehlerhafte Befehlsbeschreibung?)

  1. l9 Befehl folgt immer ein and mit Maske 511 der nicht notwendig ist, da schon im l9 der Wert mit 511 maskiert wird.
  2. add und sub wird auch bei unsigned Variablen verwendet. Sollten nur eingesetzt werden, wenn das OV-Flag benötigt wird sonst immer addu und subu.
  3. lhi + ori zum Laden von Adressen kleiner gleich 511. Der Datenbereich hinter dem Systemstart bringt mit dem GCC keine Vorteile mehr und sollte an das Speicherende hinter die Sektion rodata verschoben werden.


SpartanMC