diff --git a/AppKit/fifo.c b/AppKit/fifo.c index b632666..a24e210 100644 --- a/AppKit/fifo.c +++ b/AppKit/fifo.c @@ -12,10 +12,7 @@ os_err_t fifo_put(fifo_t* self, uint8_t data){ os_size_t write_idx = self->write_idx; - os_size_t next_write_idx = write_idx + 1; - if(next_write_idx >= self->buffer_size){ - next_write_idx = 0; - } + os_size_t next_write_idx = fifo_next(self, self->write_idx); if(next_write_idx == self->read_idx){ return OS_ERR_FULL; @@ -38,10 +35,7 @@ os_err_t fifo_get(fifo_t* self, uint8_t* data){ *data = self->buffer[read_idx]; } - os_size_t next_read_idx = read_idx + 1; - if(next_read_idx >= self->buffer_size){ - next_read_idx = 0; - } + os_size_t next_read_idx = fifo_next(self, self->read_idx); self->read_idx = next_read_idx; return OS_ERR_OK; } diff --git a/AppKit/fifo.h b/AppKit/fifo.h index 0794224..b1f32bc 100644 --- a/AppKit/fifo.h +++ b/AppKit/fifo.h @@ -22,11 +22,11 @@ typedef struct fifo_t{ uint8_t* buffer; os_size_t buffer_size; - os_size_t write_idx; - os_size_t read_idx; + volatile os_size_t write_idx; + volatile os_size_t read_idx; }fifo_t; -#define FIFO_INVALID_POS ((os_size_t)(-1)) +#define FIFO_INVALID_POS ((os_size_t)(-1u)) /* ==================================================================================================== */ /* 接口 */ @@ -61,11 +61,17 @@ os_size_t fifo_capacity(fifo_t* self){ } OS_STATIC_FORCE_INLINE -os_bool_t fifo_is_full(fifo_t* self){ - os_size_t next_write_idx = self->write_idx + 1; - if(next_write_idx>=self->buffer_size){ - next_write_idx = 0; +os_size_t fifo_next(fifo_t* self, os_size_t idx){ + idx += 1; + if(idx >= self->buffer_size){ + idx = 0; } + return idx; +} + +OS_STATIC_FORCE_INLINE +os_bool_t fifo_is_full(fifo_t* self){ + os_size_t next_write_idx = fifo_next(self, self->write_idx); return (next_write_idx==self->read_idx)?OS_TRUE:OS_FALSE; }