Ringpuffer programmieren

Begonnen von pic18, 05.03.2023, 19:12:17 CET

Vorheriges Thema - Nächstes Thema

pic18

Ich bin wieder einmal am Programmieren. In meinen Projekt möchte ich Schaltzeiten programmieren und diese im Ringpuffer ablegen.
Ich habe mir folgendes Format ausgedacht:
1. Zeit.Stunden, Zeit.Minuten
2. Schaltbefehl
3. Schaltwert

für die Zeit besteht in einen anderen Unterprog. schon der Datentype

typedef struct {
    uint8_t hour;
    uint8_t minute;
}timeHM_t;

der Schaltbefehl und der Schaltwert ist jeweils ein Byte groß. Das zusammen habe ich als Datentyp zusammengefasst.

typedef struct{
  timeHM_t zeitHM; //struct{uint8_t hour; unit8_t minuten} timeHM_t
  uint8_t cmd;
  uint8_t value;
}ZeitBefVal_t;

die Daten speichere ich so in den Buffer (Puffer)
struct Buffer {
  ZeitBefVal_t data[BUFFER_SIZE];
  uint8_t read; // zeigt auf das Feld mit dem ältesten Inhalt
  uint8_t write; // zeigt immer auf leeres Feld
} buffer = {{{0,0},0,0}}, 0, 0}; //buffer = {{}, 0, 0}; wenn uint8_t data

Hier meine erste Frage: habe ich den Buffer richtig initialisiert? Ich habe hier eine Structure in eine Structure und das in einen dim. Feld (array)

Meine nächste Frage: ich möchte mehrere Ringpufferspeicher verwenden, welche unterschiedliche Datenstructuren und Größe verwenden. Ist das möglich ohne jedesmal den ganzen Programmcode zu kopieren, zB. mit Pointer?

was ich getestet habe, das ich Structuren vom gleichen Type einfach kopieren kann, was bei einen dim. Feld (array) nicht geht.

timeHM_t zeit1, zeit2;
zeit1 = zeit2;

hier mein jetziger Programmcode, welcher ich noch nicht getestet habe.
#define BUFFER_FAIL     0
#define BUFFER_SUCCESS  1
 
#define BUFFER_SIZE 8 // muss 2^n betragen (8, 16, 32, 64 ...)
#define BUFFER_MASK (BUFFER_SIZE-1) // Klammern auf keinen Fall vergessen

typedef struct{
	timeHM_t zeitHM; //struct{uint8_t hour;unit8_t minuten} timeHM_t
	uint8_t cmd;
	uint8_t value;
}ZeitBefVal_t;

struct Buffer {
  ZeitBefVal_t data[BUFFER_SIZE];
  uint8_t read; // zeigt auf das Feld mit dem ältesten Inhalt
  uint8_t write; // zeigt immer auf leeres Feld
} buffer = {{{0,0},0,0}}, 0, 0}; //buffer = {{}, 0, 0}; wenn uint8_t data 

//
// Stellt 1 Datensatz in den Ringbuffer
//
// Returns:
//     BUFFER_FAIL       der Ringbuffer ist voll. Es kann kein weiteres Byte gespeichert werden
//     BUFFER_SUCCESS    das Byte wurde gespeichert
//
uint8_t BufferIn(ZeitBefVal_t data)
{
  uint8_t next = ((buffer.write + 1) & BUFFER_MASK);

  if (buffer.read == next)
    return BUFFER_FAIL; // voll

  buffer.data[buffer.write] = data; 	//memcpy(&buffer.data[buffer.write], &data, sizeof(data));
  // buffer.data[buffer.write & BUFFER_MASK] = data; // absolut Sicher
  buffer.write = next;

  return BUFFER_SUCCESS;
}

//
// Holt 1 Datensatz aus dem Ringbuffer, sofern mindestens eines abholbereit ist
//
// Returns:
//     BUFFER_FAIL       der Ringbuffer ist leer. Es kann kein Byte geliefert werden.
//     BUFFER_SUCCESS    1 Byte wurde geliefert
//
uint8_t BufferOut(ZeitBefVal_t *pdata)
{
  if (buffer.read == buffer.write)
    return BUFFER_FAIL;

  *pdata = buffer.data[buffer.read]; //memcpy(pdata,&buffer.data[buffer.read], sizeof(*pdata));

  buffer.read = (buffer.read+1) & BUFFER_MASK;

  return BUFFER_SUCCESS;
}


pic18

ZitatMeine nächste Frage: ich möchte mehrere Ringpufferspeicher verwenden, welche unterschiedliche Datenstructuren und Größe verwenden. Ist das möglich ohne jedesmal den ganzen Programmcode zu kopieren, zB. mit Pointer?
hier bin ich immer noch am Überlegen, wie ich verschiedene Puffer mit einem Programm bedienen kann

Schnellantwort

Achtung: In diesem Thema wurde seit 120 Tagen nichts mehr geschrieben.
Wenn Sie nicht absolut sicher sind, dass Sie hier antworten möchten, starten Sie ein neues Thema.

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau