2012-11-18 6 views
5

Ich versuche, eine Hobby-Roboter-Bibliothek (Windows und Linux) zu schaffen, die harte Echtzeitfähigkeiten hat. Es sollte in der Lage sein, sich über Standard-Ethernet mit einem Mikrocontroller zu verbinden, Firmware auf dieses Gerät hochzuladen, über einen Feldbus mit anderen Geräten zu verbinden und Firmware auf diese anderen Mikrocontroller hochzuladen, auf denen dedizierte Controller laufen. NICs werden von RTnet unterstützt, wenn harte Echtzeit gewünscht wird. Ich möchte typische Servo-Raten von mindestens 1 kHz, vorzugsweise 2 kHz oder höher. Es wird ein vollständig benutzerdefiniertes Protokoll (nicht TCP oder UDP über IP) ausgeführt, so dass der Overhead minimal ist und der Hochgeschwindigkeits-Feldbus gesättigt werden kann, während keine Rahmen empfangen oder gesendet werden. Die Payload im Ethernet-Frame kann dann interpretiert oder an angeschlossene Geräte gesendet werden.Portable harte Echtzeit C oder C++ Roh-Ethernet-Protokoll-Bibliothek

1) Ich bevorzuge, das Protokoll in C++ zu behalten, aber weiß, dass die Verwendung des Schlüsselwortes "new" nicht für die Echtzeitprogrammierung funktioniert. Welche anderen Einschränkungen wird es geben, wenn ich die C++ - Sprache verwende, anstatt das Projekt in C umzuwandeln? Empfehlen Leute Bücher oder Webseiten, die C++ lehren und harte Echtzeittermine einhalten? Ich glaube, es ist möglich, und ich hoffe, in der Lage zu sein, mit C++ zu arbeiten, weil das Orocos-Projekt Echtzeit-C++ verwendet. Ich würde es vorziehen, keinen C-Code zu verwenden.

2) Um die portable Protokollbibliothek für allgemeine Zwecke zu halten, wie sollte das Programm das Protokoll verarbeiten, das gleichzeitig auf einem Nicht-Echtzeit-Ethernet-Adapter und einem RTnet-Ethernet-Adapter ausgeführt wird?

Eine spezielle Frage, die ich habe, wäre eine Frage über eine tragbare Mutex-Klasse, die entweder einen Boost oder einen Xenomai-Mutex verwenden kann.

Lösung 1 zu Problem 2 könnte Folgendes sein: Wenn die Anwendung auch mit den Xenomai-Bibliotheken kompiliert wurde, könnte ein Mutex mit einem booleschen Flag erstellt werden, um anzugeben, welche Methoden (Boost oder Xenomai) zur Laufzeit umgebrochen werden zum Sperren und Entsperren. Es könnte den Boost-Mutex und einen Xenomai-Mutex enthalten, wenn die Bibliothek für Xenomai kompiliert wurde. Ich mag diese Lösung nicht, denn wenn das Projekt für Xenomai kompiliert wird, wird es private Variablen eines Mutex für Boost und Xenomai enthalten, was wie eine weniger elegante Art erscheint, als nur den Mutex zu haben, den man braucht.

Lösung 2 zu Problem 2 könnte Folgendes sein: Schreibe 2 verschiedene abgeleitete Klassen von einer abstrakten Klasse reiner virtueller Schnittstellenmethoden zum Mutex, einen für Boost und einen für Xenomai. Ich mag diesen Weg besser, aber dann zu sagen, welche Klasse zur Laufzeit zu verwenden ist umständlich. Ich müsste vielleicht Pools mit Boost und Xenomai Mutexe haben. Sind das die meisten harten Echtzeit-C++ - Programme, die das Problem angehen?

Ich habe dieses Problem mit mehr als nur einem Mutex, möchte aber Feedback erhalten, da ich von Anfang an keine schlechten Designmuster replizieren möchte.

3) Ich glaube, TwinCAT von Beckoff lässt EtherCAT in Echtzeit unter Windows 7 laufen. Gibt es etwas, das nicht erreichbar wäre, wenn der Hobbyist mindestens einen NIC mit harter Echtzeit unterstützt? unter Windows 7 oder später? Vielleicht gibt es ein Open-Source-Hypervisor-Projekt.

4) Wie laden die Benutzer das System, so dass ihre Quad-Core-Computer 100% von jedem der Kerne verwenden, so dass sie erkennen können, ob ihr System nicht in harter Echtzeit läuft?

+1

Sie sollten dies in kleine, knappe Fragen aufteilen. Das ist zu viel zu verdauen. –

+1

Welche Schicht des Netzwerkstapels spezifiziert Kollisionserkennung und -vermeidung? Es fällt mir schwer zu sehen, wie ein System, das die übliche Random-Wait-CD/CA verwendet, harte Echtzeit-Garantien geben kann. – dmckee

+2

Um etwas "harte Echtzeit" zu tun, brauchen Sie ein "hartes Echtzeit" Betriebssystem. Weder Windows noch Linux gehören zu dieser Kategorie. –

Antwort

2

Ein Detail: Wenn Sie einen 1-kHz-Refresh-Zyklus für Servos wünschen, warum verwenden Sie harte Echtzeit? Weiche Echtzeit (dh als root ausführen, aber reinen Userspace, aber setze Scheduler-Policy auf FIFO-Levels für diesen Prozess, sperre alles in den Speicher, deaktiviere swapspace ...) und du wirst leicht 1khz davon bekommen, ohne einen einzigen zu verpassen Nachricht in einem ganzen Jahr des Laufens.

Verwenden Sie an diesem Punkt einfach einen Raw-Socket für Ihr Ethernet-Protokoll und rufen Sie es einen Tag.

Zur nicht verwandten Frage ethernet CD/CA sind in der heutigen Hardware implementiert. Ignorier Sie einfach.

+0

Dies war hilfreich, um mit weicher Echtzeit zu beginnen. In der Regel arbeitet es mit <100 μS Latenzen beim Ausführen von Hintergrundprozessen. Harte Echtzeit funktioniert jetzt und Xenomai mit RTnet scheint eine Obergrenze von etwa 50 μs zu haben, ohne viel an den Kernel-Einstellungen zu arbeiten. – Edward

Verwandte Themen