Hallo, weiß vielleicht jemand wo ich eine Idee für eine zeitbasierende Softwarearchitektur herbekomme? Meine Aufgabenstellung ist eine Softwareplattform für einen mobilen Roboter zu entwickeln, in die später eine Intelligenz implementiert werden kann, um z.B. durch ein Labyrinth zu fahren. Vielen Dank im voraus! Gruss Frank
Hallo, meinst Du so etwas wie ein Scheduler? http://www.mikrocontroller.net/forum/read-1-240578.html http://www.mikrocontroller.net/forum/read-4-49709.html http://www.mikrocontroller.net/forum/read-4-157624.html oder gleich ein RTOS: http://www.avrfreaks.net/index.php?module=FreaksTools&func=viewItem&item_id=489 Grüße Quark
Hallo, hab mich vielleicht ungenau ausgedrückt, ich versuchs nochmal. Die Architektur muss ganz grob so aussehen: Schleifenbeginn: 1. Einlesen der Sensoren 2. Programmanager, der wenn Änderungen der Sensorwerte vorliegen, die Fahrtprogramme anspricht, z.B. bei Hindernis Kurve fahren oder halten. 3. Idlefunktion, die eine gewisse Zeit verbrät, damit jeder Schleifendurchlauf gleichlang ist. Die Zeitbasis soll mit einem Timer, der onboard ist realisiert werden. Zeit für einen Schleifendurchlauf: ca. 1ms Schleifenende: Feste Zeitbasis ist erforderlich für die später zu implementierende Intelligenz. Gruss Frank
Naja, da hast du doch deine Idee schon selber! Den Timer kriegst du über einen Interrupt hin. Im Timer kannst du z.B. Flags setzen, damit du zu bestimmten Zeiten bestimmte Sachen erledigen kannst oder damit du weißt, wann ein Schleifendurchlauf zu Ende sein muss. Nun fehlt dir nur noch der Code;-) Was brauchst du denn nun noch?
Das ganze nennt sich schlichtweg Mainloop, also einfach so programmieren, wie Du es geschrieben hast. Programmmanager kann im einfachsten Falle eine switch-Anweisung sein oder eine Tabelle mit Funktionspointern, die per Index ausgewählt werden. Und die Idle-Funktion wartet, bis ein Bit (volatile) im Timerinterrupt nach Ablauf einer bestimmten Zeit gesetzt wurde und löscht es. Peter
Wenn du eine sequentielle Architektur verwendest hast du später wahrscheinlich Probleme mit dem Einbau weiterer Funktionalität, wenn du zB auf mehrere Sensoren reagieren sollst. Genau aus diesem Grund gibt es auch Multitasking kernels. Der übernimmt für dich das timer handling, und stellt in meinem Fall eine 250ns Zeitbasis zur Verfügung. Beginnen wir mal ganz am Anfang: Welchen Roboter verwendest du, bzw welchen uC setzt du ein? Danach richtet sich das ganze Entwicklungsumfeld.
Einen Roboter zu bauen bedeutet eben nicht nur meschanische Baugruppen zusammenzufügen. Die Programmierung und Elektrik ist ein ganz wesentlicher Bestandteil eines solchen Projektes. Das übersehen die meisten diplom-Germanisten, die sich sagen "och, heute mach ich mal was mit Robotern" Eine fertige Software, die man nur noch bedienen muss, gibt es für solche Projekte nicht. Die muss man sich in der Regel selber schreiben.
@mark struberg > Genau aus diesem Grund gibt es > auch Multitasking kernels. Der übernimmt für dich das timer handling, > und stellt in meinem Fall eine 250ns Zeitbasis zur Verfügung. 250ns Taskwechsel, wow !!! Kannst Du mal näher sagen, welche Hammer-CPU da werkelt ? Ist aber bestimmt nichts für Batteriebetrieb. Super fixe Sachen mache ich immer direkt, da ja sonst die CPU zu 99% nur mit Register retten beschäftigt ist. Bisher habe ich aber nur Zeiten von 5µs aufwärts benötigt, 250ns sind ja für nen AVR doch zu heftig. Den Scheduler nehme ich nur für langsame Sachen im ms-Bereich, da dann der Softwareoverhead nicht so ins Gewicht fällt. Peter
oops sorry, natürlich 250uS und nicht ns (o)(O), aber ich schrieb auch nichts von taskwechsel, sondern von timebase ;) Der Taskwechsel verbraucht etwa 65 instructions, also 8uS (alles bei 8MHz). Dh bei einem sleep(1) wird der task 4000 mal pro Sekunde getriggert, (was meist ausreicht).
Ich verwende einen Philips 32bit LPC2129. Der Roboter ist ein bei Conrad bestelltes Fahrgestell zu der mein Kommiltone eine Antriebsplatine macht. Ich muss also zwei PWM Signale ausgeben für Motor links und Motor rechts (Es handelt sich um ein Kettenfahrzeug) und zwei Signale für vorwärts/rückwärts. Die Sensoren sollen vorerst außen vorgelassen werden, da sonst die Zeit nicht reicht.
> Ich verwende einen Philips 32bit LPC2129 Also Speicher satt, da würde ich FreeRTOS als Basis verwenden. > Ich muss also zwei PWM Signale ausgeben Das kann die PWM-Unit der LPC selbständig, ohne daß du softwaremäßig einen PIN toggeln mußt. Timer0 verwendet RTOS Timer1 als PWM set/clear on match für linken Antrieb PWM-Timer als PWM set/clear on match für rechten Antrieb Im Endeffekt berechnest du in deinem main-task nur mehr die von den PWMs zu zählenden Schritte und stellst sie in die Steuerregister der PWM rein. Rein theoretisch kann man sogar beide Antriebsmotoren mit dem PWM-Timer antreiben, aber da ist ein wenig Hirnschmalz notwendig.
weiß vielleicht jemand, wo ich genauere Informationen über RTOS bekomme, auch in Verbindung mit dem LPC2129 von Philips?
Weitere: http://picoos.sourceforge.net/index.html [An sich nicht übel, aber problematische Organisation vom Sourcecode, und ein schöner Beispiel, wie man mit reichlich Einsatz des Preprocessors jeden Code vernichtet kriegt] http://usmartx.sourceforge.net/
Suche zu dem besagten LPC2129 einen kompletten instruction set. In meinem Handbuch sind immer nur einzelne Befehle erwähnt und die nicht vollständig. Weiß jemand wo den herbekommen kann?
Hallo Hab noch mal Fragen bezüglich RTOS, wieviel Tasks kann ich gleichzeitig bearbeiten? Sind Treiber für Timer, PWM-Modul usw. vorhanden? Konnte es auf den genannten Links nicht herauslesen. Gruss Frank
Die komplette ARM Beschreibung gibt's m.W. nur auf recht teurem Papier, das ARM ARM. Die gängigen kostenlosen RTOS sind hinsichtlich I/O-Modulen sparsam. UART ist bisweilen drin, aber mehr ist nicht zu erwarten. Ist nicht die Aufgabe vom RTOS, und zudem hochgradig maschinenspezifisch.
Ein bisschen ARM-Beschreibung kann man sich im PDF-Format herunterladen: http://www.arm.com/documentation/ARMProcessor_Cores/index.html Da dann beispielsweise das "ARM7TDMI-S (Rev 4) Technical Reference Manual" http://www.arm.com/pdfs/DDI0234A_7TDMIS_R4.pdf
Heißt das, dass ich das FreeRTOS ohne weiteres gar nicht benutzen kann? Sind Treiber für den Timer im Internet verfügbar? Wieviele Tasks gleichzeitig schafft das FreeRTOS?
Der Gnu-Compiler in HiTOP5 von Hitex nimmt "__irq" als Erweiterung einer Funktion nicht an. In uVision von Keil kann ich mein Testprogramm compilieren. Hat jemand eine Idee wie ich den Code abändern muss, damit es auch mit dem Gnu Compiler funktioniert?
Habe ein Problem mit der Interrupt Service Routine. Diese soll mit einer festen Zeitbasis von 1ms ständig aufgerufen werden. Im Simulator lief das Ganze wunderbar, auf dem Controller wird die Routine einmal aufgrufen und dann gar nicht mehr. Der Interrupt wird von einem Timer ausgelöst. Mir ist aufgefallen das der Timer nach der Init gar nicht richtig läuft. Die Register (Prescaler, Timer Counter) nehmen rein zufällige Werte an, wie kann das sein? Warum wird die Routine dann überhaupt einmal aufgerufen?
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.