1.快取區的製作
思路:按照輸入資料的順序輸出資料
簡單地資料儲存:
structfifo_buf.next的起始點是0,所以最初儲存的資料是fifo_buf.data[0],下乙個是fifo_buf.data[1],依次類推,一共32個儲存位置。fifo_buffifo_buf;
unsigned
char buffer[32]=;
void init_write_to_buf(void
)
return0;
}
下乙個儲存位置有用變數next管理,這樣就可以記住32資料而不溢位,為保險next變為32之後就不要了
簡單地資料讀取:
void read_from_fifo_buf(void如果next不是0,說明至少有乙個資料,最開始的乙個資料肯定放在data[0]中,將這個資料放入到變數i中,這樣資料就減少了乙個,所以next要減去1;) }}}
接下來的for語句工作原理如下:
資料存放的位置全部都向前移動了乙個位置。如果不移送的話,下次就不能從data[0]讀入資料了。
此方法的缺點:移送資料的處理,一般不會超過3個,且基本上沒問題。有時需要移送上百個資料,就會出現問題。
2 改善上述快取區
思路:不僅要維護下乙個要寫入資料的位置,還要維護下乙個要讀出資料的位置。這就好像資料讀出位置追著資料寫入位置跑一樣。這樣就不需要資料移送操作了。資料讀出位置追上資料寫入位置的時候,就相當於快取區為空,沒有資料。
但是這樣的快取區使用一段時間後,下乙個資料寫入位置會變為31,而這時下乙個資料讀出位置可能已經是29或者30了。當下乙個寫入位置變為32的時候,就沒地方可以寫入資料了。
如果當下乙個資料寫入位置到達快取區終點時,資料讀出位置也恰好到達緩衝區終點,也就是緩衝區正好變為空,這種情況我們只要將下乙個資料寫入位置和下乙個資料讀出位置都再置位0就行了,就像轉回去從頭再來一樣。
但是總還是會有資料讀出位置沒有追上資料寫入位置的情況。這時又不得不進行資料移送操作。
3 快取區的實現
當下乙個資料寫入位置到達緩衝區最末尾時,快取區開頭部分應該已經變空了(如果還沒有變空,說明資料讀出跟不上資料寫入,只能把部分資料扔掉了)。因此如果下乙個資料寫入位置到了32以後,就強制性的將它設定為0。這樣寫乙個資料寫入位置就跑到了下乙個資料讀出位置的後面。
對下乙個資料讀出位置也做同樣的處理。一旦到了32以後,就把它設定為從0開始繼續讀取資料。這樣32位元組的快取區就能一圈一圈地不停迴圈,長久使用。資料移送操作一次都不需要。這個快取區雖然只有32位元組,只要不溢位的話,他就能持續使用下去。
資料的寫入
struct資料的讀取fifo_buffifo_buf;
void write_to_fifo_buf(void
)
return0;
}
void read_from_fifo_buf(void4 fifo快取區最終實現) }
}
struct初始化fifo_buf
fifo_buf;
void fifo_init(fifo_buf *fifo,int len,unsigned char *buf)寫
#define flags_overrun 0x0001讀int fifo_write(struct fifo_buf *fifo,unsigned char
data)
fifo->buf[fifo->fifo_w]=data;
fifo->fifo_w++;
if(fifo->w==fifo->len)
fifo->free--;
return0;
}
int fifo_read(fifo_buf *fifo,unsigned char查詢寫入了多少資料buffer)
else
fifo->free++;
}return
buffer;
}
int fifo_status(void)
快取淘汰演算法之FIFO
1 fifo 1.1.原理 按照 先進先出 first in,first out 的原理淘汰資料。1.2.實現 fifo佇列,具體實現如下 1.新訪問的資料插入fifo佇列尾部,資料在fifo佇列中順序移動 2.淘汰fifo佇列頭部的資料 1.3.分析 l 命中率 命中率很低,因為命中率太低,實際應...
帶有FIFO硬體快取的串列埠
51微控制器的串列埠並沒有配置fifo硬體,故收發資料時只能一位元組一位元組地收發。最近接觸了fifo 先進先出 的硬體快取,這樣串列埠的配置就更多了乙個維度。以ch58x系列微控制器為例,在ch583的手冊中 筆者手頭的是ch582m的板子,與ch583用法一致,只有部分硬體不同 有關於串列埠和f...
方形快取區
如何製作點的方形快取區 之前收到客戶的需求,需要製作點圖層的方形快取區。但是在 arcgis 中並沒有提供方形快取區,只能通過 buffer 工具製作圓形快取區。那麼如何生成方形快取區呢,莫非需要 engine 寫程式根據點座標尋找方形快取區的四角座標,然後再生成正方形要素嗎?太麻煩了吧。接下來看看...