ringblk_buf.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * Copyright (c) 2006-2018, 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. /*
  13. * Introduction:
  14. * The rbb is the ring buffer which is composed with many blocks. It is different from the ring buffer.
  15. * The ring buffer is only composed with chars. The rbb put and get supported zero copies. So the rbb
  16. * is very suitable for put block and get block by a certain order. Such as DMA block transmit,
  17. * communicate frame send/recv, and so on.
  18. */
  19. #include <stdint.h>
  20. #include <stddef.h>
  21. #include <aos/list.h>
  22. #ifdef __cplusplus
  23. extern "C" {
  24. #endif
  25. enum rbb_status {
  26. /* unused status when first initialize or after blk_free() */
  27. RBB_BLK_UNUSED,
  28. /* initialized status after blk_alloc() */
  29. RBB_BLK_INITED,
  30. /* put status after blk_put() */
  31. RBB_BLK_PUT,
  32. /* get status after blk_get() */
  33. RBB_BLK_GET,
  34. };
  35. typedef enum rbb_status rbb_status_t;
  36. /**
  37. * the block of rbb
  38. */
  39. struct rbb_blk {
  40. rbb_status_t status :8;
  41. /* less then 2^24 */
  42. size_t size :24;
  43. uint8_t *buf;
  44. slist_t list;
  45. };
  46. typedef struct rbb_blk *rbb_blk_t;
  47. /**
  48. * Rbb block queue: the blocks (from block1->buf to blockn->buf) memory which on this queue is continuous.
  49. */
  50. struct rbb_blk_queue {
  51. rbb_blk_t blocks;
  52. size_t blk_num;
  53. };
  54. typedef struct rbb_blk_queue *rbb_blk_queue_t;
  55. /**
  56. * ring block buffer
  57. */
  58. struct _rbb {
  59. uint8_t *buf;
  60. size_t buf_size;
  61. /* all of blocks */
  62. rbb_blk_t blk_set;
  63. size_t blk_max_num;
  64. /* saved the initialized and put status blocks */
  65. slist_t blk_list;
  66. };
  67. typedef struct _rbb *rbb_t;
  68. /* rbb (ring block buffer) API */
  69. void rbb_init(rbb_t rbb, uint8_t *buf, size_t buf_size, rbb_blk_t block_set, size_t blk_max_num);
  70. rbb_t rbb_create(size_t buf_size, size_t blk_max_num);
  71. void rbb_destroy(rbb_t rbb);
  72. size_t rbb_get_buf_size(rbb_t rbb);
  73. /* rbb block API */
  74. rbb_blk_t rbb_blk_alloc(rbb_t rbb, size_t blk_size);
  75. void rbb_blk_put(rbb_blk_t block);
  76. rbb_blk_t rbb_blk_get(rbb_t rbb);
  77. size_t rbb_blk_size(rbb_blk_t block);
  78. uint8_t *rbb_blk_buf(rbb_blk_t block);
  79. void rbb_blk_free(rbb_t rbb, rbb_blk_t block);
  80. /* rbb block queue API */
  81. size_t rbb_blk_queue_get(rbb_t rbb, size_t queue_data_len, rbb_blk_queue_t blk_queue);
  82. size_t rbb_blk_queue_len(rbb_blk_queue_t blk_queue);
  83. uint8_t *rbb_blk_queue_buf(rbb_blk_queue_t blk_queue);
  84. void rbb_blk_queue_free(rbb_t rbb, rbb_blk_queue_t blk_queue);
  85. size_t rbb_next_blk_queue_len(rbb_t rbb);
  86. #ifdef __cplusplus
  87. }
  88. #endif
  89. #endif /* _RINGBLK_BUF_H_ */