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. 编译和运行结果

 

posted on 2023-06-25 18:58  NJ_Leon  阅读(35)  评论(0编辑  收藏  举报

导航