发新帖我要提问
12
返回列表
打印
[其他ST产品]

一个严谨的FIFO(RING BUFF)

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
21
梵蒂冈是神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;
}

使用特权

评论回复
22
梵蒂冈是神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;
}

使用特权

评论回复
23
梵蒂冈是神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;
        }
}

使用特权

评论回复
24
单片小菜| | 2023-11-29 16:01 | 只看该作者
有没有完整的例子程序?

使用特权

评论回复
25
小夏天的大西瓜| | 2023-11-29 22:43 | 只看该作者
这个FIFO应该是MCU自动控制的吧

使用特权

评论回复
26
Undshing| | 2023-11-30 16:46 | 只看该作者
FIFO是什么啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则