www.mikrocontroller.net

Forum: Compiler & IDEs MSP430: Unterbrechbare Tasks und Taskhandling programmieren


Autor: Blub (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Da das hier ja ein recht kompetentes Forum ist, hoffe ich das ihr mir 
weiter helfen könnt.
Ich bräuchte für meine Firmware ein Taskhandling. Der Taskhandler sollte 
3 Priorätatsstufen können (1-3). Prio 0 sind HW-Interrupts des MSP430.
Ein Task sollte durch einen mit einer höheren Priorität unterbrechbar 
sein.

Könnt ihr mir Tipps geben, wie man so etwas programmiert?
Bin für jeden hilfreichen Tipp dankbar: Codebeispiele, Links, Literatur, 
...

Viele Grüße
Blub

Autor: Michael H. (overthere)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du dich schon mal mit der MSP-Architektur auseinandergesetzt? 
Möchte nicht unhöflich sein, aber ich denke dass du das bisjetzt 
nochnicht gemacht hast. Also das bitte als erstes Nachholen.
Einen Taskhandler zu schreiben geht in verschiedenen Strukturen.
1. Statisch: Einfach eine while-Schlife die Tasks abfragt (das dürfte 
der MSP430 gerade noch schaffen.
2. Dynamisch: Du hast einen riesigen Array in dem du die Tasks 
hinzufügst, die Prio setzt und den Task dann immer ausführst, der am 
längsten über der Zeit ist, bzq. der die höchte Prio hat. Alleine 
Memorytechnisch könnte das schon eng werden.
3. Dynamisch mit unterbrechung: Du hast die möglichkeit Tasks zu 
unterbrechen, und solange etwas anderes auszuführen. Du musst alle 
Zwischenregister zwischenspeichern und die neuen laden. Um es kurz zu 
machen: Lass es, dafür ist der MSP430 viel zu low-Power und hat auch 
zuwenig ram.
Also unter 2kB Ram würde ich den Versuch von Version 2 erst garnicht 
starten. Auch hast du extremes Scheudling-Overhead da die ganzen Tasks 
auch gehegt und geflegt werden wollen. (ca. 10% der Rechenzeit sind 
typisch).

Muss jeder für sich selbst abklären, ob er sowas braucht... Ich habe das 
ganze mal witzweise für einen AVR probiert, und bin für mich zu dem 
Schluss gekommen, dass es einfach enorme Rechenzeitverschwendung ist. 
But just my 2 cents.

Autor: Blub (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael H. schrieb:
> Hast du dich schon mal mit der MSP-Architektur auseinandergesetzt?
>
> Möchte nicht unhöflich sein, aber ich denke dass du das bisjetzt
>
> nochnicht gemacht hast. Also das bitte als erstes Nachholen.

Verzeih meine doofe Rückfrage, aber was hat denn die Architektur mit der 
Implementierung eines Taskhandlers zu tun?

Hab bei meiner Onlinerecherche diesen Code für einen Taskhandler auf dem 
MSP gefunden:
http://www.google.com/codesearch/p?hl=de#G6Ep8CykH...

Das dürfte deinem Beispiel 2. entsprechen.

Autor: Michael H. (overthere)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ein Taskhandler doch nicht ganz selten aufgerufen wird, sollte man 
wissen wie man etwas in der Architektur implementiert. Z.b. wie man 
unnötige Branches, etc. vermeidet.
Ich denke dein oberes Code-Beispiel ist sehr gelungen. So shiftet er die 
Register immer eins rüber und wertet das mit dem Carry aus.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Blub (Gast)

>Verzeih meine doofe Rückfrage, aber was hat denn die Architektur mit der
>Implementierung eines Taskhandlers zu tun?

Die verfügbaren Ressourcen Speicher und CPU-Leistung.

Ich empfehle für sowas kooperatives Multitasking, klein und schnell.
Braucht aber etwas Hirnschmalz.

MfG
Falk

Autor: Blub (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann frage ich mal anders herum:
Das abarbeiten von hW-Interrupts hat die höchste Priorität.
Da muss ich ja an der Software nichts ändern.
Für den Ablauf des Programs ist es aber am wichtigsten, dass die 
empfangenen Daten abgearbeitet werden und das vor allem anderen.

Klar könnte ich die Daten gleich in der ISR von UART RX arbeiten. Aber 
dann verpasse bzw. verarbeite einige HW Interrupts verzögert. Und wenn 
ich GIE in der RX ISR aktiviere ist schon vorgekommen, dass mein Stack 
überläuft, weil er dann anfängt zwischen einigen ISR hin und her zu 
springen...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Blub schrieb:
> Dann frage ich mal anders herum:
> Das abarbeiten von hW-Interrupts hat die höchste Priorität.

Was meinst du damit genau? Interrupt-Handler werden nicht vom Scheduler, 
sondern vom Prozessor selbst aufgerufen. Oder willst du noch pro 
Interrupt einen separaten Task machen, um länger dauernde Sachen aus der 
ISR rauszubekommnen?

> Für den Ablauf des Programs ist es aber am wichtigsten, dass die
> empfangenen Daten abgearbeitet werden und das vor allem anderen.

Was wäre "allem anderen" denn genau?

> Klar könnte ich die Daten gleich in der ISR von UART RX arbeiten. Aber
> dann verpasse bzw. verarbeite einige HW Interrupts verzögert. Und wenn
> ich GIE in der RX ISR aktiviere ist schon vorgekommen, dass mein Stack
> überläuft, weil er dann anfängt zwischen einigen ISR hin und her zu
> springen...

Das klingt, als sei dein Prozessor bereits übel an der Lastgrenze. 
Multitasking wird die Gesamtlast nur erhöhen. Das würde dir nur was 
bringen, wenn dein Prozessor einen großen Teil der Zeit damit 
beschäftigt ist, irgendwas unwichtiges zu machen, das auch gerne etwas 
langsamer gemacht werden könnte. Und auch dann gibt es meist 
Möglichkeiten, das ohne Multitasking zu lösen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Rolf Magnus (Gast)

>> Klar könnte ich die Daten gleich in der ISR von UART RX arbeiten. Aber
>> dann verpasse bzw. verarbeite einige HW Interrupts verzögert. Und wenn
>> ich GIE in der RX ISR aktiviere ist schon vorgekommen, dass mein Stack
>> überläuft, weil er dann anfängt zwischen einigen ISR hin und her zu
>> springen...

>Das klingt, als sei dein Prozessor bereits übel an der Lastgrenze.

Glaub ich eher nicht, klingt eher nach Panik. Aber es ist ja unüblich 
geworden, mal konkret ein Problem zu beschreiben ala Netiquette.

MfG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Blub schrieb:
> Und wenn
> ich GIE in der RX ISR aktiviere ist schon vorgekommen, dass mein Stack
> überläuft, weil er dann anfängt zwischen einigen ISR hin und her zu
> springen...

Natürlich muß man vorher den eigenen Interrupt deaktivieren.

Am besten ist natürlich eine CPU mit Interruptprioritäten zu nehmen. 
Z.B. haben viele 8051 4 Interruptprioritäten. Man muß nichts weiter 
machen, als zu Anfang die Priorität festzulegen, den Rest macht dann die 
Hardware. Es kann dann nur maximal 4 Instanzen Interrupts geben, ein 
Stacküberlauf ist nicht möglich.
Mit dem Main hat man insgesamt 5 Ausführungslevel, wo der höherwertige 
alle niederwertigeren jederzeit unterbrechen kann.


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.