Forum: Mikrocontroller und Digitale Elektronik Bewertung Programmierstrategie


von Christian (Gast)


Lesenswert?

Hey,

ich programmiere schon etwas länger, habe Softwarearchitektur aber nie 
richtig "gelernt".

Mein Vorgehen ist idR so, dass ich einen einen Timer einrichte, welcher 
in seiner gering priorisiertem ISR das Programm abarbeitet. Die nicht 
genutzte Zeit dümpelt er in while als idle rum. Bisher bin ich immer 
sehr gut damit gefahren (mache aber auch keine Raketenwissenschaft). Es 
handelt sich meist um Steuerungsaufgaben mit Zugriff auf Peripherie. 
Sofern möglich lasse ich diese autono per DMA arbeiten, sodass wenige 
Vordergrundrechnung notwendig ist. Die Zykluszeit lege ich anhand der 
Komplexität der Berechnung und der Notwendigkeit feste. Ich wehre mich 
immer noch gegen den Einsatz von zB freeRTOS weil ich meine Timings 
gerne selbst in der Hand habe.

Was sagt ihr dazu?

von Platinen Frickler (Gast)


Lesenswert?

Mache ich oft genauso. Ich verwende oft eine Kombination von Timer ISRs 
mit State Machines um den Programablauf im Time Slice Modus vollkommen 
unblockierend zu gewährleisten. Wenn man sich an diesen Programmierstil 
einmal gewöhnt hat, laufen solche Programme viel schneller als mit RTOS. 
Speziell bei bescheideneren uC lohnt sich das sehr. Die Programm Logik 
besteht dann nur noch aus Logik Evaluationen die die Funktionalität 
entsprechend steuern. Ist extrem zuverlässig und leicht erweiter- und 
veränderbar.
Works for me!

von Stefan F. (Gast)


Lesenswert?

Christian schrieb:
> Was sagt ihr dazu?

Das ist eine von mehreren gängigen Vorgehensweisen. Für mich spricht 
nichts generelles dagegen.

von J. -. (Gast)


Lesenswert?

Christian schrieb:
> ich programmiere schon etwas länger, habe Softwarearchitektur aber nie
> richtig "gelernt".
[..]
> Was sagt ihr dazu?
Hier genauso.
Ich habe mal mit Nut/OS experimentiert, habe aber dann fast zwangsläufig 
(oder zwanghaft ;-) ) einen Systick-Timer programmiert. Am Schluß war es 
ein Mix aus Threads und diesem Timer als Hauptbestandteil. War weniger 
Sinn der Sache...
Kompliziert wird es z.B. bei lwip ohne OS. Da kann man apps (z.B. sntp) 
erst nach Umschreiben nutzen, und viele Beispiele beziehen sich auf 
OS-gestützte Umgebungen. Da muß man etwas basteln.

von Dunno.. (Gast)


Lesenswert?

Statemachines mit kooperativem Multitasking in der Main.

Für alles was getimed laufen muss, einen systick Timer den diese 
Machines auswerten. Klar, nicht deterministisch, aber meist ist das auch 
egal..

Harte Echtzeit dann natürlich per ISR zb mit gesondertem Timer, 
ringbuffer die die Tasks befüllen etc..

von Marten Morten (Gast)


Lesenswert?

Christian schrieb:
> Die nicht
> genutzte Zeit dümpelt er in while als idle rum.

Wenn das heißt du lässt ihn in einer Schleife kreisen, dann kann man das 
je nach Prozessor und Aufgabe etwas verbessern. Man legt den Prozessor 
in eine Sleep-Modus und lässt ihn durch einen IRQ aufwecken wenn es 
wieder was zu tun gibt.

von MaWin (Gast)


Lesenswert?

Christian schrieb:
> Was sagt ihr dazu?

Die Hauptschleife muss und sollte nicht leer sein.

Nur Sachen die zu einer bestimmten Zeit stattfinden müssen, in deiner 
Timer-Routine, bzw. in davon abgeleiteten zeitlich seltener aufgerufenen 
Funktionen, superkurz, superschnell, ggf. sogar Assembler.

Z.B. Anzeige Multiplex, Tastenabfragen, Schrittmotorpulse.

Andere Interrupts (Pin-Change, ADC Wandler fertig, Serielle 
Schnittstelle Puffer leer) bekommen andere Interrupt-Funktionen, die 
jeweils schnell fertig sein sollten.

Zeitunkritische Funktionen in der Programm-Hauptschleife, die kurzzeitig 
durchlaufen werden sollte (ich benutze sie meist zum zurücksetzen des 
Watchdog, es darf also keine Aktion länger as z.B. 1 sec dauern), und 
immer nur einen kleinen Job zu tun haben, sich aber an Variablen 
orientiert, die von den Interrupt-Routinen gesetzt werden.

Prinzip Microsoft Windows:

Das Programm läuft in der GetMessage Loop, die Hardware macht Interrupts 
und bedient die Puffer zwischen Programm und Interface, z.B. legt der 
Tastatur-Interrupt den Tastencode in einem Tastaturpuffer ab, inklusive 
Zeitstempel, und die nachfolgenden Routinen entnehmen daraus wenn 
benötigt, nicht mehr zeitsynchronisiert machen sie z.B. Umsetzung 
Tastencode in Zeichen, drücken und loslassen mit shift, all das ist 
nicht mehr zeitkritisch und wird vom Aufrufer, nicht der 
Interrupt-Routine gemacht.

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.