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