Guten Abend...
Ich habe eine Frage:
Habe ein Programm:
1
ISR(INT1_vect)
2
{
3
//interruptroutine
4
...
5
...
6
...
7
}
8
9
intmain(void)
10
{
11
while(1)
12
{
13
funktion1();
14
funktion2();
15
funktion3();
16
}
17
}
Beispiel:
es wird z.B. funktion2 bearbeitet und in der Zeit löst INT1 aus.
Wie kann ich, nachdem Interruptroutine beendet ist, SOFORT!!! funktion2
verlassen???
Warum sollte man so etwas tun?
Das was so dringend erledigt werden soll, daß keine Zeit mehr bleibt,
funktion2 fertig zu bearbeiten, kann doch in die Interruptroutine.
Wenn das nicht das Problem ist, dann beschreib mal genauer was du
vorhast.
Also, Interruptroutine ist für Datentransfer zwischen FPGA und
Mikrocontroller.
Interrupt wird ausgelöst, wenn /CS="0" ist und PINS für /RD und /WR für
Datenrichtung (FPGA->uC, FPGA<-uC).
In main() werden Kommandos verarbeitet.
ein Bit im Datenbus (bei einen Komando) ist für "RESET" verantwortlich,
d.h. wenn der "1" ist muss aktuelle "Kommando" SOFORT! unterbrochen
werden.
Sofort, weil es kann sehr schnell neues Befehl kommen.
p.S. sorry für mein Deutsch :)
>Ist abgrundtief hässlich
:-)
Dann doch lieber gleich einen Pin mit einem externen Interrupt-Eingang
verbinden, aber keine ISR zuordnen. Pin aus der ISR auf high -> Full
reset :-)
Irgendwie verstehe ich das nicht ganz. Die Auswertung der Kommandos wird
doch irgendwelche "Seiteneffekte" haben, sprich, die Kommandos bewirken
irgendwas. Ich kann mir nicht vorstellen, daß sich dieses "irgendwas" an
jeder beliebigen Stelle abbrechen lässt, ohne das es ein
Riesendurcheinander gibt.
Ohne definierte Aussprungpunkte aus den main-Funktionen, die eventuell
auch noch unterschiedliche Aufräumarbeiten durchführen, dürfte das nicht
machbar sein.
Zum anderen habe ich dich so verstanden, daß die ISR für den Empfang der
Daten zuständig ist. Damit wird die doch immer aufgerufen, wenn ein
Kommando kommt. Nur muß bei Erkennung von "Reset" alles vorherige
verworfen werden.
Oliver
P.S. "Sofort" ist immer sehr relativ.
Das mit dem Longjump geht, wenn man genau überblicken kann, was in
funktion[123] genau passiert.
Man muss sich sehr genau überlegen, was beim Abbruch der Funktion
alles passieren kann. Was passiert bspw., wenn in der Funktion ein
16-Bit-I/O-Register beschreibt und genau zwischen den beiden dafür
erforderlichen 8-Bit-Zugriffen abgebrochen wird? Komplett tabu sollte
der Longjump dann sein, wenn Bibliotheksfunktionen aufgerufen werden,
da man keinerlei Annahmen über deren Verhalten bei einem Abbruch
machen sollte.
Also ist das doch eher etwas für Verwegene.
Koblenzer wrote:
> Also, Interruptroutine ist für Datentransfer zwischen FPGA und> Mikrocontroller.> Interrupt wird ausgelöst, wenn /CS="0" ist und PINS für /RD und /WR für> Datenrichtung (FPGA->uC, FPGA<-uC).> In main() werden Kommandos verarbeitet.> ein Bit im Datenbus (bei einen Komando) ist für "RESET" verantwortlich,> d.h. wenn der "1" ist muss aktuelle "Kommando" SOFORT! unterbrochen> werden.> Sofort, weil es kann sehr schnell neues Befehl kommen.
Der AVR kann kein Slave auf dem Memorybus sein, also ist er der Master.
D.h. der AVR bestimmt, wann er was vom FPGA abholt.
Der FPGA muß die Daten solange puffern. Ein FPGA hat ja deutlich mehr
SRAM als ein AVR.
Man kann aber auch in einen kleinen Puffer direkt im Interrupthandler
einlesen. Memoryzugriffe sind ja doch recht fix.
Peter