Gast
#1843315
Ich brauche mal eine Idee zur Fehlersuche. :-)
Folgender etwas komplizierter Sachverhalt. Ich habe mir den neuen gcc,
newlib und binutils runtergeladen um einen Crosscompiler fuer SH2A zu
backen. (unter Linux)
Das hat auch vollkommen problemlos funktioniert. Dann habe ich das
Linkerscript passend zu meiner Hardware abgeaendert und einen eigenen
Startupcode geschrieben. (Stack setze und bss nullen) CPU ist SH7262
Ich kann problemlos folgendes laufen lassen:
[..]
rs232_init(BAUD_115200);
do
{
led_off(); i=400000; while(i--);
rs232_printf("Wert: %x\r",0xaa);
led_on(); i=400000; while(i--);
}
while(1);
Das fuehrt dazu das etwa einmal pro Sekunde meine LED blinkt und der
erwartete Text auf der seriellen Schnittstelle rauskommt. Mit anderen
Worten es sieht so aus als wenn mein Compiler schon ganz gut laeuft da
ja bereits eine ganze Menge Dinge problemlos laufen. (z.B die
printf-funktion, stack, variablen)
Als naechstes wollte ich die Interrupts in Betrieb nehmen. Dazu muss man
folgendes wissen. Die SH7262 kennt einmal ganz normale Interruptaufrufe
wie ihr sie alle kennt. Also alle Register auf den Stack, IRQ, alles
wieder runter, reti.
Sie kennt aber noch einen zweiten Modi. Alle Register der CPU sind 16mal
vorhanden. Man kann nun bei jedem Interrupt, aber auch nur bei
bestimmten Interruptleveln einfach nur die Banks umschalten.
(Geschwindigkeitsvorteil)
Der gcc unterstuetzt beide Moeglichkeiten!
Wenn ich Interrupts verwenden will dann muss ich die Funktion in eine
Tabelle eintragen, die Adresse in einem speziellen Register eintragen,
dem Interrupt einen Level zuweisen und Interrupts fuer diesen Level
freigeben.
Das habe ich mit einem TimerIRQ gemacht. Der TimerIRQ kommt mit 76kHz.
Ich zaehle dort bis 76000 und gebe etwas auf die RS232 aus oder lasse
eine LED blinken, egal was.
Und es funktioniert!
set_imask(14); //IRQ erlauben
led_on();
Obiges schaltet die IRQs ein. Alles was im IRQ laeuft wird gemacht. Die
CPU stuerzt also nicht ab! Aber das Hauptrogramm steht! Starte ich den
IRQ nicht so laeuft das Hauptprogramm ohne Probleme. Ich habe auch schon
beide moeglichen Interruptaufrufarten ausprobiert. Jedesmal dasselbe
Ergebnis. Ich habe mir den Source den den der Compiler erzeugt
angeschaut und er sieht auch unauffaellig aus.
Jemand eine Idee woran das liegen kann?
Olaf