Forum: Mikrocontroller und Digitale Elektronik Philips LPC2148 mit Keil Compiler -> zyklische tasks


von Hux (Gast)


Lesenswert?

Hallo Forum,

ich arbeite gerade mit dem oben genannten µC und Compiler. Nun habe ich 
folgendes Problem.
Da der µC absolut neu für mich ist und ich vorher viel Motorola 
programmiert habe, habe ich einige Probleme.
Die grundlegenden Funktionen klappen alle I/O Ports lesen und so weiter.
Meine Frage:
Kann ich eine "Funktion" als Beispiel hier

void test(viod)
{
   ...
}

Kann ich so eine Funktion/Task auch einer anderen Funktion/Task zyklisch 
aufrufen lassen d.h. z.B. die Funktion "test" beim Starten zyklisch alle 
300ms ausführen lassen?

Kann ich das machen? Wenn ja wie, denn ich finde dies bezüglich keine 
Informationen wie es bewergstelligen sollte.

Das ist nur ein Problem was ich momentan habe, aber dafür eine Lösung zu 
haben würde mich erstmal sehr viel weiterbringen.
Als info für euch. Ich bin das Wochenende im Kurzurlaub udn bin somit 
erst am Montag morgen wieder da.

Besten dank schonmal..

mfG
HUX

von Berti (Gast)


Lesenswert?

Entweder mit einem RTOS (FreeRTOS) oder einfach ein Timer der alle paar 
ms einen Interrupt gibt. Bei jedem Interrupt wird eine Variable 
incrementiert. Entspricht die variable einer Zeit von 300ms wird ein 
Flag gesetzt. In der Hauptschleife fragst du das flag ab. Ist das Flag 
gesetzt führst du deine Routine aus, wenn nicht -> weiterwarten...

von ARM-Fan (Gast)


Lesenswert?

>vorher viel Motorola programmiert habe...

Und, wie hast du das dort gelöst?
Das macht doch vom Prinzip her keinen Unterschied auf welchem
Rechner man das selbe Problem lösen möchte.

>Kann ich so eine Funktion/Task auch einer anderen Funktion/Task
>zyklisch aufrufen lassen d.h. z.B. die Funktion "test" beim Starten
>zyklisch alle 300ms ausführen lassen?

Irgendwie ist der Satz ein bisschen durcheinander...

von Robert T. (robertteufel)


Lesenswert?

Muss da den Vorschreibern recht geben. Wer weiss, wie er einen Mot (oder 
Freescale) Chip dazu bringt einen zyklischen Interrupt zu generieren, 
der ist auch beim ARM nicht weit weg.

Basierend auf dem Takt berechnen wie weit der Timer zaehlt in 300 ms. 
Diesen Wert in ein Compare Register schreiben.
Interrupt fuer diese Funktion freigeben.
Timer auf "0" setzen
Timer starten, der zaehlt bis der Vergleichswert erreicht ist.
Nochmals den Wert fuer weitere 300 ms auf den Vergleichswert addieren 
und als neuer Vergleichswert reinschreiben. (Ueberlauf beruecksichtigen)
Im Interrupt die gewuenschte Funktion ausfuehren, kann natuerlich auch 
noch weitere Funktionen aufrufen aber das waere ausserhalb des 
Interrupts besser aufgehoben.

p.s. falls 1 sekunde auch geht, einfach die RTC nehmen ;-)

Robert

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.