Fehler in GCC und AVR Studio

Gast #364291
Lesenswert?

Hallo,

ich habe ein kleines Programm für den AT90S2313 geschrieben mit dem GCC
v3.4.1, der Bestandteil von WinAVR 20040720 ist. Mir ist durchaus klar,
dass es nicht unbedingt sinnvoll ist, für so einen kleinen µC gleich
einen C-Compiler anzuwerfen, aber es ging so wesentlich schneller und
das war mir wichtig.

Jedenfalls ist mir dabei aufgefallen, dass der GCC für diesen µC
falschen Code erzeugt (siehe Anhang). Der Befehl im roten Kasten sowie
der nachfolgende Befehl dienen zum initialisieren des Stackpointers.
Problem ist nur, dass der Stackpointer des 90S2313 nur aus einem
Register besteht ($3D), Register $3E ist "reserved" und sollte lt.
Datenblatt S. 84 niemals beschrieben werden ("Reserved I/O memory
addresses should never be written."). Die Konsequenz aus diesem
fehlerhaften Code ist, dass der Simulator von VMLAB z. B. an dieser
Stelle mit einer Fehlermeldung einfach abbricht, so wie es eigentlich
sein sollte. Weiter scheint AVR Studio dies komplett zu ignorieren, es
meckert an keiner Stelle.

Ich wollte das hier nur mal kurz erwähnen. Der fehlerhafte Code
funktioniert in meiner Anwendung zwar problemlos, bin jedoch trotzdem
auf einen anderen Compiler umgestiegen, der das richtig macht.

Gruß
Thorsten
Angehängte Dateien:
Moderator Persönliche Seite #364295
Lesenswert?

> Der AT90S2313 besitzt kein SPH.

Stört aber auch nicht.  VMLAB meckert zwar, aber du kannst danach
getrost weitermachen.  GCC behandelt den Stackpointer immer als
16-Bit-Zeiger, bei einem AT90S2313 wird dann ein nicht existierendes
IO-Register mit 0 beschrieben, letztlich ignoriert die Hardware das
einfach (im Gegensatz zum VMLAB).

Die Ursache dafür ist, dass der GCC nicht für jeden einzelnen der
vielen Controller einen eigenen Codegenerator implementiert, sondern
die AVR-Cores nur grob klassifiziert.
Gast #364297
Lesenswert?

Yep. Und wenn du schon dabei bist, den GCC entsprechend anzupassen, dann
kannst du ihm auch gleich den kompletten Befehlssatz vom Tiny2313
beibringen. Der wird nämlich aus ähnlichem Grund als primitiv-AVR
verstanden, was er indes nicht ist. Nur weil ihm der
Multiplikationsbefehl fehlt und er daher nicht in die nächsthöhere
Kategorie passt.

In der Entwicklung vom GCC/AVR wurde eine Prozessor-Klassifizierung
eingeführt, die sich im Laufe der Zeit als zu enges Zwangskorsett
herausgestellt hat. Es wäre angebracht, statt einer Prozessorklasse die
einzelnen Eigenschaften pro Modell getrennt einzupflegen. Aber solange
das nicht passiert, wirst du damit leben müssen.

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