欢迎光临散文网 会员登陆 & 注册

如何创建环形缓存(C语言实现)

2021-06-24 08:46 作者:GXTon_阿通  | 我要投稿

在什么情况下用到环形缓存

如何创建环形的缓存

举例说明,环形缓存的指针管理

环形缓存的问题

什么情况下用到环形缓存,

比如:用串口,或者其他通信方式接收数据的时候,可以用环形缓存.

因为有紧急的事情要处理,所以先把数据放入到环形缓存中,然后再从环形缓存中挑选出合格的一帧数据.

比如:编写一个键盘程序,有多个按键几乎同时按下,为了有序的响应所有按键.

可以把那一时刻按下的所有按键标号都记录在环形缓存中.

如何创建环形缓存,

可以创建一个数组,这个数组用于存储数据,也就是缓存了.

然后创建两个全局的变量,一个变量充当"写指针" pw,  另一个变量充当"读指针"pr.

这两个"指针"其实并不是真正的指针,只是记录数据的变量.

这样就可以实现一个环形的缓存了.

比如单片机中是在5ms中断里面进行轮询检测按键是否按下的.

每5ms有若干个按键被按下,那么就把这若干个按键号填充在环形缓存里面.

并移动响应的写指针pw,有3个按键按下,就pw+3; 有5个按键按下,pw+5;

当程序跳出中断,进入到主循环中,进行缓存数据的处理时,

每次读取缓存中的一个数据pr就会执行 pr--;

直到pw=pr,也就是 写指针=读指针 的时候.这个时候说明缓存是空的.

然后再等待下一次中断的到来...循环进行...

举例说明,

填充环形缓存:

计算环形缓存中包含的数据长度:(BufLong)

这里可能比较绕,它分为两种情况,

一种情况是,pw>pr,就是写指针大于读指针的情况,这里循环缓存里的数据就是pw和pr之间的数据,就是pw-pr.

另一种情况比较复杂,就是pw逐渐计数,靠近了数组的边界pw变成最大,也就是循环缓存的尾部,如果再有数据进来pw就会变成0,然后从头开始重新计数,pw会从0开始从头计数.这样就可能会出现pw<pr.

读取环形缓存中的数据:

环形缓存存在的问题,

环形缓存因为是循环计数的,如果数据太长,占满了整个缓存,就会从头开始计数,

这个时候就会覆盖前面的数据,所以循环缓存需要设置合适的大小.

还有一个问题是,循环缓存的读写指针是全局变量,在操作的时候要考虑会不会有意外的中断进行改写.防止指针意外变动.

如何创建环形缓存(C语言实现)的评论 (共 条)

分享到微博请遵守国家法律