mm_fifo环形队列

简要

FIFO: First in, First out代表先进的数据先出 ,后进的数据后出。

仓库地址

  1. https://gitee.com/mengplus/mm_fifo.git

为什么需要FIFO?

FIFO存储器是系统的缓冲环节,如果没有FIFO存储器,整个系统就不可能正常工作。

FIFO的功能可以概括为

(1)对连续的数据流进行缓存,防止在进机和存储操作时丢失数据;

(2)数据集中起来进行进机和存储,可避免频繁的总线操作,减轻CPU的负担;

(3)允许系统进行DMA操作,提高数据的传输速度。这是至关重要的一点,如果不采用DMA操作,数据传输将达不到传输要求,而且大大增加CPU的负担,无法同时完成数据的存储工作。

微型的环形队列,尽可能兼容多种应用环境,降低环境依赖

操作介绍

    typedef struct _MM_FIFO mm_fifo_t;
    /**
     * @brief 初始化环形队列空间
     * @note 为了更好的兼容应用场景,内部不做内存申请
     * @param data_ptr 缓存区地址
     * @param data_size 缓存区大小
     */
    void mm_fifo_init(void *data_ptr, size_t data_size);
    /**
     * @brief 判断是否为空
     * @param self 队列的句柄
     * @return true:队列为空 false 不空
     */
    bool mm_fifo_is_empty(mm_fifo_t *self);
    /**
     * @brief 判断是否为满
     * @param self 队列的句柄
     * @return true:队列为满 false 不满
     */
    bool mm_fifo_is_full(mm_fifo_t *self);
    /**
     * @brief 存入一个数据
     * @param self 队列的句柄
     * @param dat 存入的数据
     * @return true:存入成功 false 失败
     */
    bool mm_fifo_push(mm_fifo_t *self, uint8_t dat);
    /**
     * @brief 取出一个数据
     * @note 未做空判定,用户自行调用
     * @param self 队列的句柄
     * @return 取出的数据
     */
    uint8_t mm_fifo_pop(mm_fifo_t *self);
    /**
     * @brief 取出一个数据
     * @note 取出数据,不从队列中清除
     * @param self 队列的句柄
     * @return 待取出的数据
     */
    uint8_t mm_fifo_pop_peek(mm_fifo_t *self);
    /**
     * @brief 存入多个数据
     * @param self 队列的句柄
     * @param dat 待存入的数据
     * @param data_size 数据数量
     * @return 实际存进去的数据数量
     */
    size_t mm_fifo_push_multi(mm_fifo_t *self, uint8_t *dat, size_t data_size);
    /**
     * @brief 取出多个数据
     * @param self 队列的句柄
     * @param dat 取出数据存放空间
     * @param data_size 要取出的数据
     * @return 实际取出来的数据
     */
    size_t mm_fifo_pop_multi(mm_fifo_t *self, uint8_t *dat, size_t data_size);
    /**
     * @brief 取出多个数据,不从队列中移除
     * @param self 队列的句柄
     * @param dat 取出数据存放空间
     * @param data_size 要取出的数据
     * @return 实际取出来的数据
     */
    size_t mm_fifo_pop_multi_peek(mm_fifo_t *self, uint8_t *dat, size_t data_size);
    /**
     * @brief 未使用空间
     * @param self 队列的句柄
     * @return 队列中元素的数量
     */
    size_t mm_fifo_get_used_space(mm_fifo_t *self);
    /**
     * @brief 使用的空间
     * @param self 队列的句柄
     * @return 队列中空闲的数量
     */
    size_t mm_fifo_get_unused_space(mm_fifo_t *self);

demo


#include <stdio.h>
#include "mm_fifo.h"

uint8_t buff[512];
uint8_t rebuff[128];
int main(int argc, char **argv)
{
    mm_fifo_t *pfifo = mm_fifo_init(buff, sizeof(buff));
    printf("fifo init: %ld\n", sizeof(buff));
    printf("used_space: %ld\n", mm_fifo_get_used_space(pfifo));
    printf("unused_space: %ld\n", mm_fifo_get_unused_space(pfifo));

    for (int i = 0; i < 50; i++)
    { // 装入数据
        mm_fifo_push(pfifo, i);
    }
    printf("used_space: %ld\n", mm_fifo_get_used_space(pfifo));
    printf("unused_space: %ld\n", mm_fifo_get_unused_space(pfifo));

    size_t result = mm_fifo_pop_multi_peek(pfifo, rebuff, sizeof(rebuff));

    printf("pop: %ld\n", result);
    for (size_t i = 0; i < result; i++)
    {
        printf("%d ", rebuff[i]);
    }
    printf("\r\n");

    size_t result = mm_fifo_pop_multi(pfifo, rebuff, sizeof(rebuff));

    printf("pop: %ld\n", result);
    for (size_t i = 0; i < result; i++)
    {
        printf("%d ", rebuff[i]);
    }
    printf("\r\n");
    return 0;
}

demo

make  -C ./demo/ clean #编译demo
./demo/demo.out        #执行例程

联系我

使用中发现的问题请提交工单

交流群见QQ 790012859

Last updated