如何創(chuàng)建環(huán)形緩存(C語言實(shí)現(xiàn))
在什么情況下用到環(huán)形緩存
如何創(chuàng)建環(huán)形的緩存
舉例說明,環(huán)形緩存的指針管理
環(huán)形緩存的問題

什么情況下用到環(huán)形緩存,
比如:用串口,或者其他通信方式接收數(shù)據(jù)的時(shí)候,可以用環(huán)形緩存.
因?yàn)橛芯o急的事情要處理,所以先把數(shù)據(jù)放入到環(huán)形緩存中,然后再從環(huán)形緩存中挑選出合格的一幀數(shù)據(jù).
比如:編寫一個(gè)鍵盤程序,有多個(gè)按鍵幾乎同時(shí)按下,為了有序的響應(yīng)所有按鍵.
可以把那一時(shí)刻按下的所有按鍵標(biāo)號都記錄在環(huán)形緩存中.

如何創(chuàng)建環(huán)形緩存,
可以創(chuàng)建一個(gè)數(shù)組,這個(gè)數(shù)組用于存儲數(shù)據(jù),也就是緩存了.
然后創(chuàng)建兩個(gè)全局的變量,一個(gè)變量充當(dāng)"寫指針"?pw,? 另一個(gè)變量充當(dāng)"讀指針"pr.
這兩個(gè)"指針"其實(shí)并不是真正的指針,只是記錄數(shù)據(jù)的變量.
這樣就可以實(shí)現(xiàn)一個(gè)環(huán)形的緩存了.
比如單片機(jī)中是在5ms中斷里面進(jìn)行輪詢檢測按鍵是否按下的.
每5ms有若干個(gè)按鍵被按下,那么就把這若干個(gè)按鍵號填充在環(huán)形緩存里面.
并移動響應(yīng)的寫指針pw,有3個(gè)按鍵按下,就pw+3;?有5個(gè)按鍵按下,pw+5;
當(dāng)程序跳出中斷,進(jìn)入到主循環(huán)中,進(jìn)行緩存數(shù)據(jù)的處理時(shí),
每次讀取緩存中的一個(gè)數(shù)據(jù)pr就會執(zhí)行?pr--;
直到pw=pr,也就是?寫指針=讀指針 的時(shí)候.這個(gè)時(shí)候說明緩存是空的.
然后再等待下一次中斷的到來...循環(huán)進(jìn)行...

舉例說明,
填充環(huán)形緩存:
計(jì)算環(huán)形緩存中包含的數(shù)據(jù)長度:(BufLong)
這里可能比較繞,它分為兩種情況,
一種情況是,pw>pr,就是寫指針大于讀指針的情況,這里循環(huán)緩存里的數(shù)據(jù)就是pw和pr之間的數(shù)據(jù),就是pw-pr.
另一種情況比較復(fù)雜,就是pw逐漸計(jì)數(shù),靠近了數(shù)組的邊界pw變成最大,也就是循環(huán)緩存的尾部,如果再有數(shù)據(jù)進(jìn)來pw就會變成0,然后從頭開始重新計(jì)數(shù),pw會從0開始從頭計(jì)數(shù).這樣就可能會出現(xiàn)pw<pr.
讀取環(huán)形緩存中的數(shù)據(jù):

環(huán)形緩存存在的問題,
環(huán)形緩存因?yàn)槭茄h(huán)計(jì)數(shù)的,如果數(shù)據(jù)太長,占滿了整個(gè)緩存,就會從頭開始計(jì)數(shù),
這個(gè)時(shí)候就會覆蓋前面的數(shù)據(jù),所以循環(huán)緩存需要設(shè)置合適的大小.
還有一個(gè)問題是,循環(huán)緩存的讀寫指針是全局變量,在操作的時(shí)候要考慮會不會有意外的中斷進(jìn)行改寫.防止指針意外變動.