ringblk_buf.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-08-25 armink the first version
  9. */
  10. #ifndef _RINGBLK_BUF_H_
  11. #define _RINGBLK_BUF_H_
  12. #include <rtdef.h>
  13. #include <rtconfig.h>
  14. /*
  15. * Introduction:
  16. * The rbb is the ring buffer which is composed with many blocks. It is different from the ring buffer.
  17. * The ring buffer is only composed with chars. The rbb put and get supported zero copies. So the rbb
  18. * is very suitable for put block and get block by a certain order. Such as DMA block transmit,
  19. * communicate frame send/recv, and so on.
  20. */
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. enum rt_rbb_status
  25. {
  26. /* unused status when first initialize or after blk_free() */
  27. RT_RBB_BLK_UNUSED,
  28. /* initialized status after blk_alloc() */
  29. RT_RBB_BLK_INITED,
  30. /* put status after blk_put() */
  31. RT_RBB_BLK_PUT,
  32. /* get status after blk_get() */
  33. RT_RBB_BLK_GET,
  34. };
  35. typedef enum rt_rbb_status rt_rbb_status_t;
  36. /**
  37. * the block of rbb
  38. */
  39. struct rt_rbb_blk
  40. {
  41. rt_rbb_status_t status :8;
  42. /* less then 2^24 */
  43. rt_size_t size :24;
  44. rt_uint8_t *buf;
  45. rt_slist_t list;
  46. };
  47. typedef struct rt_rbb_blk *rt_rbb_blk_t;
  48. /**
  49. * Rbb block queue: the blocks (from block1->buf to blockn->buf) memory which on this queue is continuous.
  50. */
  51. struct rt_rbb_blk_queue
  52. {
  53. rt_rbb_blk_t blocks;
  54. rt_size_t blk_num;
  55. };
  56. typedef struct rt_rbb_blk_queue *rt_rbb_blk_queue_t;
  57. /**
  58. * ring block buffer
  59. */
  60. struct rt_rbb
  61. {
  62. rt_uint8_t *buf;
  63. rt_size_t buf_size;
  64. /* all of blocks */
  65. rt_rbb_blk_t blk_set;
  66. rt_size_t blk_max_num;
  67. /* saved the initialized and put status blocks */
  68. rt_slist_t blk_list;
  69. /* point to tail node */
  70. rt_slist_t *tail;
  71. /* free node list */
  72. rt_slist_t free_list;
  73. struct rt_spinlock spinlock;
  74. };
  75. typedef struct rt_rbb *rt_rbb_t;
  76. /* rbb (ring block buffer) API */
  77. void rt_rbb_init(rt_rbb_t rbb, rt_uint8_t *buf, rt_size_t buf_size, rt_rbb_blk_t block_set, rt_size_t blk_max_num);
  78. rt_size_t rt_rbb_get_buf_size(rt_rbb_t rbb);
  79. #ifdef RT_USING_HEAP
  80. rt_rbb_t rt_rbb_create(rt_size_t buf_size, rt_size_t blk_max_num);
  81. void rt_rbb_destroy(rt_rbb_t rbb);
  82. #endif
  83. /* rbb block API */
  84. rt_rbb_blk_t rt_rbb_blk_alloc(rt_rbb_t rbb, rt_size_t blk_size);
  85. void rt_rbb_blk_put(rt_rbb_blk_t block);
  86. rt_rbb_blk_t rt_rbb_blk_get(rt_rbb_t rbb);
  87. rt_size_t rt_rbb_blk_size(rt_rbb_blk_t block);
  88. rt_uint8_t *rt_rbb_blk_buf(rt_rbb_blk_t block);
  89. void rt_rbb_blk_free(rt_rbb_t rbb, rt_rbb_blk_t block);
  90. /* rbb block queue API */
  91. rt_size_t rt_rbb_blk_queue_get(rt_rbb_t rbb, rt_size_t queue_data_len, rt_rbb_blk_queue_t blk_queue);
  92. rt_size_t rt_rbb_blk_queue_len(rt_rbb_blk_queue_t blk_queue);
  93. rt_uint8_t *rt_rbb_blk_queue_buf(rt_rbb_blk_queue_t blk_queue);
  94. void rt_rbb_blk_queue_free(rt_rbb_t rbb, rt_rbb_blk_queue_t blk_queue);
  95. rt_size_t rt_rbb_next_blk_queue_len(rt_rbb_t rbb);
  96. #ifdef __cplusplus
  97. }
  98. #endif
  99. #endif /* _RINGBLK_BUF_H_ */