Philips LPC2148 mit Keil Compiler -> zyklische tasks

Gast #714740
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
Gast #714747
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...
Gast #714751
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...
#715226
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

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.