发新帖我要提问
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是什么啊

使用特权

评论回复
27
Uriah| | 2024-8-16 07:31 | 只看该作者

环氧树脂由于硬度的原因不能用于应力敏感和含有贴片元件的模块灌封,在模块电源中基本被淘汰

使用特权

评论回复
28
帛灿灿| | 2024-8-16 09:27 | 只看该作者

产生一个充电放电的过程

使用特权

评论回复
29
Bblythe| | 2024-8-16 10:30 | 只看该作者

齐纳二极管作为ESD保护与单向TVS原理相同

使用特权

评论回复
30
周半梅| | 2024-8-16 12:26 | 只看该作者

之所以称为ESD静电保护器

使用特权

评论回复
31
Pulitzer| | 2024-8-16 13:29 | 只看该作者

钳位二极管最常用于集成电路中

使用特权

评论回复
32
童雨竹| | 2024-8-16 15:25 | 只看该作者

它迅速由高阻态变为低阻态

使用特权

评论回复
33
Wordsworth| | 2024-8-16 16:28 | 只看该作者

减少反射,避免振荡,方便调试

使用特权

评论回复
34
Clyde011| | 2024-8-16 17:31 | 只看该作者

大于1的定义为极高导热的性能,而对于模块电源此水平的导热系数是无法达到其散热功能的需求

使用特权

评论回复
35
公羊子丹| | 2024-8-16 18:24 | 只看该作者

得到正常工作状态下的输出电压和电流。

使用特权

评论回复
36
万图| | 2024-8-16 19:27 | 只看该作者

在电路中有部分电子元器件比较“脆弱”

使用特权

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

本版积分规则