Forum: Mikrocontroller und Digitale Elektronik FIFO Struktur für 5 CAN Frames


von König (Gast)


Lesenswert?

Hi

Ich bin auf dem Wege ein CAN-Gateway zu entwickeln. Ich weis das gibts 
zu kaufen, aber keiner weis wie es technisch funktioniert. Deswegen mal 
die Eigenentwicklung.
Bin gerade am konzipieren des Puffers (FIFO Ringpuffer).
Das Ganze läuft so, dass höchstens 5 CAN Frames gesammelt werden müssen, 
bevor sie weiterverarbeitet werden.

Also muss erstmal der FIFO her. Verwendet: nur Standard ID. Das heisst, 
ein einzelner FIFO eintrag sieht so aus:

[11-Bit ID][RTR-Bit][4-Bit DLC][Data0][Data1][Data2][Data3]...[Data7]

Macht insgesamt 80 Bit = 10 Byte

Den FIFO Puffer wollte ich als Array programmieren:
[Eintrag1]
[Eintrag2]
[Eintrag3]
[Eintrag4]
[Eintrag5]

bzw:
[Byte0][Byte1][Byte2]...[Byte9]
[Byte0][Byte1][Byte2]...[Byte9]
[Byte0][Byte1][Byte2]...[Byte9]
[Byte0][Byte1][Byte2]...[Byte9]
[Byte0][Byte1][Byte2]...[Byte9]

D.h. die Definition des Array ist so:
1
uint8_t FIFO[5][80];

Ich greife also immer 8-Bit weise auf das Array zu (schreiben/lesen).

Ist das bis hier erstmal vom Ansatz richtig? Im Anschluss folgt dann die 
Sache mit dem Schreiben / Lesen (Ringpuffer-Zeuch).


grüßle
König






von Weisnix (Gast)


Lesenswert?

Ich wurde möglichst eine Puffertiefge von 2^x nehmen, läst sich schöner 
Programmieren.
uint8_t FIFO[5][80]; ist mit Sicherheit falsch.

von König (Gast)


Lesenswert?

warum soll das mit Sicherheit falsch sein?

von Weisnix (Gast)


Lesenswert?

Das sind 400 Bytes 5 * 80!!!

von König (Gast)


Lesenswert?

ahjo... das stimmt

pro Eintrag in der Matrix sind ja 8 Bit reserviert, wenn ich uint8 
nehme. Dann also besser so:

uint8_t FIFO[5][10];

Hast recht.

von Christian G. (christiang)


Lesenswert?

Hi,

die ID, das RTR-Bit und auch noch die Datenlänge in zwei Bytes zu 
quetschen ist zwar machbar aber unschön.
Lege dir doch eine Struktur an, z.B.

typedef struct
{
  uint16_t  id;
  uint8_t   length;
  uint8_t   data[8];
} CanStruct;

damit kannst du ein Array aufstellen (CanStruct CANBuffer[5]) und 
mittels Pointer auf die StructMember zugreifen und den Ringbuffer 
realisieren.
Das RTR-Bit läßt sich auch noch bei der ID oder der Länge unterbringen.
Das ganze ist pro Ringbuffereintrag nur ein Byte größer und 
übersichtlicher.

von Dietmar (Gast)


Lesenswert?

@König:

Schau dir mal das FullCAN-Beispiel für ARM7/LPC2000-Serien von der 
Keil-Homepage an. Dort wird eine Struktur "MsgBuf" aus 3 Int-Variablen 
verwendet, um eine komplette CAN-Message aus dem CAN-Controller ein- 
oder auszulesen.

Diese Struktur bietet sich ebenfalls, da sie ja schon vorgegeben ist, 
gut dazu an, 2 FIFOs zu erstellen, eines für Rx- und eines für Tx-Daten.

Dietmar

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.