#include "irda_raw.h"
/* 移动缓冲区的指针 */
#define NEXT_PLACE(i) ((i+1) & 0x3ff)
/* 定义缓冲区大小 */
static irda_raw_enent g_events[1024];
/* 缓冲区写指针 */
static int g_w = 0;
/* 缓冲区读指针 */
static int g_r = 0;
/* 判断是否为空 */
static int is_ir_event_buf_empty(void) {
return g_r == g_w;
}
/* 判断是否为满 */
static int is_ir_event_buf_full(void) {
return NEXT_PLACE(g_w) == g_r;
}
int ir_event_put(p_irda_raw_enent pd) {
if(is_ir_event_buf_full()) {
return -1;
}
g_events[g_w] = *pd;
g_w = NEXT_PLACE(g_w);
return 0;
}
int ir_event_get(p_irda_raw_enent pd) {
if(is_ir_event_buf_empty()) {
return -1;
}
*pd = g_events[g_r];
g_r = NEXT_PLACE(g_r);
return 0;
}
int ir_event_get_timeout(p_irda_raw_enent pd, int timeout_us) {
while(timeout_us--) {
if(!is_ir_event_buf_empty()) {
*pd = g_events[g_r];
g_r = NEXT_PLACE(g_r);
return 0;
}
udelay(1);
}
return -1;
}
C语言 | 环形缓冲区
最新推荐文章于 2022-09-01 12:47:56 发布