2016-12-19 3 views
1

Ich habe an einigen Embedded-Software gearbeitet. Diese Software ist unterteilt in in zwei Hauptteile. Die erste ist die Anwendungssoftware und die zweite ist eine Systemsoftware. Die Systemsoftware besteht aus Treibern und RTOS. Ich habe den Anwendungsteil entwickelt und Ich habe die vorbereiteten Treiber verwendet. Unter den Treibern befinden sich auch Treiber für die CAN-Kommunikation. Eine der Funktionen hat die folgende SchnittstelleTreiber mit Callback-Funktion

result_t can_set_receive_callback (can_receive_callback_t cb); 

Zusammen mit dieser Funktion folgenden Definition auch des Zeigers auf Funktion

typedef void (*can_receive_callback_t) (can_message_t msg); 

I Problem ist zu verstehen, wie die Treiber-Funktion zu verwenden. Ich weiß, dass ich mit folgenden Schnittstelle

void my_function (can_message_t m); 

Ich weiß auch, eine Funktion zu definieren, dass die Funktion wie oben definiert ist, so Callback-Funktion aufgerufen. Aber ich weiß nicht, warum ich die Callback-Funktion definieren muss.

Warum ist es nicht möglich, einfach die Treiberfunktion aufzurufen, ohne dass ein Funktionszeiger als Argument übergeben wird?

Bedeutet das, dass die von mir definierte Callback-Funktion "sagt", wie die empfangenen Nachrichten verarbeitet werden? Welche Informationen sind dem Treiberentwickler unbekannt?

Ich meinte, dass die empfangenen Nachrichten von vorbereiteten Interrupt-Service-Routinen verarbeitet werden, aber keiner der erwähnten Funktionen sieht aus wie ein ISR.

Kann jemand mich auf ein gutes Dokument verweisen, wo diese Art der Arbeit mit Treibern beschrieben wird? Danke vielmals.

+0

Die API möge, dass Sie eine Funktion zu übergeben Zeiger auf eine von Ihnen definierte Funktion. Angeblich wird Ihre Funktion dann ausgeführt, sobald Sie eine CAN-Nachricht erhalten. Es wird vom Treiber aufgerufen, nicht vom Programmierer, daher der Begriff "Rückruf". Dies ist kein standardisiertes Verfahren, sondern etwas, das für Ihren speziellen Fahrer einzigartig ist. Sie müssen die Dokumentation über den Treiber lesen, um die Verwendung zu verstehen. Oder, wenn es keine Dokumentation gibt, verstehen Sie den Code. – Lundin

Antwort

1

OSI model sprechende Treiber sollen die Kommunikation auf der physischen Ebene verwalten.

Der Treiber führt also die Aktivierung, Konfiguration, Lesen, Schreiben usw. des Kommunikationsgeräts aus, um die HW für die Kommunikation auf Ihrem Bus (CAN) zu verwalten.

Die Sicherungsschicht ist verantwortlich für die Verwaltung des "Protokolls" der Daten, die auf dem Bus gesendet und empfangen werden.

Der Treiberentwickler benötigt also einen Entwickler der Datensicherungsschicht, um Funktionen zu setzen, die aufgerufen werden (Callbacks), wenn ein bestimmtes Ereignis von Physyal Layer ausgelöst wird.

Mit anderen Worten, in Ihrem speziellen Fall, müssen Sie einen Rückruf festlegen, die empfangenen Daten zu verwalten, basierend auf Ihrem Protokoll mit seiner Besonderheit (Struktur, Timings, etc ...)

+0

Vielen Dank für Ihre Antwort LPs. Ich stelle mir das Empfangen von Nachrichten auf folgende Weise vor. Erstens gibt es eine neue Nachricht in der Mailbox. Basierend auf diesem Ereignis wird die entsprechende ISR aufgerufen.Der ISR setzt ein Flag, das periodisch von der Treiberfunktion getestet wird. Sobald die Treiberfunktion den Zustandswechsel des Flags erkennt, setzt er das Flag zurück, ruft die Nachricht aus dem Postfach ab und ruft die Callback-Funktion auf. Es gibt einen vorbereiteten Code, der die Nachricht weiterverarbeitet. Ist es richtig? Vielen Dank. – Steve

+0

Es sollte funktionieren, aber beachten Sie, dass die aufgerufene Funktion die Anruferfunktion blockiert. Außerdem, soweit ich das verstehe, sollten Sie sich auch um das Setzen und Zurücksetzen der Flagge kümmern: Sie müssen atomaren oder gleichzeitigen Zugriff verwalten. – LPs

+0

Vielen Dank für Ihre Hilfe, LPs. – Steve