Der gute alte 8250
Noch heute baut man die "uralte" 8 Bit Hardware in hochmoderne 32 Bit ARM Prozessoren.
Hier hatte ich in den 80zigern schon Assembler/Pascal Routinen für die RS232-Software geschrieben,
Das lief auch immer einwandfrei, bis ich meinen ersten "ARM" Contoller hatte.
Da trat zum ersten mal das Read Modify Write Problem in mein Leben.
Im RX Interrupt gab es die Zeile rx_count++;
Das Hauptprogramm rief RX_Get auf und dort war rx_count--;
Bei allen Prozessoren vorher war das kein Problem, denn die hatten "atomare" Befehle
für inc und dec. Auch der 80286 in meinem PC-XT sowie die PIC-Controller noch heute.
Nur der Arm Prozessor konnte/kann das bis heute nicht und das geht dann gehörig daneben.
Er macht aus einem INC einen Dreizeiler, welche natürlich vom Interrupt unterbrochen werden kann....
Aber auch die Umstellung von Assembler/Pascal auf C führte wieder zum Nichtfunktionieren,
weil der C-Compiler die Umschaltung des D-LAB Bits weggekürzt hat, er sah da nicht so den Sinn drin
ein Bit zu setzen ohne es zu benutzen und dann wieder zu löschen,
das ist aber zwingend notwendig für die Registerumschaltung.
Hier half dann das "volatile"
Es gibt schon "schöne" Fehler .....
Ich konnte schon mal einen Softwarefehler mit einem 100nF Kondensator beseitigen
Tagelange Suche nach unerklärlichem Verhalten bei einem Board mit PIC-Controller.
Endlich hatte ich die vermeintliche Softwarezeile gefunden.
Kleine Änderungen und der Fehler war weg...
Aber eigentlich war ich dann soweit fortgeschritten dass völlig
unnützer Code den Fehler beseitigte.
Es war mir völlig rätselhaft warum nun ein "NOP" die Software zum Absturz brachte.
Timing Problem war nicht gegeben, da war überhaupt nichts Zeitkritisches.
Ich habe mich dann nach "SEHR langem" suchen an Microchip gewendet und es gab da einen "Spezialisten"
der hat das Problem recht schnell erkannt, bzw. vermutet.
Der Flashspeicher im PIC war aufgeteilt in mehrere Bereiche, wobei nicht
immer alle aktiv waren. Verschob sich nun der Programmcode im Speicher
und es wurde die nächste Bank angesprungen, zog der Chip kurzzeitig mehr Strom.
Da der "entscheidende" Entkoppelkondensator etwas zu weit vom den Chip entfernt war
gab es einen Spannungseinruch/Störung...
Es ging da also nur um etwas 1 cm Leiterbahn......
Einen zusätzlichen 100nF an die Beinchen gelötet und das war es dann schon.
Hier konnte man mal sehen wie wichtig diese kleinen Dinger sind.
Nicht immer ist die Software schuld
Also immer so dicht wie möglich an die Versorgungspins.
Siro
Lesezeichen