- /**
- ***************************************************
- * [url=home.php?mod=space&uid=247401]@brief[/url] func_fifo_CmpLower
- * [url=home.php?mod=space&uid=536309]@NOTE[/url] 比较FIFO重数据的底层函数,不进行标志位操作。
- * @param fifo
- * 指向待操作的FIFO,
- * ind
- * 从FIFO的pull后面的第ind个开始
- * len
- * 比较的长度为len
- * data
- * 比较的数据
- * timeout
- * @retval FifoErr
- * [url=home.php?mod=space&uid=130263]@DATA[/url] 2021.09.03
- * [url=home.php?mod=space&uid=638116]@auth[/url] WXL
- * @his 1.0.0.0 2021.09.03 WXL
- * create
- ***************************************************
- **/
- static FifoErr func_fifo_CmpLower(FifoTypeDef* fifo, const INT16U ind, const INT16U len, const INT8U* data)
- {
- //判断FIFO中是否有足够的数量进行比较。
- if(ind + len > fifo->CntUsed)
- {
- return FIFO_ENUM;
- }
-
- //上面的判断可以保证开始比较的位置+len不会超过FIFO的容量。
- INT8U* point = fifo->Pull + ind;
- if(point > fifo->EndPos)
- point = point - fifo->Depth;
-
- INT16U len2end = func_fifo_CalPoint2end(fifo,point);
- if(len2end >= len)
- {
- if(memcmp(data,point,len) == 0)
- {
- return FIFO_EOK;
- }
- else
- {
- return FIFO_EFAILED;
- }
- }
- else
- {
- if(memcmp(data,point,len2end) == 0 && memcmp(data+len2end,fifo->Buf,len-len2end) == 0 )
- {
- return FIFO_EOK;
- }
- else
- {
- return FIFO_EFAILED;
- }
- }
- }
-
- /**
- ***************************************************
- * @brief func_fifo_DeleteLower
- * @note 删除FIFO数据的底层函数,不进行标志位操作。
- * @param fifo
- * 指向待操作的FIFO,
- * num
- * 删除的元素个数
- * @retval FifoErr
- * @data 2021.09.03
- * @auth WXL
- * @his 1.0.0.0 2021.09.03 WXL
- * create
- ***************************************************
- **/
- FifoErr func_fifo_DeleteLower(FifoTypeDef* fifo, INT16U num)
- {
- //删除的数据大于FIFO已使用数据。
- if(num > fifo->CntUsed)
- {
- return FIFO_ENUM;
- }
-
- //开始删除数据
- INT16U len2end = func_fifo_CalPoint2end(fifo,fifo->Pull);
- if(len2end >= num)
- {
- memset(fifo->Pull , 0 , num);
- }
- else
- {
- memset(fifo->Pull , 0 , len2end);
- memset(fifo->Buf , 0 , num - len2end);
- }
- fifo->CntUsed -= num;
- func_fifo_PullOffset(fifo,num);
- return FIFO_EOK;
- }
- /**
- ***************************************************
- * @brief func_fifo_Push2Back
- * @note 中断中进行FIFO写入操作时,FIFO繁忙调用该函数写入到back
- * @param fifo
- * 指向待操作的FIFO,
- * num
- * 删除的元素个数
- * data
- * 指向写入数据
- * @retval FifoErr
- * @data 2021.09.03
- * @auth WXL
- * @his 1.0.0.0 2021.09.03 WXL
- * create
- ***************************************************
- **/
- static void func_fifo_Push2Back(FifoTypeDef* fifo, INT16U num, INT8U* data)
- {
- INT16 offset = 0;
-
- INT8U* srcpos = 0;
- INT8U* despos = 0;
- INT16U len = 0;
-
- //现有数据和待写入数据的总数大于BACK的容量,进行元素替换操作。
- if(num + fifo->BackCount > fifo->Depth)
- {
- offset = num + fifo->BackCount - fifo->Depth;
- //现有元素全部被替换。
- if(offset >= fifo->BackCount)
- {
- offset = num - fifo->Depth;
- //写入新数据
- srcpos = data+offset;
- despos = fifo->BackBuf;
- len = fifo->Depth;
- memcpy(despos, srcpos, len);
- }
- else
- {
- //更新原有数据
- srcpos = fifo->BackBuf + offset;
- despos = fifo->BackBuf;
- len = fifo->BackCount - offset;
- memcpy(despos, srcpos, len);
- //写入新数据。
- srcpos = data;
- despos = despos + len;
- len = num;
- memcpy(despos, srcpos, len);
- }
- fifo->BackCount = fifo->Depth;
- }
- //现有数据和待写入数据的总数不大于FIFO的容量,将现有数据附加到back
- else
- {
- srcpos = data;
- despos = fifo->BackBuf + fifo->BackCount;
- len = num;
- fifo->BackCount += num;
- memcpy(despos, srcpos, len);
- }
- }
-
- /**
- ***************************************************
- * @brief func_fifo_Push2Fifo
- * @note 将数据写入到FIFO缓冲区中,仅在FIFO不繁忙时调用,
- * 1、首先将Back数据写入到FIFO中。
- * 2、将待写入数据写入到FIFO中。
- * @param fifo
- * 指向待操作的FIFO,
- * num
- * 删除的元素个数
- * data
- * 指向写入数据
- * @retval FifoErr
- * @data 2021.09.03
- * @auth WXL
- * @his 1.0.0.0 2021.09.03 WXL
- * create
- ***************************************************
- **/
- static void func_fifo_Push2Fifo(FifoTypeDef* fifo, INT16U num, INT8U* data)
- {
- INT16 offset = 0;
- INT16 len2end = func_fifo_CalPoint2end(fifo,fifo->Push);
- INT16 num2push = 0;
-
- INT8U* srcpos = 0;
- INT8U* despos = 0;
- INT16U len = 0;
-
- //back数据和data数据之和大于depth,存在back和data丢弃数据的情况。
- if(fifo->BackCount + num > fifo->Depth)
- {
- num2push = fifo->Depth;
- offset = fifo->BackCount + num -fifo->Depth;
- }
- else
- {
- num2push = fifo->BackCount + num;
- }
-
- //到FIFO结尾可以容纳写入的数据,说明不存在覆盖情况。将back和带写入数据写入即可。
- if(len2end >= num2push)
- {
- //写入BACK
- srcpos = fifo->BackBuf;
- despos = fifo->Push;
- len = fifo->BackCount;
- memcpy(despos, srcpos, len);
- //写入data
- srcpos = data;
- despos = despos + len;
- len = num;
- memcpy(despos, srcpos, len);
- }
- //存在回头写的情况
- else
- {
- //偏移量大于back的个数,back区域不执行写入操作。
- if(offset >= fifo->BackCount)
- {
- //写入到队尾。
- srcpos = data + offset - fifo->BackCount;
- despos = fifo->Push;
- len = len2end;
- memcpy(despos, srcpos, len);
- //重头写入
- srcpos = srcpos + len;
- despos = fifo->Buf;
- len = num2push - len2end;
- memcpy(despos, srcpos, len);
- }
- //写入备份区域和数据区域数据。
- else
- {
- INT16U back2push = fifo->BackCount - offset;
- if(len2end >= back2push)
- {
- //写入back
- srcpos = fifo->BackBuf + offset;
- despos = fifo->Push;
- len = back2push;
- memcpy(despos, srcpos, len);
- //写入DATA到队尾
- srcpos = data;
- despos = despos + len;
- len = len2end - len;
- memcpy(despos, srcpos, len);
- //重头写
- srcpos = data + len;
- despos = fifo->Buf;
- len = num2push - back2push ;
- memcpy(despos, srcpos, len);
- }
- else
- {
- //写入back
- srcpos = fifo->BackBuf + offset;
- despos = fifo->Push;
- len = len2end;
- memcpy(despos, srcpos, len);
- //重头写BACK
- srcpos = srcpos + len;
- despos = fifo->Buf;
- len = back2push - len;
- memcpy(despos, srcpos, len);
- //写DATA
- srcpos = data;
- despos = despos + len;
- len = num2push - back2push;
- memcpy(despos, srcpos, len);
- }
- }
- }
- fifo->BackCount = 0;
- if(num2push + fifo->CntUsed > fifo->Depth)
- {
- num2push -= 1;
- num2push += 1;
- }
- func_fifo_PushOffset(fifo,num2push);
-
- fifo->CntUsed += num2push;
- if(fifo->CntUsed >= fifo->Depth)
- {
- fifo->CntUsed = fifo->Depth;
- fifo->Pull = fifo->Push;
- }
- }
-
- static FifoErr func_fifo_PullLower(FifoTypeDef* fifo, INT16U num, INT8U* data, INT16U* len, INT8U mode)
- {
- INT16U len2end = func_fifo_CalPoint2end(fifo,fifo->Pull);
- INT16U num2pull = 0;
-
- if(fifo->CntUsed == 0)
- {
- return FIFO_ENUM;
- }
-
- //全部模式
- if(mode == 0)
- {
- if(fifo->CntUsed >= num)
- {
- num2pull = num;
- }
- else
- {
- return FIFO_ENUM;
- }
- }
- //PART模式
- else
- {
- if(fifo->CntUsed >= num)
- {
- num2pull = num;
- }
- else
- {
- num2pull = fifo->CntUsed;
- }
- *len = num2pull;
- }
-
- if(len2end >= num2pull)
- {
- memcpy(data , fifo->Pull , num2pull);
- memset(fifo->Pull , 0 , num2pull);
- }
- //需要重头读取。
- else
- {
- memcpy(data , fifo->Pull, len2end);
- memset(fifo->Pull , 0 , len2end);
- memcpy(data+len2end , fifo->Buf , num2pull-len2end);
- memset(fifo->Buf , 0 , num2pull-len2end);
- }
- //读位置和使用量更新。
- func_fifo_PullOffset(fifo,num2pull);
- fifo->CntUsed -= num2pull;
- return FIFO_EOK;
- }