-
Notifications
You must be signed in to change notification settings - Fork 9
Home
Welcome to the embbdev_ringbuffer wiki!
Kirjoita rengaspuskuri ohjelma
Rengaspuskuri (ring buffer, circular buffer) on toteutustapa, jolla saadaan vaihtelevalla nopeudella väylästä tuleva data luettua helpostikäsiteltävään muotoon. Rengaspuskuria käytetään esimerkiksi sarjamuotoisen datan lähetyksessä ja vastaanotossa.
Rengaspuskurissa on tietovarasto (taulukko) jota osoitetaan kahdella eri pointterilla: lisäys-pointteri ja luku pointteri. Rengas puskuria käytetään kuten tavallistakin puskuria, mutta kun pointteri päätyy varaston loppuun siirretään se osoittamaan takaisin varaston alkuun ja homma jatkuu. pointterit eivät saa kuitenkaan mennä ristiin.
Esimerkki:
Kuvahaun tulos haulle ring buffer animation
Lisätietoa:
Harjoitustehtävät
-
Luo tietovarasto (receive_buffer)
unsigned char recive_buffer;
ja sen käsittelyyn Struct:
struct buffer_type
{ unsigned char *head; unsigned char *tail; unsigned char *buffer; };
-
Perusta uusi projekti (uusi hakemisto, tiedostot, ringbuffer.c, ringbuffer.h, makefile, ja testasympäristö)
-
Luo yksikkötestitapaukset sekä stub funktiot seuraaville funktiolle,
stub = pelkkä funktion runko
-
Luo funktiot ja testaa niiden toiminta (Googletestillä) yksi kerrallaan- Kun työ etenee päivitä aikaisemmin tehtyjä ja lisää uusia tesitapauksia tarpeen mukaan (sem aluksi et voi testatakuin tyhjää puskuria get_status funktiolla, ennen kun olet tehnyt add_char_to_buffer ):
void init_buffer(struct buffer_type *b, unsigned char *buffer);
sijoittaa parametrinaan saaman merkkijonon alkuosoitteen structin kaikkiin pointtereihin testaa: esimerkki assertiolla: init_buffer(&b,buff); assert(b.head==buff); assert(b.tail==buff); assert(b.buffer==buff);
void empty_buffer(struct buffer_type *b);
Käyttää struktissa aikaisemmin alustettua puskuria, mutta siirtää end pointterin osoittamaan head pointteriin, jolloin puskuri on tyhjä unsigned int get_buffer_status(struct buffer_type b);
palauttaa puskuriin tallennettujen merkkien lukumäärän (tässä vaiheessa tuloksen tulee olla nolla) -1 virhetilanteessa (esim lukupuskuri osoittaa kirjoituspuskurin tilaan ei pitäisi tulla koskaan)
-
Kirjoita funktiot:
int add_char_to_buffer(struct buffer_type *b, unsigned char c, int *err);
jolla lisätään yksi merkki puskuriin Aluksi älä murehdi puskurin yli kierrättämisestä (alkuun siirtämisestä), laita vain toiminto joka huomaa jos ollaan puskurin kirjoittamassa viimeiseen muistipaikkaan, tehdään tämä lopuksi funktio palauttaa puskurissa olevien tavujen määrän -1 virhetilanteessa, ja err muuttujaan tallenneaan vikatieto unsigned char get_char_from_buffer(struct buffer_type *b, int *err);
jolla luetaan yksi merkki puskurista Aluksi älä murehdi puskurin yli kierämisestä, laita vain toiminto, joka estää lukemasta pusurista, jos siellä ei ole tallennettua dataa (luku pointteri osoittaa kirjoituspointteriin) funktio palauttaa luetun merkin -1 virhetilanteessa, ja vikakoodi err muuttujaan. int print_buffer(struct buffer_type b, int *err);
jolla tulostetaan puskurissa olevat tiedot ottamatta tietoja pois puskurista (siirtämättä pointtereita) funktio palauttaa puskurissa olevien merkkien lukumäärän -1 virhetilanteessa
-
Laajenna funktioita aloittamaan puskuri alusta, kun pointteri päätuu taulukon loppuun
-
Kirjoita funktiot, joilla voidaan lisätä/lukea useampi merkki kerrallaan puskuriin
int add_string_to_buffer(struct buffer_type *b, unsigned char *s, int *err);
add palauttaa lisättyjen merkkien määrän -1 jos puskuriin ei voida kirjittaa kaikkea, tässä tapauksessa puskurin sisältö jätetään muuttamatta
int get_string_from_buffer(struct buffer_type *b, unsigned char *dest, int len, int *err);
get_string_from buffer:lle annetaan puskurista luettavien merkkien lukumäärä palauttaa luettujen merkkien lukumäärän -1 virhetilanteessa ja err muuttujaan syy