c语言实现简单实用的循环队列
2023-06-25 https://www.cnblogs.com/NJ-Leon/
1. fifo.h 文件
#ifndef __FIFO_H__ #define __FIFO_H__ #define FIFO_SIZE 8 // 根据实际需要,自行修改 typedef struct { int16_t data_0; int16_t data_1; } fifo_data_t; typedef struct { uint16_t r_ptr; uint16_t w_ptr; uint16_t count; /* number of elements in the fifo buffer */ fifo_data_t buf[FIFO_SIZE]; } fifo_t; extern void fifo_reset(fifo_t *fifo); extern bool fifo_write(fifo_t *fifo, fifo_data_t w_data); extern bool fifo_read(fifo_t *fifo, fifo_data_t *r_data); extern bool fifo_is_empty(fifo_t *fifo); extern bool fifo_is_full(fifo_t *fifo); #endif // __FIFO_H__
2. fifo.c 文件
#include <stdbool.h> #include "type_def.h" #include "fifo.h" /* addr: 0 - (FIFO_SIZE - 1) */ #define FIFO_ADDR(x) (((x) + 1) == FIFO_SIZE ? 0 : ((x) + 1)) void fifo_reset(fifo_t *fifo) { fifo->r_ptr = 0; fifo->w_ptr = 0; fifo->count = 0; return; } bool fifo_write(fifo_t *fifo, fifo_data_t w_data) { if (fifo->count >= FIFO_SIZE) { return false; } fifo->buf[fifo->w_ptr].data_0 = w_data.data_0; fifo->buf[fifo->w_ptr].data_1 = w_data.data_1; fifo->w_ptr = FIFO_ADDR(fifo->w_ptr); fifo->count++; return true; } bool fifo_read(fifo_t *fifo, fifo_data_t *r_data) { if (fifo->count == 0) { return false; } r_data->data_0 = fifo->buf[fifo->r_ptr].data_0; r_data->data_1 = fifo->buf[fifo->r_ptr].data_1; fifo->r_ptr = FIFO_ADDR(fifo->r_ptr); fifo->count--; return true; } bool fifo_is_empty(fifo_t *fifo) { if (fifo->count == 0) { return true; } return false; } bool fifo_is_full(fifo_t *fifo) { if (fifo->count >= FIFO_SIZE) { return true; } return false; }
3. main.c 测试代码
#include <stdio.h> #include <stdbool.h> #include "type_def.h" #include "fifo.h" int main() { fifo_t fifo; fifo_data_t w_data, r_data; uint8_t i; fifo_reset(&fifo); printf("line: %d, empty = %d, full = %d\n", __LINE__, fifo_is_empty(&fifo), fifo_is_full(&fifo)); for (i = 0; i <= FIFO_SIZE; i++) { w_data.data_0 = i; w_data.data_1 = i + 1; if (!fifo_write(&fifo, w_data)) { printf("line: %d, write failed\n", __LINE__); } } printf("line: %d, empty = %d, full = %d\n", __LINE__, fifo_is_empty(&fifo), fifo_is_full(&fifo)); for (i = 0; i <= FIFO_SIZE; i++) { if (!fifo_read(&fifo, &r_data)) { printf("line: %d, read failed\n", __LINE__); } else { printf("line: %d, read: %d, %d\n", __LINE__, r_data.data_0, r_data.data_1); } } printf("line: %d, empty = %d, full = %d\n", __LINE__, fifo_is_empty(&fifo), fifo_is_full(&fifo)); return 0; }
4. 编译和运行结果