Hallo, was für Ursachen kann denn ein Interrupt TRAP der Art Illegal Word Operrant haben? Gruß Patrick
Hi, Auszug aus dem Datenblatt: Illegal Word Operand Access Trap Whenever a word operand read or write access is attempted to an odd byte address, the ILLOPA flag in register TFR is set and the CPU enters the illegal word operand access trap routine. Sprich wenn Du versucht auf einen n*16 Bit-Operanden zuzugreifen, der an einer ungeraden Adresse liegt gibt es denn TRAP. Gruß
Hallo, danke schonmal. Ich habe mir auch schon gedanken um dieses Problem gemacht, wollte aber nicht gleich meine ganzen Überlegungen hier hinschreiben, um eine unabhängige Meinung bzw. Idee zu bekommen. Ich bin auf der Suche nach der Ursache für diese ungerade Speicheradresse. Ich weiß nicht so recht wie es dazu kommt? Hatte schon überlegt, ob vielleicht ein Datentyp falsch ist oder der Speicherplatz falsch angelegt ist. Gruß Patrick
Patrick Moll schrieb: > Ich weiß nicht so recht wie es dazu kommt? Hatte schon überlegt, ob > vielleicht ein Datentyp falsch ist oder der Speicherplatz falsch > angelegt ist. Kann sein, wenn z.B. auf eine ungerade Byte Adresse wortweise zugegriffen wird. Oder anderer häufiger Fehler: Indirekter Speichzugriff, MOV R1,[R2] -> R2 ungerade Für die Programmentwicklung hifreich ist es, eine Interruptroutine an die TRAP Vektoren anzuhängen, die einem auf der seriellen Schnittstelle (sofern vorhanden) sämtliche Registerinhalte und den CSP/IP ausgibt, dann sind solche Fehler schnell gefunden. Welche Debugmöglichkeiten bestehen denn?
Mit einem Cast bekommt man so einen Fehler leicht hin, wenn man ein Word oder eine Struktur mit Words auf eine beliebige Adresse castet. Fällt dann ein Word auf eine ungerade Adresse, gibt es bei Zugriff einen Fehler (interrupt).
Hallo, hier ist mal die Funktion, in der der Fehler auftritt. int GetDataADC(int *piData) { int i; SSC1_CON_EN = 0; SSC1_BR = 0x01; // Baudrate 10Mbit/s SSC1_CON = 0xc05f; CS_ADC = 0; // select DAC for (i=0; i< 6;i++) { SSC1_TB = 0x0000; // sen Anzahl der Nutzdaten while(!SSC1_RIC); // warte bis Ende der Übertragung SSC1_RIC = 0; // Flag zurücksetzen *(piData+i) = SSC1_RB; //Hier tritt der Fehler auf !!!!! } CS_ADC = 1; // deselect DAC Conversionstart_ADC=0; CC2_OUT_CC3IO = 0; return 0; } Gruß Patrick
Hi, ist doch auch kein Wunder. Du erhöhst piData im zweiten Schleifendurchlauf um 1. Wenn am Anfang eine gerade Adresse drin stand steht da jetzt eine Ungerade. Dann greifst Du auf diese Adresse zu und schreibst einen 16 Bit-Wert rein -> Du greifst auf einen Word-Operanden an einer ungeraden Adresse zu und löst damit den Trap aus. Gruß
Hallo, stimmt guter Hinweis, habe aber herausgefunden, dass pidata schon direkt nach dem Aufruf der Funktion eine ungerade Adresse hat. Das kommische ist es ist nicht vorhersehbar wann der Fehler auftritt, also ich meine er tritt nicht immer dann auf wenn die Funktion jedesmal aufgerufen wird, sondern z.B erst nach 3 Stunden. Gruß Patrick
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.