Protokolle duplizieren (Deutsch)

From Ethersex_Wiki
Revision as of 05:46, 26 July 2012 by Atos (talk | contribs)
Jump to: navigation, search

Protokolle duplizieren

Es kommt immer mal wider vor, das man das gleiche Protokoll zweimal benötigt.

Lösung 1

Bei mir war der Fall, das ich ein Net-IO mit einem ATMega 644p ausgestattet habe, der zwei UART besitz. Diese zwei Schnittstellen wollte ich zum auslesen meiner Wechselrichter nutzen.

Das Protokoll der Wahl war bei mir sll (serial_line_log)

Leider muste ich feststellen, das ich immer nur ein Protokoll auf ein UART binden kann. Da es bist jetzt noch keine gute Idee gibt, wie man so etwas besser lösen kann, hier ein kleiner Trick. Das Protokoll serial_line_log wird einfach dupliziert. Ich habe jedes "seria_" in ein "serialzwei_" gewandelt.

  • Kopieren des Ordners (cp -a ethersex/protocols/serial_line_log ethersex/protocols/serialzwei_line_log)
  • alle Dateien im Ordner umbenannt (auser Makefile und config.in) (cd ethersex/protocols/serialzwei_line_log; mv serial_<...>.c serialzwei_<...>.c
  • mit einem Editor Alle Variabeln und Symbolenamen geändert

vim serialzwei_line_log.c

%s/SERIAL_/SERIALZWEI_/g
%s/serial_/serialzwei_/g
%s/sll_/sllzwei_/g

  • in der serialzwei_line_log_ecmd.c muss noch der ecmd Befehl angepasst werden (ganz am Schluss der META abschnitt)

vim serialzwei_line_log_ecmd.c

%s/sll get/sll2 get
%s/sll_/sllzwei_/g

  • in der protocols/serialzwei_line_log/config.in die Namen anpassen

vim config.in

%s/LINE_/LINE2_/g
%s/Line/Line2/g

  • die ethersex/config.in und das MAKEFILE an die neuen Namen anpassen

Zum Schluss müssen noch zwei zentrale Dateien angepasst werden.

cd ethersex/ vim Makefile SUBDIRS += protocols/serialzwei_line_log

vim config.in source protocols/serialzwei_line_log/config.in

Danach sollte

make menuconfig

Jetzt sollte unter Protokolle das Serial Line Log zweimal vorhanden sein.

Anmerkung: Das gleiche Verfahren funktioniert auch mit dem yport-Protokoll. Wenn man z.B. einen ATMega644p besitzt und beide UARTs "gleichzeitig" benutzen will, kann man das yport-Protokoll mit dem hier vorgestellten Verfahren duplizieren. nc <ip> 7970 bzw nc <ip> 7971 liefert dann die Ausgabe der beiden Ports.

Lösung 2

Speziell für den U(S)ART gibt es eine elegantere Möglichkeit:

Die AVR-LIBC unterstützt inzwischen bis zu zwei U(S)ARTs durch verschiedene Makros. In den Dateien core/usart.h und scripts/usart-config.sh finden sich weitere hilfreiche Makros. Man geht wie folgt vor:

In config.in läßt man via menuconfig einen U(S)ART auswählen, indem man das Makro usart_choice() benutzt. Außerdem im Spiel sind die Makros get_usart_count und usart_count_used. Als Ergebnis sollten zwei Variable definiert sein: <mymodulename>_USE_USART und <mymodulename>_BAUDRATE, welche für die U(S)ART-Nummer bzw. die Baudrate stehen. Als Beispiel siehe YPort.

Im C-Quelltext benötigt man folgende Anweisungen:

  • #define USE_USART <mymodulename>_USE_USART
 Die Variable <mymodulename>_USE_USART muß in config.in auf eine Zahl 0 oder 1 für den ausgewählten U(S)ART gesetzt worden sein. Mit der Zuweisung an USE_USART versorgt man die folgenden universellen Makroaufrufe mit der richtigen U(S)ART-Nummer.
  • #define BAUD <mymodulensme>_BAUDRATE
 Gleiches Spiel für die Baudrate
  • #include "core/usart.h"
 Hier stehen Makros
  • generate_usart_init()
 Dieser Makroaufruf irgendwo im folgenden C-Quelltext generiert eine Routine usart_init() für den ausgewählten U(S)ART, setzt das Datenformat auf 8N1 und die Baudratenvorteiler auf den korrekten Wert. Außerdem werden die RXC und TX Interrupts freigegeben. Andere Datenformate als 8N1 sind (noch) nicht als Makro definiert, und wenn das Freigeben der Interrupts stört, dann sollte man anstelle des generate_usart_init() Makros die Intialisierung aller Register mit Hilfe der unten beschriebenen Makros selbst durchführen.
  • ISR(usart(USART,_RX_vect)) bzw. ISR(usart(USART,_TX_vect)) etc.
 So werden die Interrupthandler universell definiert, sie verwenden dann automatisch die richtige U(S)ART-Nummer.
  • Die U(S)ART-Register sowie die Bit-Definitionen der Register werden ersetzt durch Makroaufrufe usart(<vordererTeil>[,<hintererTeil>]). Das Makro fügt die U(S)ART-Nummer ein.