Forum: Mikrocontroller und Digitale Elektronik Frage zu Interrupts (parallel zum Hauptprogramm?)


von Floh (Gast)


Lesenswert?

N'abend!

In dem Interrupt Tutorial hier hab ich zwei widersprüchliche Aussagen 
gefunden:

"Bei bestimmten Ereignissen in Prozessoren wird ein Interrupt ausgelöst. 
Dabei wird das Programm unterbrochen und ein Unterprogramm, die 
sogenannte Interrupt Service Routine (ISR), aufgerufen. Wenn dieses 
beendet ist läuft das Hauptprogramm ganz normal weiter."

und:

"Das Senden sowie Empfangen kann parallel erfolgen und läuft vollkommen 
unabhängig vom Hauptprogramm. Die Daten werden in spezielle Puffer 
kopiert, sodass das Hauptprogramm mit seinen Strings sofort 
weiterarbeiten kann."

Also was nu? Wird das Hauptprogramm unterbrochen oda nicht?

Danke im voraus! :)

Lg, Flo

von Martin (Gast)


Lesenswert?

Das Programm wird unterbrochen uns die ISR wird aufgerufen, deine zweite 
Aussage bezieht sich auf interne Timer oder das UART, das läuft parallel 
ab und meldet wenns fertig ist nen Interrupt, dass man die Daten 
verarbeiten kann.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Sowohl als auch ;-)

Natürlich wird beim UART Senden/Empfangen über Interrupts das 
Hauptprogramm auch durch die betreffenden Interrupts unterbrochen, so 
wie es im ersten Abschnitt erklärt ist.

Ausser - wenn man spitzfindig ist - wenn man den zweiten Abschnitt nicht 
auf die Interrupts an sich münzt, sondern auf die Art wie die 
Hardware-UART ein Byte als Bits auf die Reise schickt oder empfängt. DAS 
funktioniert für jeweils ein Byte parallel zum Hauptprogramm.

von STK500-Besitzer (Gast)


Lesenswert?

>Also was nu? Wird das Hauptprogramm unterbrochen oda nicht?

Es wird unterbrochen. Trotzdem ist die zweite Aussage auch richtig, da 
du die Sachen aus dem Zusammenhang gerissen hast.
Das eine Mal geht es um Interrupts allgemein, das andere Mal geht es um 
den Datenversand und -empfang im Hintergrund.

von Floh (Gast)


Lesenswert?

Also hm, Ich glaub ich muss konkreter werden... danke für die Antworten 
soweit :).

...ist es während dem Senden einiger hundert Bytes möglich währenddessen 
2 neue Bytes zu empfangen und diese innerhalb dieses Streams 
einzubauen... -während- dieser gesendet wird? Wird der Stream 
unterbrochen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> ...ist es während dem Senden einiger hundert Bytes möglich währenddessen
> 2 neue Bytes zu empfangen und diese innerhalb dieses Streams
> einzubauen... -während- dieser gesendet wird?

Ja und ja.

> Wird der Stream unterbrochen?

Kommt darauf an. Wenn du (bzw. deine selbstgeschriebene Empfangsroutine 
im Interrupt) die empfangenen Bytes mitten in den Sendestream packst, 
wird der originale Stream durch die beiden neuen Bytes logischerweise 
unterbrochen. Auch kann es dir passieren, dass du mit dem einbauen in 
den Stream zu lange brauchst und die Senderoutine den Stream unterm 
Hintern weggezogen hat. Das hängt auch etwas von deinen 
Programmierkünsten ab. Wenn du die Bytes hinten an den Stream anhängst, 
sollte es im allgemeinen keine Herausforderungen geben.

von STK500-Besitzer (Gast)


Lesenswert?

Alles was noch nicht gesendet wurde, kann noch gesendet werden...
(um in schwammigen Formulierungen zu schwelgen...)

von Floh (Gast)


Lesenswert?

Oh man, ich glaub nu kann ich es nimmer weiter abstrahieren.

Also wenn ich darauf nu keine Antwort mehr krieg isses verständlich; nen 
kleines Gedankenspiel so spät am Abend hat doch aber auch was, hmm? ;)

Ich versuch nur meinem Kollegen und mir mehrere Stunden an planlosem 
Rumgerätsle zu ersparen.

-----------------------------------------------------------------------
void send_Data(int Zaehler,int Channel,int Value,int Start_Channel)
{
  for(Zaehler; Zaehler < Channel; Zaehler++)
  {

     if(new_data_available == 1)
     {

       if(interrupt_channel < Zaehler)
        {
         send_Data(Zaehler,interrupt_channel,interrupt_value,Zaehler)
        };
     };

  send_NullInformationsByte;
  };

  send Channel_Byte;
};

//Erster Programmaufruf:

send_Data(1,received_Channel,received_Value,1);
------------------------------------------------------------------------

Kontext ist folgender: Als Input in den uC kommen zwei Bytes; das 
welches sagt an welchen Kanal die Information des zweiten Bytes gehen 
soll.

Am Ausgang werden nun soviele "Null-Bytes" rausgeschickt bis die Anzahl 
mit dem Kanal übereinstimmt. Dann geht der Kanal-Value raus.

Jetzt diese kleine rekursive Funktion: Kommt während dem Senden der 
(maximal 511) "Null-Bytes" nochmal ne neue Information rein soll diese, 
sofern man an dem jeweiligen Kanal noch nicht vorbei ist, eingebaut 
werden. Danach soll es bis zum ursprünglichen Kanal weitergehen.

(...dass ich Probleme kriege sobald sich die Funktion selber zum 2. Mal 
aufruft, und sobald der neue Kanal > als der Ursprungs Kanal ist.... ist 
erstmal nicht wichtig ;)   - es geht nur darum dass der Stream nicht 
abbricht).


So, puh.... Danke zum xten! :)

Lg, Flo

von Peter D. (peda)


Lesenswert?

Ist alles kein Problem, Du kannst senden und empfangen, wie Du lustig 
bist.
Du brauchst nichtmal Interrupts dazu.

Z.B. bei 9600Baud dreht die CPU erstmal 20833 Zyklen Däumchen (bei 
20MHz), ehe sie das nächste Byte in das Senderegister packen darf.

Kannst also bequem testen, ob inzwischen irgendwas empfangen wurde und 
das in den noch nicht gesendeten Stream einfügen.


Peter

von STK500-Besitzer (Gast)


Lesenswert?

Das würde ich anders machen.
Auf jeden Fall keine Rekursion verwenden, da das ein Speicherfresser 
ist, den man sich auf einem Mikrocontroller nicht erlauben sollte.

Besser wäre es, ein Feld (Puffer) von der nötigen Grösse zu senden und 
anhand  eines Zeigers festzustellen, ob die entsprechende Position schon 
gesendet wurde.
Den Sinn muß ich nicht erraten, oder?

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
Noch kein Account? Hier anmelden.