GadgetSeed  0.9.6
fifo.c
[詳解]
1 /** @file
2  @brief 汎用リングバッファ
3 
4  @date 2017.09.07
5  @date 2002.03.24
6  @author Takashi SHUDO
7 */
8 
9 #include "fifo.h"
10 
11 /**
12  @brief fifoを初期化する
13 
14  @param[in] fp 初期化するfifo
15  @param[in] buf fifoとなるバッファポインタ
16  @param[in] size バッファのバイト数
17 
18  @note バッファ内に保存できるデータは size-1 となる
19 */
20 void init_fifo(struct st_fifo *fp, unsigned char *buf, unsigned int size)
21 {
22  fp->buf = buf;
23  fp->size = size;
24  fp->wp = buf;
25  fp->rp = buf;
26 }
27 
28 /**
29  @brief fifoにデータを書き込む
30 
31  @param[in] fp データが書き込まれるfifo
32  @param[in] data 書き込むデータ
33  @param[in] length 書き込むデータの長さ
34 
35  @return 書き込みサイズ
36 */
37 int write_fifo(struct st_fifo *fp, unsigned char *data, unsigned int length)
38 {
39  unsigned int i;
40 
41  if(fifo_free_size(fp) < length) {
42  return 0;
43  }
44 
45  for(i=0; i<length; i++) {
46  unsigned char *np;
47 
48  np = fp->wp + 1;
49  if(np >= &fp->buf[fp->size]) {
50  np = fp->buf;
51  }
52 
53  if(np != fp->rp) {
54  *fp->wp = *data;
55  data ++;
56  fp->wp = np;
57  } else {
58  return (int)i; // バッファフル
59  }
60  }
61 
62  return (int)i;
63 }
64 
65 /**
66  @brief fifoからデータを読み出す
67 
68  @param[in] fp データが読み出されるfifo
69  @param[out] data 読み出されるデータのポインタ
70  @param[in] length 読み出されるデータの長さ
71 
72  @return 読み出しサイズ
73 */
74 int read_fifo(struct st_fifo *fp, unsigned char *data, unsigned int length)
75 {
76  unsigned int i;
77 
78  for(i=0; i<length; i++) {
79  unsigned char *np;
80 
81  if(fp->rp != fp->wp) {
82  *data = *fp->rp;
83  data ++;
84 
85  np = fp->rp + 1;
86  if(np >= &fp->buf[fp->size]) {
87  np = fp->buf;
88  }
89  fp->rp = np;
90  } else {
91  return (int)i; // バッファエンプティ
92  }
93  }
94 
95  return (int)i;
96 }
97 
98 /**
99  @brief fifoに書き込まれているデータを全て消去する
100 
101  @param[in] fp データのサイズを読み出すfifo
102 */
103 void clear_fifo(struct st_fifo *fp)
104 {
105  fp->wp = fp->buf;
106  fp->rp = fp->buf;
107 }
108 
109 /**
110  @brief fifoに書き込まれているデータのサイズを返す
111 
112  @param[in] fp データのサイズを読み出すfifo
113 
114  @return fifoに書き込まれているデータサイズ
115 */
116 unsigned int fifo_size(struct st_fifo *fp)
117 {
118  if(fp->wp >= fp->rp) {
119  return (unsigned int)(fp->wp - fp->rp);
120  } else {
121  return (unsigned int)(fp->size - (fp->rp - fp->wp));
122  }
123 }
124 
125 /**
126  @brief fifoに書き込み可能なデータのサイズを返す
127 
128  @param[in] fp データのサイズを読み出すfifo
129 
130  @return fifoに書き込み可能なデータサイズ
131 */
132 unsigned int fifo_free_size(struct st_fifo *fp)
133 {
134  if(fp->wp >= fp->rp) {
135  return (unsigned int)(fp->size - (fp->wp - fp->rp) - 1);
136  } else {
137  return (unsigned int)((fp->rp - fp->wp) - 1);
138  }
139 }
140 
141 /**
142  @brief fifoからデータを捨てる
143 
144  @param[in] fp データが捨てられるfifo
145  @param[in] length 捨てるデータの長さ
146 
147  @return 捨てたサイズ
148 */
149 int drop_fifo(struct st_fifo *fp, unsigned int length)
150 {
151  unsigned int i;
152 
153  for(i=0; i<length; i++) {
154  unsigned char *np;
155 
156  if(fp->rp != fp->wp) {
157  np = fp->rp + 1;
158  if(np >= &fp->buf[fp->size]) {
159  np = fp->buf;
160  }
161  fp->rp = np;
162  } else {
163  return (int)i; // バッファエンプティ
164  }
165  }
166 
167  return (int)i;
168 }
int drop_fifo(struct st_fifo *fp, unsigned int length)
fifoからデータを捨てる
Definition: fifo.c:149
汎用FIFO
Definition: fifo.h:12
int read_fifo(struct st_fifo *fp, unsigned char *data, unsigned int length)
fifoからデータを読み出す
Definition: fifo.c:74
unsigned char * wp
書き込みデータのポインタ
Definition: fifo.h:15
int write_fifo(struct st_fifo *fp, unsigned char *data, unsigned int length)
fifoにデータを書き込む
Definition: fifo.c:37
void clear_fifo(struct st_fifo *fp)
fifoに書き込まれているデータを全て消去する
Definition: fifo.c:103
unsigned int fifo_size(struct st_fifo *fp)
fifoに書き込まれているデータのサイズを返す
Definition: fifo.c:116
汎用リングバッファ
unsigned int fifo_free_size(struct st_fifo *fp)
fifoに書き込み可能なデータのサイズを返す
Definition: fifo.c:132
unsigned int size
バッファのサイズ
Definition: fifo.h:14
void init_fifo(struct st_fifo *fp, unsigned char *buf, unsigned int size)
fifoを初期化する
Definition: fifo.c:20
unsigned char * buf
バッファのポインタ
Definition: fifo.h:13
unsigned char * rp
読み込みデータのポインタ
Definition: fifo.h:16