2012-04-02 6 views
7

Ich implementiere einen benutzerdefinierten seriellen Bus-Treiber für eine bestimmte ARM-basierte Linux-Platine (eigentlich ein benutzerdefinierter UART-Treiber). Dieser Treiber muss die Kommunikation mit einer bestimmten MCU am anderen Ende des Busses über ein benutzerdefiniertes Protokoll ermöglichen. Der Treiber wird nicht (und tatsächlich muss nicht) keine seiner Funktionen dem Benutzerbereich aussetzen, noch ist es möglich, es im Benutzerbereich überhaupt zu implementieren (daher die Notwendigkeit für den benutzerdefinierten Treiber anstelle des Standard-TTY-Subsystems).Implementierung korrekter Inter-Modul-Synchronisation im Linux-Kernel

Der Treiber implementiert das Kommunikationsprotokoll und UART liest/schreibt, und er muss eine Reihe von Funktionen auf höherer Ebene an seine Benutzer exportieren, damit diese mit der MCU kommunizieren können (zB read_register(), drive_gpios(), all diese Sachen) . Es wird nur einen Benutzer dieses Moduls geben.

Das aufrufende Modul muss auf den Abschluss der Operationen warten (die oben genannten read_register() und andere). Ich überlege gerade, Semaphore zu verwenden: Das Benutzermodul ruft die Funktion meines Treibers auf, die die Übertragung initiiert und auf einen Semaphor wartet; Der IRQ-Handler meines Treibers wird Anfragen an die MCU senden und die Antworten lesen und, wenn sie fertig sind, an den Semaphor senden, wodurch das aufrufende Modul aufgeweckt wird. Aber ich bin nicht wirklich vertraut mit Kernel-Programmierung, und ich bin verblüfft von der Vielzahl von möglichen alternativen Implementierungen (Tasklets? Warteschlangen?).

Die Frage ist: ist mein Semaphor-Ansatz OK oder zu naiv? Was sind die möglichen Alternativen? Gibt es irgendwelche Fallstricke, die ich vermisse?

+3

Semaphore sollten die Arbeit von dem, was ich verstehe, zu besseren Linux Interna verstehen bitte beziehen Sie sich auf nettes Buch "Linex Kernel-Entwicklung 3rd Edition", die als kostenlose PDF verfügbar ist und auf dem neuesten Stand (.39 Kernel glaube ich). Dieses Buch geht nicht wirklich tief, aber es erklärt Grundprinzipien und zeigt Optionen. Viel Spaß beim Hacken. – AoeAoe

+0

Ein schönes Buch, danke! Wenn jemand anderes interessiert ist, würde ich auch vorschlagen, Linux Drivers Development und Linux Kernel Module Development zu erwerben (beide sind online kostenlos verfügbar) –

Antwort

5

IRQ Traditionell in Linux Handhabung wird in zwei Teilen durchgeführt:

  1. genannt So "obere Hälfte" tatsächliche Arbeits in IRQ Kontext (IRQ-Handler selbst) sind. Dieser Teil muss so schnell wie möglich verlassen werden. Es prüft also grundsätzlich die Interrupt-Quelle und startet dann die untere Hälfte.

  2. "Untere Hälfte". Es kann als Arbeitswarteschlange implementiert werden. Hier wird der eigentliche Job erledigt. Es läuft im normalen Rahmen, so kann es blockieren Funktionen usw.

Wenn Sie nur für IRQ warten wollen in Ihrem Arbeitsthread, besser Besonderes zu verwenden Objekt namens completion. Es ist genau für diese Aufgabe erstellt.

Verwandte Themen