circular_buf.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #ifndef CIRCULAR_BUF_INTERFACE_H
  2. #define CIRCULAR_BUF_INTERFACE_H
  3. #include "typedef.h"
  4. #include "system/spinlock.h"
  5. /* --------------------------------------------------------------------------*/
  6. /**
  7. * @brief cbuffer结构体
  8. */
  9. /* ----------------------------------------------------------------------------*/
  10. typedef struct _cbuffer {
  11. u8 *begin;
  12. u8 *end;
  13. u8 *read_ptr;
  14. u8 *write_ptr;
  15. u8 *tmp_ptr ;
  16. u32 tmp_len;
  17. u32 data_len;
  18. u32 total_len;
  19. spinlock_t lock;
  20. } cbuffer_t;
  21. /* --------------------------------------------------------------------------*/
  22. /**
  23. * @brief 适用范围:全局
  24. * @brief cbuffer初始化
  25. *
  26. * @param [in] cbuffer cbuffer 句柄
  27. * @param [in] buf 缓存空间
  28. * @param [in] size 缓存总大小
  29. */
  30. /* ----------------------------------------------------------------------------*/
  31. void cbuf_init(cbuffer_t *cbuffer, void *buf, u32 size);
  32. /* --------------------------------------------------------------------------*/
  33. /**
  34. * @brief 适用范围:cb_memcpy管理
  35. * @brief 把cbuffer_t结构体管理的内存空间的数据拷贝到buf数组
  36. * @param [in] cbuffer cbuffer 句柄
  37. * @param [out] buf 指向用于存储读取内容的目标数组
  38. * @param [in] len 要读取的字节长度
  39. *
  40. * @return 成功读取的字节长度
  41. */
  42. /* ----------------------------------------------------------------------------*/
  43. u32 cbuf_read(cbuffer_t *cbuffer, void *buf, u32 len);
  44. /* --------------------------------------------------------------------------*/
  45. /**
  46. * @brief 适用范围:cb_memcpy管理
  47. * @brief 把buf数组数据拷贝cbuffer_t结构体管理的内存空间
  48. *
  49. * @param [in] cbuffer cbuffer 句柄
  50. * @param [in] buf 指向用于存储写入内容的目标数组
  51. * @param [in] len 要写入的字节长度
  52. *
  53. * @return 成功写入的字节长度
  54. */
  55. /* ----------------------------------------------------------------------------*/
  56. u32 cbuf_write(cbuffer_t *cbuffer, void *buf, u32 len);
  57. /* --------------------------------------------------------------------------*/
  58. /**
  59. * @brief 适用范围:全局
  60. * @brief 判断是否可写入len字节长度的数据
  61. *
  62. * @param [in] cbuffer cbuffer 句柄
  63. * @param [in] len len字节长度的数据
  64. *
  65. * @return 返回可以写入的len字节长度
  66. */
  67. /* ----------------------------------------------------------------------------*/
  68. u32 cbuf_is_write_able(cbuffer_t *cbuffer, u32 len);
  69. /* --------------------------------------------------------------------------*/
  70. /**
  71. * @brief 适用范围:外部内存管理
  72. * @brief 预分配待写入数据的空间,要和cbuf_write_updata()配套使用,更新cbuf管理handle数据。
  73. *
  74. * @param [in] cbuffer cbuffer句柄
  75. * @param [in] len 回传可以最多写入len字节长度的数据
  76. *
  77. * @return 当前写指针的地址
  78. */
  79. /* ----------------------------------------------------------------------------*/
  80. void *cbuf_write_alloc(cbuffer_t *cbuffer, u32 *len);
  81. /* --------------------------------------------------------------------------*/
  82. /**
  83. * @brief 适用范围:外部内存管理
  84. * @brief 更新cbuf管理handle的写指针位置和数据长度
  85. *
  86. * @param [in] cbuffer cbuffer句柄
  87. * @param [in] len 在非cbuffer_t结构体包含的内存空间中写入的数据的实际字节长度
  88. *
  89. * @return 当前写指针的地址
  90. */
  91. /* ----------------------------------------------------------------------------*/
  92. void cbuf_write_updata(cbuffer_t *cbuffer, u32 len);
  93. /* --------------------------------------------------------------------------*/
  94. /**
  95. * @brief 适用范围:外部内存管理
  96. * @brief 预分配待读取数据的空间,需要和cbuf_read_updata()配套使用,更新cbuf管理handle数据
  97. *
  98. * @param [in] cbuffer cbuffer 句柄
  99. * @param [in] len 回传可以最多读取len字节长度的数据
  100. *
  101. * @return 当前读指针的地址
  102. */
  103. /* ----------------------------------------------------------------------------*/
  104. void *cbuf_read_alloc(cbuffer_t *cbuffer, u32 *len);
  105. /* --------------------------------------------------------------------------*/
  106. /**
  107. * @brief 适用范围:外部内存管理
  108. * @brief 更新cbuf管理handle的读指针位置和数据长度
  109. *
  110. * @param [in] cbuffer cbuffer 句柄
  111. * @param [in] len 在非cbuffer_t结构体包含的内存空间中读取的数据的实际字节长度
  112. */
  113. /* ----------------------------------------------------------------------------*/
  114. void cbuf_read_updata(cbuffer_t *cbuffer, u32 len);
  115. /* --------------------------------------------------------------------------*/
  116. /**
  117. * @brief 适用范围:外部内存管理
  118. * @brief 清空cbuffer空间
  119. *
  120. * @param [in] cbuffer cbuffer 句柄
  121. */
  122. /* ----------------------------------------------------------------------------*/
  123. void cbuf_clear(cbuffer_t *cbuffer);
  124. /* --------------------------------------------------------------------------*/
  125. /**
  126. * @brief 适用范围:cb_memcpy管理。
  127. * @brief 指定位置进行数据重写
  128. *
  129. * @param [in] cbuffer cbuffer 句柄
  130. * @param [in] begin 指向需要重写内容的开始地址
  131. * @param [out] buf 指向用于存储重写内容的目标数组
  132. * @param [in] len 待重写内容的长度
  133. *
  134. * @return 成功重写的字节长度
  135. */
  136. /* ----------------------------------------------------------------------------*/
  137. u32 cbuf_rewrite(cbuffer_t *cbuffer, void *begin, void *buf, u32 len);
  138. /* --------------------------------------------------------------------------*/
  139. /**
  140. * @brief 适用范围:cb_memcpy管理
  141. * @brief 更新指向上一次操作的指针为当前指针,并刷新数据长度
  142. *
  143. * @param [in] cbuffer cbuffer 句柄
  144. */
  145. /* ----------------------------------------------------------------------------*/
  146. void cbuf_discard_prewrite(cbuffer_t *cbuffer);
  147. /* --------------------------------------------------------------------------*/
  148. /**
  149. * @brief 适用范围:cb_memcpy管理
  150. * @brief 操作指针回退到上一次的操作位置,并刷新数据长度
  151. *
  152. * @param [in] cbuffer cbuffer 句柄
  153. */
  154. /* ----------------------------------------------------------------------------*/
  155. void cbuf_updata_prewrite(cbuffer_t *cbuffer);
  156. /* --------------------------------------------------------------------------*/
  157. /**
  158. * @brief 适用范围:cb_memcpy管理
  159. * @brief 回退写入内容,从上一次的操作的指针处进行覆盖填充
  160. *
  161. * @param [in] cbuffer cbuffer 句柄
  162. * @param [out] buf 指向用于覆盖写入内容的目标数组
  163. * @param [in] len 填充数据的字节长度
  164. *
  165. * @return 成功填充数据的字节长度
  166. */
  167. /* ----------------------------------------------------------------------------*/
  168. u32 cbuf_prewrite(cbuffer_t *cbuffer, void *buf, u32 len);
  169. /* --------------------------------------------------------------------------*/
  170. /**
  171. * @brief 适用范围:全局
  172. * @brief 获取指向写指针的地址
  173. *
  174. * @param [in] cbuffer cbuffer 句柄
  175. *
  176. * @return 写指针的地址
  177. */
  178. /* ----------------------------------------------------------------------------*/
  179. void *cbuf_get_writeptr(cbuffer_t *cbuffer);
  180. /* --------------------------------------------------------------------------*/
  181. /**
  182. * @brief 适用范围:全局
  183. * @brief 获取cbuffer存储的数据的字节长度
  184. *
  185. * @param [in] cbuffer cbuffer句柄
  186. *
  187. * @return 获取cbuffer存储的数据的字节长度
  188. */
  189. /* ----------------------------------------------------------------------------*/
  190. u32 cbuf_get_data_size(cbuffer_t *cbuffer);
  191. /* --------------------------------------------------------------------------*/
  192. /**
  193. * @brief 适用范围:全局
  194. * @brief 获取指向读指针的地址
  195. *
  196. * @param [in] cbuffer cbuffer句柄
  197. *
  198. * @return 读指针的地址
  199. */
  200. /* ----------------------------------------------------------------------------*/
  201. void *cbuf_get_readptr(cbuffer_t *cbuffer);
  202. /* --------------------------------------------------------------------------*/
  203. /**
  204. * @brief 适用范围:全局
  205. * @brief 读指针向后回退
  206. *
  207. * @param [in] cbuffer cbuffer 句柄
  208. * @param [in] len 要回退的字节长度
  209. *
  210. * @return 成功回退的字节长度
  211. */
  212. /* ----------------------------------------------------------------------------*/
  213. u32 cbuf_read_goback(cbuffer_t *cbuffer, u32 len);
  214. /* --------------------------------------------------------------------------*/
  215. /**
  216. * @brief 适用范围:全局
  217. * @brief 获取存储数据的字节长度
  218. *
  219. * @param [in] cbuffer cbuffer 句柄
  220. *
  221. * @return 存储数据的字节长度
  222. */
  223. /* ----------------------------------------------------------------------------*/
  224. u32 cbuf_get_data_len(cbuffer_t *cbuffer);
  225. /* --------------------------------------------------------------------------*/
  226. /**
  227. * @brief 适用范围:memcpy管理+cbuf_read_alloc系列管理函数
  228. * @brief 预分配待读取数据的空间,并把读取到的数据存入buf数组
  229. *
  230. * @param [in] cbuffer cbuffer 句柄
  231. * @param [out] buf 存储读取的数据的目标buf数组
  232. * @param [in] len 要读取的数据的字节长度
  233. *
  234. * @return
  235. */
  236. /* ----------------------------------------------------------------------------*/
  237. u32 cbuf_read_alloc_len(cbuffer_t *cbuffer, void *buf, u32 len);
  238. /* --------------------------------------------------------------------------*/
  239. /**
  240. * @brief 适用范围:memcpy管理+cbuf_read_alloc系列管理函数
  241. * @brief 更新cbuf管理handle的读指针位置和数据长度
  242. *
  243. * @param [in] cbuffer cbuffer 句柄
  244. * @param [in] len 要更新的数据的字节长度
  245. */
  246. /* ----------------------------------------------------------------------------*/
  247. void cbuf_read_alloc_len_updata(cbuffer_t *cbuffer, u32 len);
  248. #endif