Forum: Compiler & IDEs Wie programmiert man Echtzeitfähiges mit Linux auf dem ARM9


von Ulrich (Gast)


Lesenswert?

Servus,

ich überlege für meine nächste Bastelei (auch um meinen geistigen 
Horizont zu erweitern...) den "EP9302 ARM Webserver" einzusetzen. Es 
handelt sich hierbei um einen 200Mhz getakteten ARM9 für den es fertige 
Linux Images gibt, dazu hätte ich ein paar Fragen doch erstmal noch ein 
bissele bla,bla

Kurz zu meinen Kenntnissen(neuerdings auch skillmap genannt):
AVR      behersche ich sehr gut
AVR-GCC  behersche ich sehr gut
ARM      noch nie angefasst. Das ganze mapping vom Speicher usw. kenne 
ich soo nicht. (geht beim AVR alles automatisch...)
Linux    Kenne ich nur als Konsole...und kann auch Kernel 
compiliern/patchen usw...

Für Meine nächste Bastelei wollte ich eigentlich einen Atmega einsetzen. 
Aber ich habe erkannt das es es nicht schafft 15 Beschleunigungsvektoren 
im 3D Raum mit 20KHz "zu drehen", richtig oder?

Da ich noch ein Spartan3-Board da habe, habe ich mir überlegt eventuell 
mit diesem die ganzen Berechnungen auszulagern.(Per 8Bit-Bus anbinden) 
Hab sowas noch nie gemacht, aber dass könnte funktionieren? Um Antwort 
in diesem Punkt wird gebeten.

Prinzipiell fände ich so einen ARM9 auch mal trendy. Habe aber Bedenken, 
dass es mir zu schwierig wird. Außerdem gibts noch ein paar Sachen wo 
ich unsicher bin. Dies wäre folgendes:
- Kann ich z.B. einfach so ein Linux-Image draufschieben und dann einen 
WLAN-Stick reinschieben und dann per Telnet vom Laptop aus zugreifen?
- Kann ich einen USB-Stick, oder SD-karte mit FAT32 problemlos mounten 
und ganz "normal" unter Linux drauf zugreifen? (OK das geht sicherlich, 
aber gehts es von haus aus oder muss ich da noch irgendwas selber dazu 
programmieren???)
- Kann ich z.B. einen 1GB USB-Stick anschließen und dann per 
Croscompiler(nennt man doch so?) ein Programm schreiben dass mir 
irgendeinen Eingang in eine Textdatei auf dem USB-Stick mitlogt?
- Ich kann auf dem ARM ja sowohl mein Programm "direkt" programmieren 
und so programmieren dass es vom Kernel als normales 
Programm(multitasking) ausgeführt wird. Verwendet man für beides den 
gleichen Compiler?
Da das ganze mit 20KHz ablaufen soll, wird die Echtzeitanforderung schon 
ein bissele härter. D.h. ich kann mir nicht vorstellen dass noch alles 
funktioniert wenn ich nebenher irgendwelche daten vom USB-Stick auf die 
SD-carte kopieren würde. Deshalb die Frage wie programmiert man auf der 
untersten Ebene und gleichzeitig soll Linux laufen? Muss ich einen 
eigenen Taskmanager schreiben der noch vor dem, des Linux-Kernels 
aufgerufen wird? Oder ist es möglich wie bei rt-linux das ich ein Modul 
nachladen kann? Am liebsten wäre es wenn ich vollen Zugriff haben könnte 
ohne am eigentlichen Kernel was zu ändern. Geht das? Wo gibts genau über 
sowas Informationen. Habt ihr ein paar Links?
Angenommen ich kann nach dem rt-Linux Prinzip irgendeine Funktion 
echtzeitfähig ausführen lassen. Kommt dass dann aus Performancesicht 
genau gleich(auch Codemässig) wie wenn ich einen kompletteigenen 
Taskmanager schreibe der in der immer meine Funktion ausführt und 
ansonsten immer Linux_poll(void) startet ;-) ???????

Mit freundlichen Grüßen
Ulrich

von Peter (Gast)


Lesenswert?

Ich bin absolut kein Linux-Experte, ich habe aber neulich mit jemandem 
zum Thema Linux auf dem ARM9 und Echtzeit Applikation diskutiert. 
(VoIP-Signal prozessing für Voice-Komprimierung und Echokompensation)

Das Resultat, soweit ich es verstanden habe: Ein Task mit hoher 
Echtzeit-Anforderung dar bei Linux nich als Applikations-Task laufen, 
sondern muss in den Kernel eingbunden (compiliert) werden. Dann geht's!

MfG  Peter

von Rolf Magnus (Gast)


Lesenswert?

> - Kann ich z.B. einfach so ein Linux-Image draufschieben und dann einen
> WLAN-Stick reinschieben und dann per Telnet vom Laptop aus zugreifen?

