Flag in ISR und main

Gast #547067
Lesenswert?
• ▲
▼
Frage in der main ein Flag (cmdRcvd) in einer Schleife ab und setze es 
danach wieder auf 0.
1
(....)
2

3
while(1)
4
  {
5
    if (cmdRcvd) {
6
      print(cmdBuffer);
7
      print("\n");
8
      cmdRcvd=0;
9
    }

Das Flag wird in der ISR gesetzt, wenn ein bestimmter Befehl über RS232 
eingegangen ist:
1
while (!XUartLite_mIsReceiveEmpty(XPAR_RS232_BASEADDR))
2
  {  
3
    do 
4
    {  
5
      s[i] = XUartLite_RecvByte(XPAR_RS232_BASEADDR);
6
      i++;
7
    }
8
    while (s[i-1]!='\r');
9
    s[i]='\0';
10
    cmdRcvd=1;

Jetzt könnte es ja aber sein, dass ein UART-Interrupt in der main z.B. 
bei der Anweisung print ("\n") auftritt. Dadurch würde dann zunächst das 
Flag gesetzt, wenn der Prozessor zurück springt und an der letzten 
Stelle weiter macht wird es aber gelöscht. Somit findet im nächsten 
Schleifendurchlauf keine Verarbeitung des Strings statt.

Wie kann man das lösen?
Gast #547104
Lesenswert?
• ▲
▼
> Dann gehen mir aber unter Umständen RS232-Kommandos
verloren.

Wie schnell sendest du den Kommandos?

Bei 115200 bps dauert ein Byte (asynchron, deshalb 10 Bit)
10/115200 Sekunden  = ca. 86,8 Microsekunden.
Ein RISC Prozessor mit 8MHz arbeitet in dieser Zeit ca. 700 Befehle ab.
Und aktuelle UARTs haben mindestens ein Byte Buffer.
Du bist nicht der Erste der sich darüber Gedanken macht ;-)

Werner
Persönliche Seite #547126
Lesenswert?
• ▲
▼
http://de.wikipedia.org/wiki/Mutex

=>

http://de.wikipedia.org/wiki/Lock

=>

Die ISR will einen Write-Lock auf die Resource 'cmdBuffer' setzen und 
der Anweisungsblock in main (bzw. ähnliche Auswerteblocks) einen 
Read-Lock

Vermutlich hast du noch eine dritte Stelle im Programmcode, wo ein 
Write-Lock notwendig ist - die Stelle wo 'cmdBuffer' gelöscht bzw. 
zurückgesetzt wird.
Gast #547174
Lesenswert?
• ▲
▼
Hm, die beschriebenen Methoden beziehen sich ja auf Prozesse, die also 
gleichberechtigt sind.

Bei einer Interruptroutine verhält es sich aber anders: Wenn ich dort 
wie unter dem zweiten Link beschrieben eine Warte-Routine einfüge, 
springt er mir trotzdem aus dem Hauptprogramm und bleibt dann für immer 
und ewig in der ISR hängen, weil eben das Hauptprogramm nicht 
gleichberechtigt weiterläuft und irgendwann die Ressource wieder frei 
gibt.
Persönliche Seite #547268
Lesenswert?
• ▲
▼
Korrekt erkannt.

Du musst dir überlegen, was mit deiner Resource cmdBuffer passieren 
soll, wenn im Moment kein Zugriff möglich ist. Eine aktive Warteschleife 
in der ISR ist in der Tat tödlich.

Die Frage stellt sich derzeit auch. Angenommen printf ist dabei 
cmdBuffer auszugeben und die ISR springt an. Darf die ISR dann cmdBuffer 
selbst oder den Inhalt ändern?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.