programmation d'un buffer du type fifo circulaire,ici c le fito circulaire.
g un probleme avec ce source ecrit en c,je comprend pas comment les valeurs retourné par les fonctions son calculer avec l'operateur binnaire (&)
voici le source:
definition de la structure:
commentaire de l'auteur------->
A structure stores the data and its pointers (as index values into the data array). The first
word indicates the buffer length, which allows for a variety of buffer sizes. For speed, the
buffer size is constrained to be a power of two.
*******************************************************---
*******************************************************---
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #ifndef _CBUFFLEN_ #define _CBUFFLEN_ 0x800 #endif /* Circular buffer structure */ typedef struct { WORD len; /* Length of data (must be first) */ LWORD in; /* Incoming data */ LWORD out; /* Outgoing data */ LWORD trial; /* Outgoing data 'on trial' */ BYTE data[_CBUFFLEN_]; /* Buffer */ } CBUFF;
Implementation des fonction ki von calculer les longueurs envoyer ou pas encore envoyer ou envoyer et attente de confirmation(trial data)
explication de l'auteur:
In creating the buffer-handling software, it is important to retain a clear idea of what is
meant by untried data (not yet sent), and trial data (sent but not acknowledged).
*******************************************************---
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 /* Return total length of data in buffer */ WORD buff_dlen(CBUFF *bp) { return((WORD)((bp->in - bp->out) & (bp->len - 1))); } /* Return length of untried (i.e. unsent) data in buffer */ WORD buff_untriedlen(CBUFF *bp) { return((WORD)((bp->in - bp->trial) & (bp->len - 1))); } /* Return length of trial data in buffer (i.e. data sent but unacked) */ WORD buff_trylen(CBUFF *bp) { return((WORD)((bp->trial - bp->out) & (bp->len - 1))); } /* Return length of free space in buffer */ WORD buff_freelen(CBUFF *bp) { return(bp->len ? bp->len - 1 - buff_dlen(bp) : 0); } /* Set all the buffer pointers to a starting value */ void buff_setall(CBUFF *bp, LWORD start) { bp->out = bp->in = bp->trial = start; }
explication de l'auteur :
When loading data into the buffer, the simple but slow method is to copy it byte-by-byte.
Instead, I’ll use either one or two calls to a fast block-copy function, depending on whether
the new data wraps around the end of the buffer. If the data is too big for the buffer, it is truncated,
because I’m assuming the programmer has checked the free space before calling this
function. The free space is always reported as one byte less than the actual space, so there is
no danger of the input pointer catching up with the output pointer.
*****************************************************---
Les types utiliser:
*******************************************************---
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #define BYTE unsigned char #define WORD unsigned short #define LWORD unsigned long
Merci de votre attention
Partager