Sunteți pe pagina 1din 2

Am fost recent întrebat de această întrebare: Cum de a proiecta un Circular FIFO (primul-

în primul-out) Buffer ( coadă ) în C? Trebuie să implementați două


metode: fifoRead și fifoWrite , care citește sau scrie un octet respectiv la tampon.
Cerințele sunt:

 Numai implementarea C.
 Rezervor tampon
 Primul-In-First-Out
 fifoRead va citi un octet din memoria tampon, dacă tamponul este gol, ar trebui să
returneze un cod de eroare EMPTY.
 fifoWrite va scrie un octet la tampon, dacă tamponul este plin, ar trebui să
returneze un cod de eroare FULL.
 Mărimea tamponului este fixă (nu se modifică timpul de execuție dinamic).
Este o dimensiune fixă, astfel încât cea mai bună structură de date este matricea statică pe
care o putem folosi pentru a reprezenta memoria tampon.
1 #define BUFFER_SIZE 100
2 #define ERROR_EMPTY 0
3 #define ERROR_FULL 0xFF
4
5 tampon de caractere [ BUFFER_SIZE ] ;
Putem apoi să avem două indicatoare-indicatori cap și coadă indicând la începutul și la
sfârșitul tamponului, implicit la zero.
1 int cap = 0 , coada = 0 ;
Când un octet trebuie inserat în tampon, ne mișcăm capul, iar pe de altă parte, când un
octet este pe cale să fie citit din tampon mutăm coada.

Dacă ne mișcăm cu toții capul și coada în direcția ceasului (în mișcare spre dreapta),
trebuie de asemenea să întoarcem poinții când ajung la capătul matricei, adică cap =
(cap + 1)% BUFFER_SIZE și tail = (coada + 1)% BUFFER_SIZE
Putem folosi o variabilă contor pentru a înregistra numărul de octeți stocați în buffer. Prin
urmare, fifoRead și fifoWrite pot fi implementate după cum urmează:
int count = 0 ;
1
2 // citește un octet din buffer și returnează ERROR_EMPTY dacă
3 tamponul gol
4 char fifoRead ( ) {
5 if ( 0 == count ) returnează ERROR_EMPTY ;
6 numără -;
7 coada = ( coada + 1 ) % BUFFER_SIZE ;
8 tampon de returnare [ tail ] ;
9 }
10
11 // scrie un octet la buffer dacă nu este ERROR_FULL
12 char fifoWrite ( chat val ) {
13 if ( BUFFER_SIZE == count ) returnează ERROR_FULL ;
14 numărătoarea ++;
15 cap = ( cap + 1 ) % BUFFER_SIZE ;
16 tampon de returnare [ cap ] ;
17 }
Nu ne plac variabilele globale în acest caz. Când faci contorul sau contorul +2 , ce
computer face este să copiezi valoarea din contorul de memorie pentru a înregistra,
incrementa sau diminua registrul și copia valoarea din registru înapoi în memorie. În cazul
întreruperilor hardware (similare cu multithreading), valoarea contorului poate fi
actualizată incorect.
Deci, dacă scăpăm de contor, cum să verificăm dacă tamponul este gol sau
plin? Răspunsul este în cap și coada în sine.
circular-fifo-tampon
Când buffer-ul este gol, capul == tail este adevărat. Și când tamponul urmează să fie
plin, capul + 1 == coada este adevărat.
// citește un octet din buffer și returnează ERROR_EMPTY dacă buffer-
1 ul gol
2 char fifoRead ( ) {
3 if ( head == tail ) returnează ERROR_EMPTY ;
4 coada = ( coada + 1 ) % BUFFER_SIZE ;
5 tampon de returnare [ tail ] ;
6 }
7
8 // scrie un octet la tampon dacă nu este ERROR_FULL
9 char fifoWrite ( chat val ) {
10 if ( cap + 1 == tail ) returnează ERROR_FULL ;
11 cap = ( cap + 1 ) % BUFFER_SIZE ;
12 tampon de returnare [ cap ] ;
13 }
În acest caz, putem stoca doar BUFFER_SIZE - 1 elemente în tampon deoarece trebuie să
distingem între BUFFER emtpy și BUFFER plin.
-EOF (blogul Ultimate Computing & Technology ) -
GD Star Rating
loading ...
708 cuvinte
- Sprijinirea muncii mele prin donații (Multumesc):


 bitcoin: 1J88t5UAgKBHhMgzkyH9bpY5mPdCYAe5XQ
Ultimul mesaj : Cum de a determina cel mai bun antivirus pentru dispozitivul dvs.?
Următorul mesaj : Exercițiul de codificare - Cum să îmbinați două array sortate?

URL-ul permanent este: Cum proiectați un buffer circular FIFO (coadă) în C? ( Versiunea
AMP )

S-ar putea să vă placă și