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
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.
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#G6Ep8CykHQY/uart_test/taskhandler.S&q=%2Bmsp430%20%2Btaskhandler&d=1 Das dürfte deinem Beispiel 2. entsprechen.
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.
@ 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
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...
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.
@ 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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.