Da ich fleissig mit PICs herumbastele, benötige ich u.a. auch eine Software zum Simulieren von Programmen. Ich verwende hierzu gpsim. Da bei größeren Projekten Programmfehler unvermeidbar sind, stecken auch in dieser Software noch eine Menge "Bugs". Aber glücklicherweise ist ja (wie bei Linux-Projekten üblich) der Quellcode verfügbar, und man kann sich (mit ein wenig C-Kenntnissen) selber auf die Suche nach Fehlern machen... Ausserdem ist es bei solchen Projekten "üblich", daß gefundene Fehler (und ggf. Wege zu deren Behebung) an den "Maintainer" gemeldet werden, um zur Verbesserung des Programmes beizutragen. Nur leider scheinen solche EMails oft (bei meinen Versuchen is das fast immer passiert) irgendwie "verloren zu gehen". Nachdem ich nun schon wieder einmal über einen Monat auf eine Antwort auf einen Bugreport/Patch gewartet habe, habe ich mich entschlossen, die von mir gefundenen Fehler hier zu veröffentlichen. Damit haben dann auch andere Anwender wenigstens eine geringe Chance, mit Hilfe von Suchmachinen diese Seite zu finden, und den Fehler ebenfalls zu beheben. Ja, mir ist bekannt, daß ein Bugtracking-System für "gpsim" existiert, nur leider ist zur Teilnahme daran eine Registrierung (incl. EMail-Adresse) notwendig. Da ich schon genug "Spam" bekomme, verzichte ich lieber darauf...
"Interrupt on Change" funktioniert beim PIC 12F675 nicht
Nach etlichen Versuchen, einen "Interrupt on Change" auf einem PIC12F675 zu simulieren, fiel mir auf, daß das Bit "GPIF" im "INTCON"-Register auch bei korrektem Inhalt des "IOC"-Registers in der Simulation nicht gesetzt wird, was in der Realität sehr wohl funktioniert. Nach tagelanger Fehlersuche entdeckte ich die Ursache in der Funktion "PicPortGRegister::setbit()" in der Quelldatei "pic-ioports.cc": Hier wird eine "bitMask" für die Bits erzeugt, die den Zustand der "aktivierten" Portbits im Register "IOC" wiederspiegeln soll. Nur leider wird dieser Wert in einer Variablen vom Typ "bool" gespeichert... Bei der Verwendung mancher Compiler reduziert sich damit der mögliche Wertebereich auf "0" und "1", wodurch die Verwendung als Bitmaske nur noch bei "Bit0" funktioniert. Abhilfe: Typ der Variablen "bitMask" auf "int" ändern, dann klappts auch mit dem Interrupt...
"Computed GOTO" funktioniert nur in den ersten 256 Instruktionen
Die Ursache hierfür ist der unkorrekte Inhalt des Registers "PCLATH" (ist immer null). Die exakte Stelle im Quellcode habe ich noch nicht gefunden. Abhilfe: Funktionen, die "Computed GOTO" verwenden, in die ersten 256 Instruktionen verschieben.
"SegFault" nach einigen Sekunden im "Run"-Modus
Die Ursache hierfür ist die Umsortierung einer verketteten Liste, bei der einer der Verkettungzeiger irgendwann einmal "in die Pampa" zeigt. Die exakte Stelle im Quellcode habe ich noch nicht gefunden. Abhilfe: Leider noch keine...
Schreibzugriff auf Register "STATUS" entspricht nicht der Realität
In der Simulation wird anscheinend ein Schreibzugriff auf das Register "STATUS" immer so ausgeführt, als wäre es ein "normales" Register. In der Realität ist ein Schreiben der Bits "Z", "DC" oder "C" nur mit Instruktionen möglich, die keines von diesen Bits selber verändern, also z.B. "BCF", "BSF", "SWAPF", und "MOVWF". Die Ursache ist noch unklar, bisher habe ich diesen Fehler (nach langem Debugging) nur feststellen können. Abhilfe: Leider noch keine...
Für die Richtigkeit und Funktionsfähigkeit der hier aufgeführten Beschreibungen/Modifikationen übernehme ich keinerlei Verantwortung. Diese Beschreibung ist als ein Hinweis zu sehen, wie sich manche Fehler möglicherweise beseitigen lassen. Ausserdem nehme ich keinerlei Anfragen/Aufträge zur Fehlersuche an → Diese Seite beschreibt ausschließlich die Fehler, die ich gefunden/behoben habe. Für alles Weitere sind die Maintainer des Projektes "gpsim" zuständig.
Startseite Linux-Ecke Rechtliches Kontakt