Das kommt auf dein Linux-Image an. Es muß halt einen Treiber für den 
Wlan-Stick haben, und es muß die ganze Konfiguration für's Wlan 
enthalten. Linux kann (meines Wissens) auch nicht aus dem Flash 
gestartet werden, also brauchst du einen Bootloader, der den Kernel ins 
RAM kopiert.
Ich würde erstmal mit RS232 anfangen, um nicht unnötig viele potenzielle 
Fehlerquellen einzubauen. Damit kannst du auch eine Remote-Shell machen. 
Außerdem kannst du die auch schon vorher im Bootloader ansprechen, um 
Debug-Ausgaben zu schreiben.

> - Kann ich einen USB-Stick, oder SD-karte mit FAT32 problemlos mounten
> und ganz "normal" unter Linux drauf zugreifen? (OK das geht sicherlich,
> aber gehts es von haus aus oder muss ich da noch irgendwas selber dazu
> programmieren???)

Sofern es einen Treiber für den USB-Controller gibt, sollte das 
funktionieren. Du mußt nur bei der Kernelkonfiguration die dafür nötigen 
Treiber aktivieren.

> - Kann ich z.B. einen 1GB USB-Stick anschließen und dann per
> Croscompiler(nennt man doch so?) ein Programm schreiben

Du schreibst das Programm nicht per Crosscompiler, sondern übersetzt es 
damit. Schreiben tust du's eher im Editor.

> dass mir irgendeinen Eingang in eine Textdatei auf dem USB-Stick
> mitlogt?

Ja.

> - Ich kann auf dem ARM ja sowohl mein Programm "direkt" programmieren
> und so programmieren dass es vom Kernel als normales
> Programm(multitasking) ausgeführt wird. Verwendet man für beides den
> gleichen Compiler?

Was meinst du mit "direkt"? Meinst du ohne Betriebssystem? Das sollte 
mit dem gleichen Compiler gehen. Du mußt allerdings ein Linkerskript für 
die Variante ohne Betriebssystem schreiben.

> Da das ganze mit 20KHz ablaufen soll, wird die Echtzeitanforderung
> schon ein bissele härter.

Evtl. mußt du eine echtzeitfähige Kernelversion verwenden.

> D.h. ich kann mir nicht vorstellen dass noch alles funktioniert wenn
> ich nebenher irgendwelche daten vom USB-Stick auf die SD-carte kopieren
> würde.

Kommt drauf an. Wenn deine Kopiererei eine niedrige Priorität hat, läuft 
sie nur, wenn dein Echtzeittask gerade nix tut.

> Deshalb die Frage wie programmiert man auf der untersten Ebene und
> gleichzeitig soll Linux laufen?

Linux ist schon die unterste Ebene, wenn du nicht gerade mit 
Virtualisierung arbeiten willst ;-)
Du kannst natürlich einen Kerneltreiber schreiben.

> Am liebsten wäre es wenn ich vollen Zugriff haben könnte
> ohne am eigentlichen Kernel was zu ändern. Geht das?

Was meinst du mit "ohne am eigentlichen Kernel was zu ändern"? Willst du 
auch kein Modul schreiben? Dann geht es nicht.

Du kannst natürlich auch was anderes als Linux nehemen und das Programm 
ohne Betriebssystem schreiben. Als Scheduler kannst du z.B. FreeRTOS 
verwenden. Allerdings mußt du dann auch alle Treiber selbst schreiben.

von Bartli (Gast)


Lesenswert?

> Muss ich einen eigenen Taskmanager schreiben der noch vor dem,
> des Linux Kernels aufgerufen wird?

Nein. Gibt es schon, zum Bleistift RTAI. Das ist eine Art Realtime 
Scheduler welcher eine Reihe von Tasks verwaltet und vor dem Linuxkernel 
sitzt (den wiederum verwaltet RTAI als Task mit der niedrigsten 
Priorität).

von Ulrich (Gast)


Lesenswert?

Vielen Dank für die Antworten,

Ich habe zwar den Schalplan noch nicht genau gelesen, aber ich denke das 
ich zusätzliche SPI-Devices anschließen kann. Angenommen ich will im 
Kernel-Space oder auch User-Space auf ein Device zugreifen, wie geht das 
dann? Eventuell überträgt ja gerade irgendein anderes Modul vom Kernel 
was an die SD-Karte? Müsste ich in diesem Fall einfach die komplette 
Kontrolle vom SPI an mich reißen und das bisherige Modul welches über 
SPI, mit der SD-Karte kommuniziert so umschreiben das die Daten über 
mein Modul auf die Karte umgeleitet werden?

von Bartli (Gast)


Lesenswert?

Das lässt sich so nicht einfach beantworten, dazu müsstest du wissen, ob 
du in deinem Linux eine Art Lowlevel SPI Treiber hast, oder ob dein 
SD-Treiber direkt auf der SPI-Schnittstelle sitzt.

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.