zf_buffer.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. /**
  2. *****************************************************************************
  3. * @file zf_buffer.c
  4. * @author Zorb
  5. * @version V1.0.0
  6. * @date 2018-06-28
  7. * @brief 环形缓冲器的实现
  8. *****************************************************************************
  9. * @history
  10. *
  11. * 1. Date:2018-06-28
  12. * Author:Zorb
  13. * Modification:建立文件
  14. *
  15. *****************************************************************************
  16. */
  17. #include "zf_buffer.h"
  18. #include "zf_assert.h"
  19. #include "zf_malloc.h"
  20. #include "zf_debug.h"
  21. /******************************************************************************
  22. * 描述 :创建环形缓冲器(内部分配空间,size=0表示使用外部数据)
  23. * 参数 :(out)-ppRb 环形缓冲器结构体指针的指针
  24. * (in)-size 缓冲器大小
  25. * (out)-ppBuf 缓冲器空间指针的指针
  26. * 返回 :无
  27. ******************************************************************************/
  28. bool RB_create(RingBuffer **ppRb, uint32_t size)
  29. {
  30. RingBuffer *pRb;
  31. uint8_t *pBuf;
  32. ZF_ASSERT(ppRb != (RingBuffer **)0)
  33. pRb = (RingBuffer *)ZF_MALLOC(sizeof(RingBuffer));
  34. if (pRb == NULL)
  35. {
  36. ZF_DEBUG(LOG_E, "malloc ringbuffer space error\r\n");
  37. return false;
  38. }
  39. pRb->Head = (uint32_t)0;
  40. pRb->Trail = (uint32_t)0;
  41. pRb->Count = 0;
  42. if (size > 0)
  43. {
  44. pBuf = (void *)ZF_MALLOC(size);
  45. if (pBuf == NULL)
  46. {
  47. ZF_DEBUG(LOG_E, "malloc ringbuffer buffer space error\r\n");
  48. return false;
  49. }
  50. pRb->pBuf = pBuf;
  51. pRb->Size = size;
  52. pRb->IsExternBuffer = false;
  53. }
  54. else
  55. {
  56. pRb->pBuf = NULL;
  57. pRb->Size = 0;
  58. pRb->IsExternBuffer = true;
  59. }
  60. /* 初始化方法 */
  61. pRb->IsFull = RB_isFull;
  62. pRb->IsEmpty = RB_isEmpty;
  63. pRb->SaveByte = RB_saveByte;
  64. pRb->SaveRange = RB_saveRange;
  65. pRb->GetByte = RB_getByte;
  66. pRb->GetCount = RB_getCount;
  67. pRb->ReadBytes = RB_readBytes;
  68. pRb->DropBytes = RB_dropBytes;
  69. pRb->Clear = RB_clear;
  70. pRb->Dispose = RB_dispose;
  71. /* 输出 */
  72. *ppRb = pRb;
  73. return true;
  74. }
  75. /******************************************************************************
  76. * 描述 :缓冲器是否已满
  77. * 参数 :(in)-pRb 环形缓冲器结构体指针
  78. * 返回 :-true 已满
  79. * -false 未满
  80. ******************************************************************************/
  81. bool RB_isFull(RingBuffer * const pRb)
  82. {
  83. bool res = false;
  84. ZF_ASSERT(pRb != (RingBuffer *)0)
  85. if (pRb->Size == pRb->Count)
  86. {
  87. res = true;
  88. }
  89. return res;
  90. }
  91. /******************************************************************************
  92. * 描述 :缓冲器是否空
  93. * 参数 :(in)-pRb 环形缓冲器结构体指针
  94. * 返回 :-true 空
  95. * -false 未空
  96. ******************************************************************************/
  97. bool RB_isEmpty(RingBuffer * const pRb)
  98. {
  99. bool res = false;
  100. ZF_ASSERT(pRb != (RingBuffer *)0)
  101. if (pRb->Count == 0)
  102. {
  103. res = true;
  104. }
  105. return res;
  106. }
  107. /******************************************************************************
  108. * 描述 :压入一个字节
  109. * 参数 :(in)-pRb 环形缓冲器结构体指针
  110. * (in)-byte 要压入的字节
  111. * 返回 :-true 成功
  112. * -false 失败
  113. ******************************************************************************/
  114. bool RB_saveByte(RingBuffer * const pRb, uint8_t byte)
  115. {
  116. bool res = false;
  117. ZF_ASSERT(pRb != (RingBuffer *)0)
  118. ZF_ASSERT(pRb->pBuf != (uint8_t *)0)
  119. if (!RB_isFull(pRb))
  120. {
  121. pRb->pBuf[pRb->Trail++] = byte;
  122. pRb->Trail %= pRb->Size;
  123. pRb->Count++;
  124. res = true;
  125. }
  126. return res;
  127. }
  128. /******************************************************************************
  129. * 描述 :压入n个字节的数据
  130. * 参数 :(in)-pRb 环形缓冲器结构体指针
  131. * (in)-pData 要压入的数据的指针
  132. * (in)-len 要压入的数据的长度
  133. * 返回 :压入的数量
  134. ******************************************************************************/
  135. uint32_t RB_saveRange(RingBuffer * const pRb, uint8_t *pArray, uint32_t n)
  136. {
  137. uint32_t res = 0;
  138. if (pArray == 0)
  139. {
  140. return res;
  141. }
  142. ZF_ASSERT(pRb != (RingBuffer *)0)
  143. ZF_ASSERT(pRb->pBuf != (uint8_t *)0)
  144. ZF_ASSERT(pArray != (uint8_t *)0)
  145. uint32_t i;
  146. for (i = 0; i < n; i++)
  147. {
  148. pRb->pBuf[pRb->Trail++] = *(pArray + i);
  149. pRb->Trail %= pRb->Size;
  150. pRb->Count++;
  151. res++;
  152. if (pRb->Count >= pRb->Size)
  153. {
  154. break;
  155. }
  156. }
  157. return res;
  158. }
  159. /******************************************************************************
  160. * 描述 :取出一个字节
  161. * 参数 :(in)-pRb 环形缓冲器结构体指针
  162. * (out)-pByte 存放取出字节的地址
  163. * 返回 :-true 成功
  164. * -false 失败
  165. ******************************************************************************/
  166. bool RB_getByte(RingBuffer * const pRb, uint8_t *pByte)
  167. {
  168. bool res = false;
  169. ZF_ASSERT(pRb != (RingBuffer *)0)
  170. ZF_ASSERT(pRb->pBuf != (uint8_t *)0)
  171. ZF_ASSERT(pByte != (uint8_t *)0)
  172. if (!RB_isEmpty(pRb))
  173. {
  174. *pByte = pRb->pBuf[pRb->Head++];
  175. pRb->Head %= pRb->Size;
  176. pRb->Count--;
  177. res = true;
  178. }
  179. return res;
  180. }
  181. /******************************************************************************
  182. * 描述 :读取缓冲器已使用字节个数
  183. * 参数 :(in)-pRb 环形缓冲器结构体指针
  184. * 返回 :已使用字节个数
  185. ******************************************************************************/
  186. uint32_t RB_getCount(RingBuffer * const pRb)
  187. {
  188. ZF_ASSERT(pRb != (RingBuffer *)0)
  189. return pRb->Count;
  190. }
  191. /******************************************************************************
  192. * 描述 :读取n个字节(n超过最大数据数时全部读出)
  193. * 参数 :(in)-pRb 环形缓冲器结构体指针
  194. * (out)-pArray 存放取出字节的地址
  195. * (in)-n 要读取的字节个数
  196. * 返回 :实际读取的字节个数
  197. ******************************************************************************/
  198. uint32_t RB_readBytes(RingBuffer * const pRb, uint8_t *pArray, uint32_t n)
  199. {
  200. uint32_t len;
  201. uint32_t i, index;
  202. ZF_ASSERT(pRb != (RingBuffer *)0)
  203. ZF_ASSERT(pRb->pBuf != (uint8_t *)0)
  204. ZF_ASSERT(pArray != (uint8_t *)0)
  205. if (!RB_isEmpty(pRb))
  206. {
  207. len = RB_getCount(pRb);
  208. if (len > n)
  209. {
  210. len = n;
  211. }
  212. for(i = 0; i < len; i++)
  213. {
  214. index = (pRb->Head + i) % pRb->Size;
  215. *(pArray + i) = pRb->pBuf[index];
  216. }
  217. return len;
  218. }
  219. return 0;
  220. }
  221. /******************************************************************************
  222. * 描述 :丢弃n个字节(n超过最大数据数时全部丢弃)
  223. * 参数 :(in)-pRb 环形缓冲器结构体指针
  224. * (in)-n 要丢弃的字节个数
  225. * 返回 :实际丢弃的字节个数
  226. ******************************************************************************/
  227. uint32_t RB_dropBytes(RingBuffer * const pRb, uint32_t n)
  228. {
  229. uint32_t len;
  230. ZF_ASSERT(pRb != (RingBuffer *)0)
  231. ZF_ASSERT(pRb->pBuf != (uint8_t *)0)
  232. if (!RB_isEmpty(pRb))
  233. {
  234. len = RB_getCount(pRb);
  235. if (len > n)
  236. {
  237. len = n;
  238. }
  239. pRb->Head += len;
  240. pRb->Head %= pRb->Size;
  241. pRb->Count -= len;
  242. return len;
  243. }
  244. return 0;
  245. }
  246. /******************************************************************************
  247. * 描述 :清空缓冲器
  248. * 参数 :(in)-pRb 环形缓冲器结构体指针
  249. * 返回 :-true 成功
  250. * -false 失败
  251. ******************************************************************************/
  252. bool RB_clear(RingBuffer * const pRb)
  253. {
  254. bool res = false;
  255. ZF_ASSERT(pRb != (RingBuffer *)0)
  256. pRb->Head = (uint32_t)0;
  257. pRb->Trail = (uint32_t)0;
  258. pRb->Count = 0;
  259. res = true;
  260. return res;
  261. }
  262. /******************************************************************************
  263. * 描述 :释放缓冲器(不释放外部创建的缓冲区)
  264. * 参数 :(in)-pRb 环形缓冲器结构体指针
  265. * 返回 :-true 成功
  266. * -false 失败
  267. ******************************************************************************/
  268. bool RB_dispose(RingBuffer * const pRb)
  269. {
  270. ZF_ASSERT(pRb != (RingBuffer *)0)
  271. /* 外部创建的缓冲区不释放 */
  272. if (!pRb->IsExternBuffer)
  273. {
  274. ZF_FREE(pRb->pBuf);
  275. }
  276. ZF_FREE(pRb);
  277. return true;
  278. }
  279. /******************************** END OF FILE ********************************/