主页
  • README
  • 主页
  • journal日记
    • rtthreadv5.1.0
  • embedded嵌入式开发
    • SSPI
    • fsm状态机
      • 事件驱动型状态机
    • mm_fifo环形队列
    • lvgl
      • font字体生成
    • 经验分享
      • Byte alignment and protocol parsing
  • rt-thread笔记
    • repo
    • 线程
    • 设备
      • 串口
  • openharmony笔记
  • scons笔记
  • 公共基础库
    • 嵌入式utils
    • 鸿蒙utils
  • 开发与部署
    • gitbook
    • gitea服务器
      • gitea官方指导部署
      • Bitnami部署
    • 让Linux磁盘空间的弹性管理
    • docker笔记
      • docker
      • container
      • docker-compose
      • docker-machine
      • Portainer可视化界面
    • 1Panel运维管理面板
      • 家庭云的公网访问
      • 1Panel快速配置TCP代理
      • 端口转发访问内网
    • 服务器推荐
    • 极路由3刷机
    • ipv6公网
    • ddns动态域名
    • nginx反向代理
    • jumpserver堡垒机
    • bt宝塔
    • service自启服务
    • cloudreve部署
    • proxy代理
  • 工具收集
    • git笔记
      • git-push
      • git-flow
      • git-svn
      • EWARM
      • 常见需求
    • UsbEAm Hosts Editor
    • keil_下载地址
    • iar_下载地址
  • 相关链接
    • gitee首页
    • github首页
    • B站首页
    • gitea仓库备份
    • blog地址
Powered by GitBook
On this page
  • 简要
  • 仓库地址
  • 为什么需要FIFO?
  • 操作介绍
  • demo
  • demo
  • 联系我
  1. embedded嵌入式开发

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

Previous事件驱动型状态机Nextlvgl

Last updated 1 year ago