迪文科技论坛

 找回密码
 立即注册
搜索
查看: 1633|回复: 3

T5L串口keil环形FIFO实现,解决线性缓冲溢出风险,提高利用率

[复制链接]

45

主题

254

回帖

3210

积分

论坛元老

Rank: 8Rank: 8

积分
3210
发表于 2019-11-10 00:21:55 | 显示全部楼层 |阅读模式
本帖最后由 舞指飞扬 于 2019-11-10 00:27 编辑

线性串口接受缓存区,接收到缓存数据需要尽快处理,否者下一条数据会往尾端增加覆盖,风险较大.
经过各种边界条件严格测试可用.环形缓冲可以避免以上风险,并且可提高内存利用率,具有定长回溯功能.
利用率

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

45

主题

254

回帖

3210

积分

论坛元老

Rank: 8Rank: 8

积分
3210
 楼主| 发表于 2019-11-10 00:29:24 | 显示全部楼层
u8   xdata   CBuff[CircleBuffSize];
u16  P_write =0;//已经写入的位置  
u16  P_read =0 ;//已经读取的位置   

u8 ReadCBuff(void )
{    u8 tempdata;                     
                 
                        {
                         P_read++;if(P_read>=CircleBuffSize){ P_write-=CircleBuffSize;  P_read-=CircleBuffSize; }
                         tempdata= CBuff[P_read%CircleBuffSize]   ;//总是指向已经发送的字节
                          return tempdata;
            }
  
}

u8 WriteCBuffTest(void )
{   

    if ((P_write-P_read)<CircleBuffSize ){return 1;}//第一个元素空出来
                        else return 0;//返回未写入
}
void WriteCBuff(u8 tempdata )
{   
P_write++;
CBuff[P_write%CircleBuffSize]=tempdata;        //指向已经写入的字节

}
//u8 WriteBuffTest(void )
u8 ReadCBuffTest(void )
{   
  if (P_write >P_read)  {return  1;}
  else  return 0;
}

回复

使用道具 举报

13

主题

28

回帖

218

积分

中级会员

Rank: 3Rank: 3

积分
218
发表于 2019-11-13 20:11:07 来自手机 | 显示全部楼层
用queue不就可以了
回复

使用道具 举报

45

主题

254

回帖

3210

积分

论坛元老

Rank: 8Rank: 8

积分
3210
 楼主| 发表于 2019-11-13 22:27:19 | 显示全部楼层

这是循环队列实例(Circular Queue),比Queue性能好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-4-27 01:59 , Processed in 0.088629 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表