cun
This commit is contained in:
@ -9,11 +9,19 @@ void circle_buffer_init(circle_buffer_t *cb, void *buffer, u16 capacity, u16 ele
|
||||
cb->head = 0;
|
||||
cb->tail = 0;
|
||||
cb->size = 0;
|
||||
os_mutex_create(&cb->mutex);
|
||||
}
|
||||
|
||||
// 销毁环形缓冲区
|
||||
void circle_buffer_deinit(circle_buffer_t *cb) {
|
||||
os_mutex_del(&cb->mutex, 0);
|
||||
}
|
||||
|
||||
// 向环形缓冲区写入一个元素
|
||||
bool circle_buffer_write(circle_buffer_t *cb, const void *element) {
|
||||
os_mutex_pend(&cb->mutex, 0);
|
||||
if (circle_buffer_is_full(cb)) {
|
||||
os_mutex_post(&cb->mutex);
|
||||
return false; // 缓冲区已满
|
||||
}
|
||||
|
||||
@ -22,12 +30,15 @@ bool circle_buffer_write(circle_buffer_t *cb, const void *element) {
|
||||
|
||||
cb->head = (cb->head + 1) % cb->capacity;
|
||||
cb->size++;
|
||||
os_mutex_post(&cb->mutex);
|
||||
return true;
|
||||
}
|
||||
|
||||
// 从环形缓冲区读取一个元素
|
||||
bool circle_buffer_read(circle_buffer_t *cb, void *element) {
|
||||
os_mutex_pend(&cb->mutex, 0);
|
||||
if (circle_buffer_is_empty(cb)) {
|
||||
os_mutex_post(&cb->mutex);
|
||||
return false; // 缓冲区为空
|
||||
}
|
||||
|
||||
@ -36,25 +47,38 @@ bool circle_buffer_read(circle_buffer_t *cb, void *element) {
|
||||
|
||||
cb->tail = (cb->tail + 1) % cb->capacity;
|
||||
cb->size--;
|
||||
os_mutex_post(&cb->mutex);
|
||||
return true;
|
||||
}
|
||||
|
||||
// 获取已用空间的大小(以元素为单位)
|
||||
u16 circle_buffer_get_size(circle_buffer_t *cb) {
|
||||
return cb->size;
|
||||
os_mutex_pend(&cb->mutex, 0);
|
||||
u16 size = cb->size;
|
||||
os_mutex_post(&cb->mutex);
|
||||
return size;
|
||||
}
|
||||
|
||||
// 获取剩余空间的大小(以元素为单位)
|
||||
u16 circle_buffer_get_free_space(circle_buffer_t *cb) {
|
||||
return cb->capacity - cb->size;
|
||||
os_mutex_pend(&cb->mutex, 0);
|
||||
u16 free_space = cb->capacity - cb->size;
|
||||
os_mutex_post(&cb->mutex);
|
||||
return free_space;
|
||||
}
|
||||
|
||||
// 检查缓冲区是否已满
|
||||
bool circle_buffer_is_full(circle_buffer_t *cb) {
|
||||
return cb->size == cb->capacity;
|
||||
os_mutex_pend(&cb->mutex, 0);
|
||||
bool is_full = (cb->size == cb->capacity);
|
||||
os_mutex_post(&cb->mutex);
|
||||
return is_full;
|
||||
}
|
||||
|
||||
// 检查缓冲区是否为空
|
||||
bool circle_buffer_is_empty(circle_buffer_t *cb) {
|
||||
return cb->size == 0;
|
||||
os_mutex_pend(&cb->mutex, 0);
|
||||
bool is_empty = (cb->size == 0);
|
||||
os_mutex_post(&cb->mutex);
|
||||
return is_empty;
|
||||
}
|
||||
@ -2,6 +2,7 @@
|
||||
#define CIRCLE_BUFFER_H
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "os/os_api.h"
|
||||
|
||||
// 定义环形缓冲区的结构体
|
||||
typedef struct {
|
||||
@ -11,6 +12,7 @@ typedef struct {
|
||||
u16 head; // 头部指针(写入位置,以元素为单位)
|
||||
u16 tail; // 尾部指针(读取位置,以元素为单位)
|
||||
u16 size; // 当前已用大小(以元素为单位)
|
||||
OS_MUTEX mutex; // 用于保护缓冲区的互斥锁
|
||||
} circle_buffer_t;
|
||||
|
||||
/**
|
||||
@ -22,6 +24,12 @@ typedef struct {
|
||||
*/
|
||||
void circle_buffer_init(circle_buffer_t *cb, void *buffer, u16 capacity, u16 element_size);
|
||||
|
||||
/**
|
||||
* @brief 销毁环形缓冲区,释放相关资源
|
||||
* @param cb 指向环形缓冲区结构体的指针
|
||||
*/
|
||||
void circle_buffer_deinit(circle_buffer_t *cb);
|
||||
|
||||
/**
|
||||
* @brief 向环形缓冲区写入一个元素
|
||||
* @param cb 指向环形缓冲区结构体的指针
|
||||
|
||||
Reference in New Issue
Block a user