Moin, ich verwende einen Blackfin 532 und uebertrage per PPI mit DMA Daten an diesen. Nur wollte ich die Datenuebertragung per Interrupt synchronisieren. Geschafft habe ich bisher, den DMA und Sequencer so einzurichten, dass ein Interrupt ausgeloest wird. Allerdings sieht es so aus, als ob durchgehend Interrupts ausgeloest werden, was nicht von der PPI-Uebertragung verursacht werden kann. Vielmehr vermute ich ein Problem in meiner ISR. Wodran kann es liegen, dass immer wieder die selbe Routine ausrefuehrt wird? Muss ich den Interrupt in der ISR bestaetigen (Interrupt Acknoledge) und wie mache ich das im BF532? Hier mal der Einsprung in Assembler, der die ISR aufrufen sollte: _I8HANDLER: // IVG 8 Handler //[-- sp] = reti; [-- sp] = astat; [-- sp] = fp; [-- sp] = (r7:0, p5:0); call _Interrupt8Handler; (r7:0, p5:0) = [ sp ++ ] ; fp = [ sp ++ ]; astat = [ sp ++ ]; //reti = [ sp ++ ]; rti; Gruss, Joern
Hardware Reference Fig. 9-14 & 9-15, Seite 9-38 [1]. Um den Interrupt zu bestätigen musst du das DMA_DONE Bit im entsprechenden DMAx_IRQ_STATUS Register setzen (W1C: Write-1-to-Clear). [1]_http://www.analog.com/static/imported-files/processor_manuals/bf533hwrRev3.3.pdf
Oh danke, jetzt machen W1C und RO auch endlich mal ein bisschen Sinn fuer mich... Loescht man diese Bits nicht, bleibt der Interrupt dann angelegt und unterbricht das Programm gleich wieder? Ist meine Fehlerbeschreibung typisch fuer einen Fall, wo das Loeschen vergessen wurde? Gruss, Joern
Joern wrote: > Loescht man diese Bits nicht, bleibt der Interrupt dann angelegt und > unterbricht das Programm gleich wieder? Ja. > Ist meine Fehlerbeschreibung typisch fuer einen Fall, wo das Loeschen > vergessen wurde? Ja.
Ok, danke erstmal, ich hatte nun mal Gelegenheit, die Interrupt-Bestaetigung auszuprobieren und es loest das Problem. Aufgetreten ist nun aber ein weiteres Problem: Wenn ich den Routineneinstieg so mache wie im Programmcode weiter oben vorgestellt, fuehrt dies zu Instabilitaeten, die an irgendeiner Stelle dazu fuehren, dass das Programm nicht mehr richtig ausgefuehrt werden. Die Zeitpunkte, an den dies schiefgeht sind dabei zufaellig. Versuchsweise habe ich die Interruptbestaetigung im Assemblercode untergebracht und dafuer den Funktionsaufruf entfernt. Unter diesen Umstaenden laeuft alles stabil. Wie gelingt eine richtige Speicherung des aktuellen CPU-States, so dass dieser nach Rueckkehr aus dem Interrupt normal weiterlaeuft? (Ach ja, die Akkumulatoren und anderen Register scheinen nicht das Problem zu sein, werden diese doch nicht in der Interruptroutine verwendet.) Gruss, Joern
joern wrote: > Aufgetreten ist nun aber ein weiteres Problem: Wenn ich den > Routineneinstieg so mache wie im Programmcode weiter oben vorgestellt, > fuehrt dies zu Instabilitaeten, die an irgendeiner Stelle dazu fuehren, > dass das Programm nicht mehr richtig ausgefuehrt werden. Die Zeitpunkte, > an den dies schiefgeht sind dabei zufaellig. Zu einem zufälligen Zeitpunkt in der aufgerufenen Unterroutine im Interrupt? > Versuchsweise habe ich die > Interruptbestaetigung im Assemblercode untergebracht und dafuer den > Funktionsaufruf entfernt. Unter diesen Umstaenden laeuft alles stabil. Das glaube ich gerne. > Wie gelingt eine richtige Speicherung des aktuellen CPU-States, so dass > dieser nach Rueckkehr aus dem Interrupt normal weiterlaeuft? (Ach ja, > die Akkumulatoren und anderen Register scheinen nicht das Problem zu > sein, werden diese doch nicht in der Interruptroutine verwendet.) Kann ich so auf Schlag nicht sagen, ich programmiere die Teile größtenteils in C. Guck in die "Programming Reference", da steht sowas unter Garantie drinne: http://www.analog.com/static/imported-files/processor_manuals/blackfin_pgr.ref.man.rev1.3.pdf
Hi joern, habe ein paar IRQ-Handler in Assembler als Beispiel, siehe irqhandler.asm aus dem Tar-File unter: http://www.section5.ch/dsp/blackfin/shell-1.0-eval.tgz Das Beispiel muss man fuer VDSP allerdings anpassen, die CPP-Defines und Makros werden vermutlich im VDSP-Assembler nicht funktionieren. Gruss, - Strubi
Danke. Ich weiss zwar nicht, welche der Stackoperationen in Deinem save_all nun die entscheidene war um den Prozessorzustand zuverlaessig wieder herzustellen, aber nun gehts. Traum. Gruss, Joern
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.