ring buffer
Diff: rbuf.c
- Revision:
- 4:192672304400
- Parent:
- 3:c9c7c8e20336
- Child:
- 5:ddc33cb62d27
--- a/rbuf.c Thu Jun 23 20:30:46 2011 +0000 +++ b/rbuf.c Thu Jun 23 21:11:06 2011 +0000 @@ -1,21 +1,11 @@ -#ifndef __charbuf_c_ - #define __charbuf_c_ +#ifndef __rbuf_c_ + #define __rbuf_c_ #include "mbed.h" - -#include "globals.h" // Wegen g_display_error #include "rbuf.h" -#include "eprintf.h" -// int debug_create_charbuffer = 0; -int display_receive_io = 0; -int display_send_io = 0; -//int debug_add_pointer_Klartext = 0; -int debug_display_charbuffer_header = 0; - -void init_header (buffer_header_t *h, void *buf, uint16_t objektanzahl, uint16_t Schwelle, uint16_t objektgroesse) +void init_header (rbuf_t *h, void *buf, uint16_t objektanzahl, uint16_t Schwelle, uint16_t objektgroesse) { - if (g_display_Funktion) {eprintf ("In init_header: \r\n"); } h->buflen = objektanzahl; h->bufcnt = 0; h->in = buf; @@ -29,24 +19,19 @@ h->blockgroesse = objektgroesse; } -buffer_header_t *charbuffer_init (uint16_t b_size, uint16_t b_schwelle, uint16_t blockgroesse) +rbuf_t *rbuf_init (uint16_t b_size, uint16_t b_schwelle, uint16_t blockgroesse) { - void *buffer_p; - buffer_header_t *kopf_p; + void *buffer_p; + rbuf_t *kopf_p; - if (g_display_Funktion) {eprintf ("In create_charbuffer: \r\n"); } - // Zuerst mal Speicher fuer die Verwaltungsstruktur holen - kopf_p = (buffer_header_t *) calloc (1, (sizeof(buffer_header_t))); + kopf_p = (rbuf_t *) calloc (1, (sizeof(rbuf_t))); if (kopf_p > 0x00) { - memset (kopf_p, 0x00, (sizeof(buffer_header_t))); + memset (kopf_p, 0x00, (sizeof(rbuf_t))); } else { - // Fehler! - eprintf ("Error: Kein Speicher mehr bei create_charbuffer-Verwaltungs-Strukt -> stop\n\r"); - stop++; return 0x00; } @@ -59,9 +44,7 @@ } else { - // gibt es noch nichts! -> evtl. Fehlemeldung, dass nciht mehr genuegend Speicher vorhanden ist. - eprintf ("Error: Kein Speicher mehr bei create_charbuffer, r_buffer -> stop\n\r"); - stop++; + // gibt es noch nichts! -> evtl. Fehlemeldung, dass nicht mehr genuegend Speicher vorhanden ist. return 0x00; } @@ -71,68 +54,9 @@ return kopf_p; } -io_buf_s *create_charbuffer_io (uint16_t r_size, uint16_t s_size, uint16_t r_schwelle, uint16_t s_schwelle, uint16_t blockgroesse) - { - io_buf_s *rbio; // Ring-Bufferpaar I/O - void *r_buffer_p; - void *s_buffer_p; - if (g_display_Funktion) {eprintf ("In create_charbuffer: \r\n"); } - - // Zuerst mal Speicher fuer die 2 I/O-Verwaltungsstrukturen holen - - rbio = (io_buf_s *) calloc (1, (sizeof(io_buf_s))); - if (rbio > 0x00) +void *rbuf_look (rbuf_t * r) // Nur schauen, ob im Buffer neue Ojekte drin sind. { - memset (rbio, 0x00, (sizeof(io_buf_s))); - } - else - { - // Fehler! - eprintf ("Error: Kein Speicher mehr bei create_charbuffer-Verwaltungs-Strukt -> stop\n\r"); - stop++; - return 0x00; - } - // Jetzt noch die eigentlichen Receive- und send-char-Speicher - size_t blen = r_size * blockgroesse; - r_buffer_p = calloc (1, blen); - if (r_buffer_p > 0x00) - { - memset (r_buffer_p, 0x00, blen); - } - else - { - // gibt es noch nichts! -> evtl. Fehlemeldung, dass nciht mehr genuegend Speicher vorhanden ist. - eprintf ("Error: Kein Speicher mehr bei create_charbuffer, r_buffer -> stop\n\r"); - stop++; - return 0x00; - } - - // pointer_add_check_null (r_buffer, "create_charbuffer receive_buffer"); - size_t slen = s_size * blockgroesse; - s_buffer_p = (char *) calloc (1, blockgroesse); - if (s_buffer_p > 0x00) - { - memset (s_buffer_p, 0x00, slen); - } - else - { - // evtl. Fehlermeldung, dass nicht genuegend Speicher vorhanden ist. - eprintf ("Error: Kein Speicher mehr bei create_charbuffer, s_buffer -> stop\n\r"); - stop++; - return 0x00; - } - // Jetzt noch die Bufferzeiger in die Verwaltungsstrukturen eintragen - // Und die Buffer-Verwaltung noch initialisieren - - init_header (&(rbio->in), r_buffer_p, r_size, r_schwelle, blockgroesse); - init_header (&(rbio->out), s_buffer_p, s_size, s_schwelle, blockgroesse); - return rbio; - } - -void *charbuffer_readable (buffer_header_t * r) // Nur schauen, ob im Buffer neue Ojekte drin sind. - { - return r->bufcnt; -/* + // return r->bufcnt; if (r->bufcnt == 0) { return 0; @@ -141,23 +65,19 @@ { return r->out; // ?!? } -*/ } -void *charbuffer_get (buffer_header_t *r, void *target) // Einen char/Block rausholen mit Readzeiger++ +void *rbuf_get (rbuf_t *r, void *target) // Einen char/Block rausholen mit Readzeiger++ { void *p_b; // Pointer block - if (g_display_Funktion) {eprintf ("In charbuffer_get: \r\n"); } if (r->bufcnt == 0) { r->flags = r->flags & ((uint8_t) (~NOT_EMPTY)); return 0; } - // else - // p_b = r->out++; // ?!? // zuerst rausholen, dann Read-Zeiger versetzen p_b = r->out; r->out = (void *) (((char *) r->out) + r->blockgroesse ); - r->bufcnt--; // Ein char weniger im Buffer + r->bufcnt--; // Ein Objekt weniger im Buffer if (r->bufcnt >= r->Schwelle) { r->flags = r->flags | ((uint8_t) (FAST_VOLL)); @@ -182,27 +102,9 @@ return p_b; // ?!? } -void charbuffer_copy (void *qf, void *zf, uint16_t groesse) // Quelle -> Ziel kopieren // ?!? noch ben�tigt? - { - // - if (g_display_Funktion) {eprintf ("In charbuffer_copy: \r\n"); } - memcpy (zf, qf, groesse); - return; - } - -void charbuffer_move (void *qf, void *zf, uint16_t groesse) // Quelle -> Ziel (Move char mit anschliessendem loeschen der Quelle) +void *rbuf_put (rbuf_t *r, void *b_p) // Ein Zeichen/Block einstellen { - if (g_display_Funktion) {eprintf ("In charbuffer_move: \r\n"); } - charbuffer_copy (qf, zf, groesse); - memset (qf, 0x00, groesse); - //?!? evtl. noch get machen? - } - -void *charbuffer_put (buffer_header_t *r, void *b_p) // Ein Zeichen/Block einstellen - { - // b_p = Block-Pointer void *target; - if (g_display_Funktion) {eprintf ("In charbuffer_put: \r\n"); } if (r->bufcnt >= r->buflen) { r->fehleranzahl++; @@ -234,84 +136,4 @@ return target; } -void print_verwaltung (buffer_header_t *rbk_p) - { - if (rbk_p > 0x00) - { - eprintf (" charbufferverwaltung Zeiger = 0x%08X\r\n", rbk_p); - eprintf (" buflen = %d\r\n", rbk_p->buflen); - eprintf (" bufcnt = %d\r\n", rbk_p->bufcnt); - eprintf (" Zeiger *in = 0x%08X\r\n", rbk_p->in); - eprintf (" Zeiger *out = 0x%08X\r\n", rbk_p->out); - eprintf (" Zeiger *buf = 0x%08X\r\n", rbk_p->buf); - eprintf (" charanzahl = %d\r\n", rbk_p->anzahl); - eprintf (" Fehleranzahl = %d\r\n", rbk_p->fehleranzahl); - eprintf (" Schwelle = %d\r\n", rbk_p->Schwelle); - eprintf (" Flags = 0x%08X\r\n", rbk_p->flags); - eprintf (" Max.Fuellst. = %d\r\n", rbk_p->peak_max); - eprintf (" Blockgroesse = %d\r\n", rbk_p->blockgroesse); - } - else - { - if (g_display_error) - { - eprintf ("Error: In print_verwaltung: Zeiger rbk_p ist ungueltig! \r\n"); - } - } - return; - } - -void display_rbuffer_header (io_buf_s *rb) - { - buffer_header_t *rbk_p; - if (g_display_Funktion) {eprintf ("In print_verwaltung: \r\n"); } - if (rb > 0x00) - { - if (debug_display_charbuffer_header) - { - eprintf ("In display charbuffer charbufferspeicherzeiger = 0x%08X\r\n", rb); - } - if (display_receive_io) - { - rbk_p = &rb->in; - if (rbk_p > 0x00) - { - eprintf (" Receive Struktur: rbk_p = 0x%08X\r\n", rbk_p); - print_verwaltung (rbk_p); - } - else - { - if (g_display_error) - { - eprintf ("Error: In display_charbuffer_verwaltung: *rbk_p ist ungueltig! \r\n"); - } - } - } - if (display_send_io) - { - rbk_p = &rb->out; - if (rbk_p > 0x00) - { - eprintf (" Send Struktur: rbk_p = 0x%08X\r\n", rbk_p); - print_verwaltung (rbk_p); - } - else - { - if (g_display_error) - { - eprintf ("Error: In display_charbuffer_verwaltung display_send: *rbk_p ist ungueltig! \r\n"); - } - } - } - } - else - { - if (g_display_error) - { - eprintf ("Eror: In display_charbuffer_verwaltung: *rb ist ungueltig! \r\n"); - } - } - return; - } - -#endif // von __charbuf_c_ +#endif // von __rbuf_c_