DMA0 (PPI) Interrupt beim Blackfin?

Gast #1052925
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
Gast #1053147
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
Gast #1053460
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.
Gast #1056924
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
Gast #1056935
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
Gast #1063423
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.