CAN2CANFD

Das Projekt befasst sich mit der Entwicklung eines bidirektionalen CAN 2.0 zu CAN FD Adapters.

 

Problemstellung:

ein existierendes CAN 2.0 Motorsteuergerät aus der Serie soll an ein CAN FD Netz eines Hybridfahrzeuges adaptiert werden.

Am Markt sind keine CAN FD Controller verfügbar.

Am Markt sind in ausreichender Anzahl CAN FD Transceiver verfügbar.

 

Lösung:

Es wurden fünf valide Problemlösungskonzepte ausgearbeitet.

In die engere Wahl kamen davon drei. Dabei wurden zwei gundlegende Konzepte erstellt:

  1. Ein Mikrocontroller mit mindestens einem CAN FD embedded Controller.
  2. Eine externe Hardwarelösung durch FPGA und geeignetem IP Core, ein FPGA uC, sowie ein Multicore-Hauptmanagementprozessor mit FPU usw.

Bei der FPGA Lösung ist darauf zu achten das dieser entweder einen uC zur Laufzeitsynthetisierung embedded oder ein geeigneter uC extern zum FPGA verwendung findet, z.B. Phytec. Zusätzlich existiert natürlich immer der Haupt uC als Nachrichten- und Systemmanager. uC mit embedded CAN FD Controller sind am Markt existend, allerdings nur sehr wenige.

 

Im uC läuft entweder ein Linux Core oder ein embedded RT System. Linux wird ganz normal wie man es auch lange kennt unter Ansi C und C++ programmiert. Die Software ist dadurch unabhängig der Prozessorarchitektur portierbar, läuft auf Linux, nicht auf Prozessorarchitektur.

 

Bei einem embedded RT System wie FReeRTOS wird normalerweise kein Prozessor sondern ein uC eingersetzt. Das System ist dann nur auf den uC lauffähig und portierbar, auf welchen auch z.B. FreeRTOS läuft.

 

Es existieren mindestens drei threads. Der Main thread sowie der CAN2CANFD wie als auch der CANFD2CAN thread.

Im shared memory wird entweder ein abstrakter Datentyp wie Linked List oder auch zwei parallel laufende Linked Lists implementiert. Das kann eine standart Linked List sein oder gerne auch eine doubly Linked List.

Als Zusatz und Option koennen sämtliche CAN Nachtichten, sei es CAN 2.0 oder CANFD nach Prioritäten sortiert werden und dann mit der frei wählbaren CAN Geschwindigkeit und in Abhängigkeit der externen CAN Transceiver Hardware, verschickt und empfangen werden. Das ganze läuft durch die Verwendung von Posix threads in Quasiechtzeit, quasiparallel.

 

Die komfortabelste Lösung dabei bietet ein Prozessor auf dem ein angepasstes Linux Core lauffähig ist / lauffähig gemacht werden kann. Ich habe mich für Ubuntu Core mit Posix Thereads entschieden und nutze einen Quadcore mit 1GB externem shared Memory, der unter Dauervollast und ohne jegliche Kühlung max 3W Verlustleistung hat (4x1,5Ghz).

Der Linux-Vorteil, wie soll es auch anders sein, ist das man ganz normal in C++ programmiert und das Managementsystem modular mit Klassen und abstrakten "base Classes" usw., aufbaut.

Dazu gehört auch "function overloading" und das Coresystem arbeitet zu 99% ausschliesslioch mit Zeigern. Eine sehr strukturierte und unkomplizierte Laufzeit ist anzustreben, das ist aber bei jeder multihreading Softwareentwicklöung normal, Stichwort "good practise".