[其他ST产品] 一个严谨的FIFO(RING BUFF)

[复制链接]
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:32 | 显示全部楼层
/**
***************************************************
* @brief   func_fifo_FindDelete
* @note    比较FIFO中数据
* @param   fifo
*                           指向待操作的FIFO,
*          ind
*                            从FIFO的pull后面的第ind个开始
*          len
*                           比较的长度为len
*          data
*                            比较的数据
*          timeout
*                           等待busy 超时时间,单位ms
*          timeout
* @retval  FifoErr
* @data    2021.09.03
* @auth    WXL
* @his     1.0.0.0     2021.09.03     WXL
*               create
***************************************************
**/
FifoErr func_fifo_Find(FifoTypeDef* fifo, INT16U ind, INT8U* data, INT16U len,  INT16U* pos)
{
    FifoErr err = FIFO_EOK;
    INT16U      cycle = 0;

    if(FIFO_INIT_CHECK(fifo) == 0)
    {
            return FIFO_EINIT;
    }

        FIFO_SET_BUSY(fifo);
    INT16U times = fifo->CntUsed - ind - len - 1;
    err = FIFO_EFAILED;
    while(cycle < times)
    {
        if(func_fifo_CmpLower(fifo, ind+cycle, len, data) == FIFO_EOK)
        {
            err = FIFO_EOK;
            *pos = cycle;
            break;
        }
        cycle++;
    }
    FIFO_RESET_BUSY(fifo);

    return err;
}
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:32 | 显示全部楼层
获取FIFO的使用量,需要操作busy标志位
INT16U func_fifo_GetUsed(FifoTypeDef* fifo)
{
        INT16U num = 0;

        FIFO_SET_BUSY(fifo);
        num = fifo->CntUsed;
        FIFO_RESET_BUSY(fifo);
        return num;
}
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:32 | 显示全部楼层
FIFO使用定时器的回调函数。回调函数中判断FIFO的标志位。对不同类型的FIFO执行不同的操作。

中断写入类型的FIFO,进行备份去数据的写入
/**
***************************************************
* @brief   func_fifo_TimerCallBack
* @note    FIFO链表定时器中断回调
* @param   NONE
* @retval  NONE
* @data    2021.09.03
* @auth    WXL
* @his     1.0.0.0     2021.09.03     WXL
*               create
***************************************************
**/
void func_fifo_TimerCallBack()
{
        FifoTypeDef*    point = FifoChain;

        while(point!= NULL)
        {
                //FIFO 不繁忙   不在中断中
                if(FIFO_GET_BUSY(point) == 0 && FIFO_GET_INT(point) == 0)
                {
                        if(point->Type == FIFO_TYPE_INT_PUSH && point->BackCount != 0)
                        {
                                func_fifo_Push2Fifo(point, 0, 0);
                        }
                        else if(point->Type == FIFO_TYPE_INT_PULL && point->CntUsed != 0)
                        {
                                point->func_timmer();
                        }
                }
                point = point->Next;
        }
}
单片小菜 发表于 2023-11-29 16:01 | 显示全部楼层
有没有完整的例子程序?
小夏天的大西瓜 发表于 2023-11-29 22:43 | 显示全部楼层
这个FIFO应该是MCU自动控制的吧
Undshing 发表于 2023-11-30 16:46 来自手机 | 显示全部楼层
FIFO是什么啊
Uriah 发表于 2024-8-16 07:31 | 显示全部楼层

环氧树脂由于硬度的原因不能用于应力敏感和含有贴片元件的模块灌封,在模块电源中基本被淘汰
帛灿灿 发表于 2024-8-16 09:27 | 显示全部楼层

产生一个充电放电的过程
Bblythe 发表于 2024-8-16 10:30 | 显示全部楼层

齐纳二极管作为ESD保护与单向TVS原理相同
周半梅 发表于 2024-8-16 12:26 | 显示全部楼层

之所以称为ESD静电保护器
Pulitzer 发表于 2024-8-16 13:29 | 显示全部楼层

钳位二极管最常用于集成电路中
童雨竹 发表于 2024-8-16 15:25 | 显示全部楼层

它迅速由高阻态变为低阻态
Wordsworth 发表于 2024-8-16 16:28 | 显示全部楼层

减少反射,避免振荡,方便调试
Clyde011 发表于 2024-8-16 17:31 | 显示全部楼层

大于1的定义为极高导热的性能,而对于模块电源此水平的导热系数是无法达到其散热功能的需求
公羊子丹 发表于 2024-8-16 18:24 | 显示全部楼层

得到正常工作状态下的输出电压和电流。
万图 发表于 2024-8-16 19:27 | 显示全部楼层

在电路中有部分电子元器件比较“脆弱”
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部