在大多數(shù)工控應(yīng)用中,由于各種復(fù)雜的環(huán)境因素,使工控設(shè)備不可避免的會面臨供電突然斷掉的情況。在許多應(yīng)用場合,需要保存一部分現(xiàn)場數(shù)據(jù),以保證工控設(shè)備在供電回復(fù)后能繼續(xù)正常運行。為了保證保存數(shù)據(jù)的實時性,除了已保存的數(shù)據(jù)不受掉電影響的基本特性外,現(xiàn)場數(shù)據(jù)的存儲頻率還會非常高,因此還要求數(shù)據(jù)保存的速度應(yīng)足夠快,從而不影響應(yīng)用程序的正常運行。本文的主要目的是分析現(xiàn)場數(shù)據(jù)保護的若干手段,并重點介紹英創(chuàng)工控主板特有的小數(shù)據(jù)高速存儲方案,以支持關(guān)鍵現(xiàn)場數(shù)據(jù)的備份。
本文所指的英創(chuàng)工控主板包括EM9160、EM9260、EM9360以及EM9161這4個產(chǎn)品線的所有型號的產(chǎn)品。這些主板均帶有大容量的NandFlash存儲器,作為非易失性存儲器,NandFlash主要用于存儲應(yīng)用程序、歷史數(shù)據(jù)備份等內(nèi)容。盡管NandFlash也可以作為現(xiàn)場數(shù)據(jù)保護的存儲介質(zhì),但考慮到NandFlash介質(zhì)有一定的擦寫壽命限制,且數(shù)據(jù)是按扇區(qū)(512字節(jié)或2K字節(jié))為單位寫入,因此還存在寫入效率較低的問題,因此基于NandFlash的文件系統(tǒng)存儲不是作為現(xiàn)場數(shù)據(jù)保護的最佳方案。
對幾十到幾百個字節(jié)的現(xiàn)場數(shù)據(jù)的保存,一個比較好的辦法是外擴一片NVRAM,典型的芯片可以考慮鐵電存儲器。有關(guān)鐵電存儲器的具體應(yīng)用,客戶可以參考《工控主板支持鐵電存儲器的簡易方案》一文。在英創(chuàng)工控主板,鐵電存儲器的寫入速度為56KB/s,即寫入一個字節(jié)的時間在18us的水平。采用鐵電存儲器或其它NVRAM的優(yōu)點是存儲的數(shù)據(jù)量沒有限制,但前提是需要增加一定的硬件成本,這可能成為一些大批量應(yīng)用,對成本極其敏感的設(shè)備的障礙。
針對需要保存的現(xiàn)場數(shù)據(jù)通常很少這一特點,同時又能避免客戶設(shè)備為了現(xiàn)場數(shù)據(jù)保存功能而增加額外的成本開銷,我們通過優(yōu)化工控主板的內(nèi)核,為應(yīng)用程序提供了最大6個字節(jié)、帶掉電保護功能的高速存儲空間,用于對關(guān)鍵現(xiàn)場數(shù)據(jù)的備份。由于這6個字節(jié)在系統(tǒng)內(nèi)部,其寫入速度高達1.5MB/s以上,即寫入一個字節(jié)的時間在0.6us水平,6個字節(jié)的寫入時間為3.6us。幾微秒的存儲時間可完全保證系統(tǒng)應(yīng)用線程的正常運行。應(yīng)用程序可通過3個系統(tǒng)調(diào)用來實現(xiàn)現(xiàn)場數(shù)據(jù)的讀寫,它們是:
1、檢查當前存儲的數(shù)據(jù)是否有效
//
// return = TRUE: data stored in NVRAM is valid
// = FALSE: data stored in NVRAM is corrupted or data is unavailable
//
BOOL NVRAMQuery()
{
BOOL bGoodData;
DWORD dwOutBufSize;
DWORD dwReturnBytes = 0;
BOOL bRet;
bGoodData = FALSE;
dwOutBufSize = sizeof(BOOL);
bRet = KernelIoControl(IOCTL_EM9X60_NVRAM_BYTE_QUERY, NULL, 0, (LPVOID)&bGoodData, dwOutBufSize, &dwReturnBytes);
if(bRet)
{
if(!bGoodData)
{
bRet = FALSE;
}
}
return bRet;
}
2、從系統(tǒng)讀出1-6個字節(jié)
//
// input dwMaxLength: buffer length in byte
// output pOutBuffer: output data buffer
// return 》= 0: number of byte read from NVRAM 《= dwmaxLength
// 《 0: read failed
int NVRAMRead(LPVOID pOutBuffer, DWORD dwMaxLength)
{
DWORD dwReturnBytes = 0;
BOOL bRet;
bRet = KernelIoControl(IOCTL_EM9X60_NVRAM_BYTE_READ, NULL, 0, (LPVOID)pOutBuffer, dwMaxLength, &dwReturnBytes);
if(!bRet)
{
return -1;
}
return (int)dwReturnBytes;
}
3、向系統(tǒng)寫入1-6個字節(jié)
//
// input pInBuffer: input data buffer
// dwDataLength: number of byte need to write 《= 6
// return 》= 0: number of byte written into NVRAM
// 《 0: write failed
//
int NVRAMWrite(LPVOID pInBuffer, DWORD dwDataLength)
{
DWORD dwReturnBytes = 0;
BOOL bRet;
bRet = KernelIoControl(IOCTL_EM9X60_NVRAM_BYTE_WRITE, (LPVOID)pInBuffer, dwDataLength, NULL, 0, &dwReturnBytes);
if(!bRet)
{
return -1;
}
return dwReturnBytes;
}
在后續(xù)出貨的相關(guān)工控主板中,都將加上6字節(jié)掉電保護高速存儲功能。對已購買英創(chuàng)公司的主板產(chǎn)品,若需要進行關(guān)鍵現(xiàn)場數(shù)據(jù)保存功能的客戶,可將主板寄回英創(chuàng)公司進行免費更新并索取相關(guān)操作的完整源代碼。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35334
發(fā)布評論請先 登錄
相關(guān)推薦
評論