很不錯的一篇文章,mark一下: 使用xilinx sdk對zynq的pcie,srio等高速介面進行除錯的過程中,經常會涉及到dma對ddr資料的讀寫,此時就會引入會引入cache一致性問題。zynq的ps在執行過程中,通過ddr控制器對ddr儲存器進行訪問,為了加快訪問速度,常常將一些資料快取在cache中,而且不是針對乙個資料資料快取,而是一批(xilinx稱為一行,即line,一行長度為32),這樣的好處是下次訪問速度會加快,但是壞處也很明顯,cache資料發生變化,不能馬上反映到ddr中,反之亦然。當通過dma修改ddr資料時,cpu可能還不知道發生了什麼,拿到的資料還是cache中沒有修改的資料,導致讀寫資料的錯誤。
解決的辦法有以下兩種:
除錯過程中,直接禁用cache,即使用xil_dcachedisable();cpu將直接訪問ddr記憶體,讀寫都是直接的,這會降低cpu效能,但簡化了資料傳輸操作,屬於極端方法。
xil_dcacheflushrange
((u32)sendram,
sizeof
(buffer));
//將內容重新整理至ddr
xil_dcacheinvalidrange
((u32)recvram,
sizeof
(buffer));
//將ddr內容拉近cache中
#include "xil_cache.h"
//上述函式標頭檔案
很不錯的一篇文章,mark一下: 使用xilinx sdk對zynq的pcie,srio等高速介面進行除錯的過程中,經常會涉及到dma對ddr資料的讀寫,此時就會引入會引入cache一致性問題。zynq的ps在執行過程中,通過ddr控制器對ddr儲存器進行訪問,為了加快訪問速度,常常將一些資料快取在cache中,而且不是針對乙個資料資料快取,而是一批(xilinx稱為一行,即line,一行長度為32),這樣的好處是下次訪問速度會加快,但是壞處也很明顯,cache資料發生變化,不能馬上反映到ddr中,反之亦然。當通過dma修改ddr資料時,cpu可能還不知道發生了什麼,拿到的資料還是cache中沒有修改的資料,導致讀寫資料的錯誤。
解決的辦法有以下兩種:
除錯過程中,直接禁用cache,即使用xil_dcachedisable();cpu將直接訪問ddr記憶體,讀寫都是直接的,這會降低cpu效能,但簡化了資料傳輸操作,屬於極端方法。
xil_dcacheflushrange
((u32)sendram,
sizeof
(buffer));
//將內容重新整理至ddr
xil_dcacheinvalidrange
((u32)recvram,
sizeof
(buffer));
//將ddr內容拉近cache中
#include "xil_cache.h"
//上述函式標頭檔案
主從DB與cache一致性問題
為什麼會讀到髒資料,有這麼幾種情況 1 單庫情況下,服務層的併發讀寫,快取與資料庫的操作交叉進行 雖然只有乙個db,在上述詭異異常時序下,也可能髒資料入快取 1 請求a發起乙個寫操作,第一步淘汰了cache,然後這個請求因為各種原因在服務層卡住了 進行大量的業務邏輯計算,例如計算了1秒鐘 如上圖步驟...
Cache寫策略(Cache一致性問題與騷操作)
資訊會被同時寫到cache的塊和主存中。這樣做雖然比較慢,但缺少代價小,不需要把整個塊都寫回主存。也不會發生一致性問題。對於寫直達,多出來 10向主存寫入的儲存指令使得其比其單純向cache寫入的速度慢上將近10倍。這種速度不一致的問題,不管是在硬體結構還是軟體,有著一條 不管怎麼樣,先試試這樣行不...
DMA和cache一致性問題
cache原理 cpu快取 cache memory 是位於cpu與記憶體之間的臨時儲存器,它的容量比記憶體小的多但是交換速度卻比記憶體要快得多。快取的出現主要是為了解決cpu運算速度與記憶體 讀寫速度不匹配的矛盾,因為cpu運算速度要比記憶體讀寫速度快很多,這樣會使cpu花費很長時間等待資料到來或...