mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Softwarearchitektur


Autor: Frank R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: larsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
??? Versteh' ich nicht.

Autor: Quark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: larsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Mark Struberg (struberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Niels Huesken (monarch77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Mark Struberg (struberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Mark Struberg (struberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Frank Riever (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weiß vielleicht jemand, wo ich genauere Informationen über RTOS bekomme,
auch in Verbindung mit dem LPC2129 von Philips?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
www.freertos.org

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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/

Autor: Frank Riever (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Frank Riever (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein bisschen ARM-Beschreibung kann man sich im PDF-Format
herunterladen:
http://www.arm.com/documentation/ARMProcessor_Core...

Da dann beispielsweise das "ARM7TDMI-S (Rev 4) Technical Reference
Manual"
http://www.arm.com/pdfs/DDI0234A_7TDMIS_R4.pdf

Autor: Mark Struberg (struberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für freertos gibt es glaube ich auf der LPC2000 Yahoo Group Seite einige
IO module zum download.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Frank (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Frank Riever (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.