Seite 1 von 1

*gelöst* Magische Zahl ($3A)

Verfasst: So 9. Aug 2009, 19:57
von Rainer
Wahrscheinlich @drohne235:

Ich habe ein ganz eigenartiges Problem an dem ich jetzt den ganzenTag schon rummache.

Ich lösche das SRAM von Adresse 0 bis 511 mit folgendem Code:

Code: Alles auswählen


     repeat c from 0 to 511
         ios.ram_write(0,c)
Es wird alles richtig auf 0 gesetzt, nur die Adresse $0 nicht. Ich kann machen was ich will, die ist immer auf $3A.
Ich kriege noch die Krise :(
Ich habe alles durchgesehen. Alle Objekte die ich benutze, das komplette Programm ... ich schreibe diesen Wert nicht.
Auch wenn ich mit "rtool" die Speicherstelle 0 auf 0 setze, habe ich sofort die $3A wieder an Speicherstelle 0 sobald ich mein Programm starte.
Ich habe einen Breakpoint in meinem Programm gesetzt gleich nach der Initialisierung. Der Wert wird also nicht irgendwo dahinter geschrieben.

Einlesen tue ich es so:

Code: Alles auswählen

VAR
      byte ram_buffer[31]

PUB blabla
  ..
  ..
  repeat c from 0 to 31
    ram_buffer[c] := ios.ram_read(c)
Debuggen tue ich es damit:

Code: Alles auswählen

  repeat c from 0 to 31
    ios.printhex(ram_buffer[c],2)
Ich weiß echt nicht mehr weiter.
Jemand eine Idee ? Wo übersehe ich etwas ?

@drohne235: Kommt Dir der Wert $3A irgendwie "bekannt" vor ?

Gruß.
Rainer

Re: Magische Zahl ($3A)

Verfasst: So 9. Aug 2009, 20:46
von Rainer
Komisch.

Ich habe jetzt das Array auf Wortbreite geändert.
word ram_buffer[31]

Jetzt gehts ... aber erklären kann ich mir das nicht wirklich.

Daten mit einer Byte Breite sollten doch eigentlich auch in ein Array mit Bytebreite passen, oder habe ich da einen Denkfehler ?

Re: Magische Zahl ($3A)

Verfasst: So 9. Aug 2009, 21:38
von drohne235
Geh mal davon aus das der Fehler noch nicht weg ist, dass es jetzt grad läuft ist Zufall denk ich. Ich würde wahrscheinlich erstmal einen kleinen SPIN-Testcode in einer anderen Datei machen um es einzugrenzen. Ansonsten hilft es nur alle ram_write Zugriffe mal durchzuschauen oder eine kleine Debugroutine welche die Adresse 0 überwacht an neuralgischen Punkten einzufügen um erstmal einzugrenzen an welcher Stelle im Code sich der Wert ändert. Vielleicht gleich zu Anfang in main die Speicherstelle auf 0 setzen.

Mir selbst ist das schon mal bei meinen PASM-Experimenten passiert als ich die Zugriffszeiten der RAMs nicht beachtet hatte. Ich hatte gleich nach anlegen der Adresse einen Wert auf den Datenbus zum lesen/schreiben angelegt und nicht beachtet das der RAM ja seine 55 ns braucht. So wurde in einer Schleife die ab Adresse 0 anfing auch erst ab Adresse 1 geschrieben. Da hab ich auch einen ganzen Sonntag gesucht. Hast du irgendwelchen PASM-Code drin für den Ramzugriff oder allgemein eigenen Code der am Bus "rumwackelt".

Ansonsten ist $3A == ":" - taucht das Zeichen irgendwo im Programm auf?

Hmm, hab jetzt mal mit rtool die ersten acht Speicherzellen auf definierte Werte gesetzt - das bleibt bei mir in allen Lebenslagen stabil. Selbst nach Reset, wplay, hallo, play, sview...

Sach mal, verwendest du schon dein modifiziertes regime?

Re: Magische Zahl ($3A)

Verfasst: So 9. Aug 2009, 23:21
von Rainer
drohne235 hat geschrieben:
Ansonsten ist $3A == ":" - taucht das Zeichen irgendwo im Programm auf?

Hmm, hab jetzt mal mit rtool die ersten acht Speicherzellen auf definierte Werte gesetzt - das bleibt bei mir in allen Lebenslagen stabil. Selbst nach Reset, wplay, hallo, play, sview...

Sach mal, verwendest du schon dein modifiziertes regime?
Vielen Dank für Deine Tests.
Du hast Recht. Da ist irgendwas faul in meinem Code.....und ja, ich verwende "mein" Regime,aber Regim nehme ich ja nur zum starten meiner Anwendung Da die auch noch einen eigenen Grafiktreiber mitbringt ist da während der Laufzeit nichts mehr von Regime übrig. Ich habe aber auch den kompletten HIVE bei meinen Tests auf "Grundkonfiguration" geflashed und das "alte" Regime genommen.
Hat an dem Problem nichts geändert.

Das Problem liegt übrigens weder im RAM, noch in den eigentlichen Routinen, sondern einzig und allein in der definition des Arrays ... da ist nämlich überhaupt kein $3A im RAM, sondern das Array hat irgendwie eine falsche Startadresse im Hubram und zeigt mir einfach nur $3A als Wert an, der sich an dieser "falschen" Adresse befindet. Da ich in array[0] auch mit Gewalt keinen anderen Wert schreiben konnte gehe ich mal davon aus, ich befinde mich da im ROM oder auf einem Nur-Lesen-Register.
Durch das "word" habe ich es irgendwie wieder auf die "Bytegrenze" (oder long .. k.A.) gebracht.
So blöde das auch klingt.
Kann es sein, das ich Probleme mit dem Stack oder sowas habe ?
Jede Variable oder Array, die ich in der VAR-Sektion NACH "meinem" Array einfüge, ist mit eigenartigen Werten vorbelegt.
Wenn ich eine Variable VOR "meinem" Array einfüge, ist alles ganz normal.
Irgendwie werde ich das Gefühl nicht los, daß ich aus irgendeinem Grund "aus der Schrittweite" der Bytegrenzen gekommen bin. Ich kann nämlich nach "meinem" Array einfach eine Byte-Variable einfügen (die dann "spinnt"), aber danach kann ich wieder Variablen einfügen, die richtig funktionieren.

Ich weiß, klingt total bescheuert, aber ich kanns nicht besser erklären.
Vielleicht kann ich es mal an einem einfachen Source nachstellen und dann hier posten.
Das mit dem Stack werde ich mir morgen mal ansehen.

Gruß.
Rainer

Re: Magische Zahl ($3A)

Verfasst: Mo 10. Aug 2009, 07:34
von BorgKönig
Zeig' den Source, der das Problem verursacht... Vieleicht findet jemand die Stelle, an dem Du den zulässigen Bereich verlässt...

Re: Magische Zahl ($3A)

Verfasst: Mo 10. Aug 2009, 16:17
von Rainer
Hab's gefunden.
Ich habe in das Array das ich direkt darüber deklariert habe außerhalb des Bereiches geschrieben.

Code: Alles auswählen

VAR

  byte slider_pos[11]                                   
  byte ram_buffer[31]                                   

PUB main |i,c
......
  repeat c from 1 to 12
        slider_pos[c] := 0
.....
Also statt von 0 bis 11 schreibe ich von 1 bis 12 ... und das ist außerhalb des Arrays
Blöder Fehler *grml*

Danke für eure Mühe.

Gruß.
Rainer

Re: *gelöst* Magische Zahl ($3A)

Verfasst: Mo 10. Aug 2009, 16:30
von drohne235
Also statt von 0 bis 11 schreibe ich von 1 bis 12 ... und das ist außerhalb des Arrays
Ist aber interessant. Damit wird auch klar warum die nachfolgenden Variablen nicht funktioniert haben - die wurden einfach überschrieben.

Re: *gelöst* Magische Zahl ($3A)

Verfasst: Mo 10. Aug 2009, 16:57
von DJLinux
Wenn Du mit slider[12]=0 über die Arraygrenze hinaus geschossen bist dann müste aber in ram_buffer[0] eine 0 stehen und keine $3A oder hab ich da was nicht mit bekommen?

Grüsse Joshy

Re: *gelöst* Magische Zahl ($3A)

Verfasst: Mo 10. Aug 2009, 17:33
von Rainer
DJLinux hat geschrieben:Wenn Du mit slider[12]=0 über die Arraygrenze hinaus geschossen bist dann müste aber in ram_buffer[0] eine 0 stehen und keine $3A oder hab ich da was nicht mit bekommen?

Grüsse Joshy
In slider_pos steht nicht wirklich eine 0 ... das war nur der Code zum löschen des Arrays.
Das sind Positionen am Bildschirm der Schieberegler für meine SFX-Anwendung.

Die Zelle wird später dann mit --> slider_pos[12] := 58 beschrieben.... und schon haben wir den magischen Wert $3A :)

Sorry für die Verwirrung.

Gruß.
Rainer

Re: *gelöst* Magische Zahl ($3A)

Verfasst: Mo 10. Aug 2009, 17:42
von DJLinux
Rainer hat geschrieben:...Sorry für die Verwirrung...
Kein Problem wollte nur wissen ob ich da etwas nicht gepeilt bekommen hatte.

Ich würde gerne auch mal über Arraygrenzen "schießen" doch leider krieg ich das RAM nicht zum laufen. Habe Pin 2 Addressleitung 16 schon nachgelöted aber ich kann so oft messen wie ich möchte Pin 2 A16 von Bank 1 hat keinen Kontakt zu A16 auf Bank 2.

Keine Ahnung wo da der Wurm drinnen steckt. (Ach ne ist ja kein Apple :lol: )

Grüsse Joshy