付 河
(廣州廣日電氣設(shè)備有限公司,廣州511447)
?
付河
(廣州廣日電氣設(shè)備有限公司,廣州511447)
摘要:為了減少微處理器內(nèi)部集成的用于模擬非易失性RAM數(shù)據(jù)區(qū)域的Flash擦除次數(shù),提升存儲數(shù)據(jù)訪問效率和延長器件使用壽命,以R5F104BC單片機(jī)為例,提出了三種存儲方法,給出具體的實現(xiàn)算法和軟件實現(xiàn)過程,在訪問速度與實現(xiàn)代碼大小之間實現(xiàn)平衡。在實際應(yīng)用中,編程人員可以根據(jù)具體情況,很方便和快捷地將本方法移植到其他的內(nèi)部集成了Flash的微處理器上。
關(guān)鍵詞:閃存;非易失性存儲器;鏈表;R5F104BC
引言
目前,非易失性存儲器(Non-Volatile Random Access Memory)主要類型有鐵電存儲器(Ferromagnetic Random Access Memory,F(xiàn)RAM)、電可擦可編程只讀存儲器(Electrically Erasable Programmable Read-Only Memory,EEPROM)和閃存 (Flash Memory)等。上述3種存儲器性能比較見表1。
表1 非易失性存儲器比較表
從表 1中可以看出,雖然閃存(Flash)在讀寫速度和擦除次數(shù)等方面處于劣勢,但是成本較低。目前MCU的程序存儲器多數(shù)是使用Flash存儲器,所以很多MCU就在程序存儲器中劃出一塊空間作為非易失性存儲器,集成電路廠商在增加很小成本(甚至于不增加成本)的情況下,給用戶提供了片上非易失性存儲器,不但簡化了外圍電路,而且降低了成本,提升了MCU的市場競爭能力。本文針對Flash的特點,提出一種基于瑞薩R5F104BC的數(shù)據(jù)存儲實現(xiàn)方法,其他單片機(jī)的應(yīng)用與此相似。
1硬件結(jié)構(gòu)
R5F104BC是瑞薩公司出品的一款RL78/G14系列的16位單片機(jī),3級流水線CISC體系結(jié)構(gòu),內(nèi)置32 KB程序閃存空間和4 KB數(shù)據(jù)閃存空間,內(nèi)部的高速時鐘最快可以達(dá)到64 MHz。R5F104BC存儲空間的分配如圖1所示。
圖1 R5F104BC存儲空間分配
4 KB的數(shù)據(jù)閃存由4個1 KB塊構(gòu)成。R5F104BC的數(shù)據(jù)閃存可以利用順序控制器實現(xiàn)在BGO(Background Operation)后臺寫入、擦除、校驗數(shù)據(jù)和檢查Flash是否為空等操作,以提高單片機(jī)的工作效率。如圖2所示,發(fā)送命令完成后,交由順序控制器完成后續(xù)的工作,直到返回完成標(biāo)志為止[1]。
圖2 BGO(后臺操作)示意圖
R5F104BC還支持?jǐn)?shù)據(jù)傳送功能,通過一定的觸發(fā)源(比如中斷、定時器等)啟動[1],將閃存中的數(shù)據(jù)在指定條件下傳送到指定存儲位置(比如某個起始地址RAM空間),這樣可以進(jìn)一步提升單片機(jī)的工作效率和實時性。在R5F104BC內(nèi)部存儲空間中Flash中data區(qū)域位于0xF10 00H開始的4 KB區(qū)域。
2存儲算法
與FRAM和EEPROM相比,F(xiàn)lash存儲器不能執(zhí)行讀—修改—寫操作過程。在寫入數(shù)據(jù)之前,先進(jìn)行空檢查,以確保用于存儲數(shù)據(jù)空間為空;否則必須先執(zhí)行擦除操作,將對應(yīng)空間的內(nèi)容擦除。但是Flash類型存儲器的特點決定了它不能對單個字節(jié)/字擦除,必須以BLOCK為單位擦除。對于不同的芯片,一個BLOCK的大小是不同的,R5F104BC的一個BLOCK大小是1024字節(jié),也就是說每次擦除最小空間是1024字節(jié)。
對Flash有3種不同存儲操作方式,通過對這3種方式執(zhí)行效率和效果進(jìn)行比較,確定不同工作條件下的最佳操作方式。
由于R5F104BC是以1024字節(jié)為一個BLOCK,以此為基礎(chǔ)進(jìn)行計算,對于多個BLOCK或者BLOCK大小不同的情況依此類推。
(1) 方法A
固定地址存儲特定的數(shù)據(jù),由于每一個地址空間內(nèi)容是指定的,當(dāng)任何一個數(shù)據(jù)發(fā)生變化時,當(dāng)前BLOCK內(nèi)的數(shù)據(jù)全部讀出,然后將新數(shù)據(jù)與沒有發(fā)生變化的數(shù)據(jù)全部重新寫入Flash。如表2所列,假設(shè)當(dāng)前一個BLOCK只存儲4個字節(jié)內(nèi)容:標(biāo)識1~4,當(dāng)標(biāo)識1~4中的任何一個發(fā)生變化時,擦除全部標(biāo)識1~4,將新的標(biāo)識1~4重新寫入到0x0001~0x0004地址空間。
表2 方法A地址分配表
(2) 方法B
為了簡化計算,做如下假設(shè):一個BLOCK空間大小為x=1024字節(jié),一次存儲的數(shù)據(jù)為y字節(jié),且x>y(對于x (1) 當(dāng)讀取數(shù)據(jù)時,每次讀出y字節(jié),直到讀取的數(shù)據(jù)包全是0xFF時,上一次讀出的y字節(jié)的數(shù)據(jù)包就是最新數(shù)據(jù)。方法B地址分配表如表3所列。如果表4中數(shù)據(jù)包3全是0xFF,則數(shù)據(jù)包2是最新的數(shù)據(jù)。 表3 方法B地址分配表 (3) 方法C 當(dāng)一個數(shù)據(jù)發(fā)生變化時,只更新變化的數(shù)據(jù),其他數(shù)據(jù)保存在原來的位置不變。假定第i個參數(shù)都占用yi字節(jié),為了區(qū)分不同參數(shù)的意義,必須給每個參數(shù)分配一個參數(shù)序號和數(shù)據(jù)長度,以方便參數(shù)的檢索。方法C地址分配表見表4。用2字節(jié)的標(biāo)識參數(shù)序號和2個字節(jié)標(biāo)識參數(shù),一個完整的參數(shù)數(shù)據(jù)包由2字節(jié)參數(shù)序號+2字節(jié)參數(shù)長度 + yi字節(jié)參數(shù)組成。這樣一個BLOCK空間可以更新參數(shù)的最小次數(shù)times(每次寫入一個參數(shù)數(shù)據(jù)包)如下[3]: (2) 其中,X代表每個BLOCK的字節(jié)數(shù),ymax是占用空間最大的參數(shù)。 表4 方法C地址分配表 Flash中的數(shù)據(jù)存儲方式與RAM中鏈表的存儲方式相似,不同的是鏈表中的數(shù)據(jù)可以對任意一個字節(jié)進(jìn)行修改,但是Flash中數(shù)據(jù)不能單獨修改1個字節(jié),不過可以將新的參數(shù)增加到空閑區(qū)域。確定某個參數(shù)是有效數(shù)據(jù)的方法為搜索整個BLOCK,最后一個對應(yīng)序號的參數(shù)就是最新的參數(shù),在此地址之前的該序號參數(shù)都是舊參數(shù),不予采用。比如表3中的參數(shù)2序號對應(yīng)的參數(shù)有2個,第一個是舊的參數(shù),第二個是新的參數(shù)2,第二個序號2的參數(shù)有效。 綜上所述,對A、B和C三種存儲方法進(jìn)行比較,見表5。 表5 三種方法比較表 3軟件實現(xiàn) 為了更好理解上述3種方法,本文給出它們的程序?qū)崿F(xiàn)。在此之前先介紹一下R5F104BC的Flash Data區(qū)域的操作流程[2]。在讀寫Flash Data之前,先打開使能(DFLEN = 1),讀寫完成后關(guān)閉使能(DFLEN = 0)。Flash Data訪問過程見圖3。對Flash Data的每一步操作都需要進(jìn)行狀態(tài)檢查,避免由于Flash操作引起的數(shù)據(jù)讀/寫錯誤。 圖3 Flash Data操作流程 瑞薩公司提供了R5F104BC的Flash Data訪問函數(shù)庫,可以通過在編譯環(huán)境中添加相關(guān)的庫函數(shù)pdfl.lib,從而調(diào)用PFDL_Open()、PFDL_Close()、PFDL_Execute()、PFDL_Handler()和PFDL_GetVersionString()[2]。 PFDL_Open():初始化和啟動Flash Data訪問,設(shè)置工作電壓和頻率。 PFDL_Close():關(guān)閉Flash Data訪問,在每次操作結(jié)束之前執(zhí)行關(guān)閉操作,以保證Flash Data中的數(shù)據(jù)不會發(fā)生意外變化。 PFDL_Execute():包含空檢查、讀數(shù)據(jù)、擦除、寫數(shù)據(jù)和校驗。 PFDL_Handler():讀取狀態(tài)。 PFDL_GetVersionString():讀取Data Flash Library版本信息。 3.績效考核體系具有客觀公正性,因此可以很好的區(qū)分職工工作狀態(tài)是高效還是低效,根據(jù)不同職工工作水平?jīng)Q定他們不同的工資和福利待遇,合理的分配獎金和晉升機(jī)會,這樣才能可以對員工起到激勵作用。 參數(shù)說明如下: BLOCK_No為BLOCK編號(0~3);*Start_Addr為指向BLOCK中寫入數(shù)據(jù)起始地址; WrBuf為寫數(shù)據(jù)緩沖區(qū);Len為寫入數(shù)據(jù)長度(假定小于BLOCK大小,Len 0xFF); RdBuf為讀數(shù)據(jù)緩沖區(qū)。 對于方法A的程序?qū)崿F(xiàn),任何數(shù)據(jù)變化時擦除所在的BLOCK。 Bool FunctionA(){ if(!FDL_Init()){//初始化Flash Data return PFDL_NG;//Flash 初始化錯誤 } //擦除Flash Data中對應(yīng)的Block returnPFDL_NG;//Flash 擦除錯誤 } if(!FDL_Write(Start_Addr,Block_No,WrBuf,Len)){ //數(shù)據(jù)相應(yīng)的BLOCK,包含檢驗和數(shù)據(jù)檢查 returnPFDL_NG;//Flash 寫入錯誤 } if(!FDL_Close()){//關(guān)閉Flash returnPFDL_NG;//關(guān)閉Flash錯誤 } returnPFDL_OK;//Flash 操作正常 } 在方法B中任何數(shù)據(jù)發(fā)生變化時,在寫入數(shù)據(jù)之前,先判斷當(dāng)前BLOCK剩余空間是否比數(shù)據(jù)包字節(jié)數(shù)多,如果大于所需空間,則在后續(xù)空間繼續(xù)寫入數(shù)據(jù),否則擦除BLOCK數(shù)據(jù),從起始地址寫入數(shù)據(jù)。在主程序初始化時用合適的查表法(比如折半查找等)找到下一個參數(shù)數(shù)據(jù)存儲的起始地址。本文不再贅述,假定已經(jīng)找到該起始地址,R5F104BC每個BLOCK最大的字節(jié)數(shù)MAX_LENGTH=1024字節(jié),數(shù)據(jù)包大小為y字節(jié)。方法B的程序?qū)崿F(xiàn)如下: Bool FunctionB(){ if(!FDL_Init()){//初始化和使能Flash Data return PFDL_NG;//Flash 初始化錯誤 } if(0x0000 == *Start_Addr){ //剩余空間不足存儲下一個數(shù)據(jù)包 if(!FDL_Erase(Block_No)){ //擦除Flash Data中對應(yīng)的Block returnPFDL_NG;//Flash 擦除錯誤 } } if(!FDL_Write(Start_Addr,Block_No,WrBuf,Len)){ //數(shù)據(jù)相應(yīng)的BLOCK,包含檢驗和數(shù)據(jù)檢查 returnPFDL_NG;//Flash 寫入錯誤 } *Start_Addr += Len;//指向下一個數(shù)據(jù)包起始地址 if(*Start_Addr +Len > MAX_LENGTH){ //剩余空間不足存儲下一個數(shù)據(jù)包 *Start_Addr= 0x0000 //指向BLOCK起始地址 } if(!FDL_Close()){//關(guān)閉Flash returnPFDL_NG;//關(guān)閉Flash錯誤 } returnPFDL_OK;//Flash操作正常 } 方法C與方法B相同的部分是任何數(shù)據(jù)發(fā)生變化時,在寫入數(shù)據(jù)之前,先判斷當(dāng)前BLOCK剩余空間是否能夠容納即將寫入的數(shù)據(jù),如果大于所需空間,在后續(xù)空間繼續(xù)寫入數(shù)據(jù),否則擦除BLOCK數(shù)據(jù),從起始地址寫入有參數(shù)的最新數(shù)據(jù)。不同之處在于,方法B在BLOCK沒有寫滿之前,重新寫入所有的參數(shù);而方法C只寫入變化的參數(shù),同時為每個參數(shù)增加編號和長度,以方便操作。與方法B類似,在主程序初始化時讀取Flash中的數(shù)據(jù),建立每個參數(shù)鏈表,同時在參數(shù)鏈表前面的2個字節(jié)存儲BLOCK中未被使用的空間的起始地址,指針Start_Addr指向鏈表基地址。假定已經(jīng)找到該起始地址,R5F104BC每個BLOCK最大的字節(jié)數(shù)MAX_LENGTH=1024字節(jié),第i個參數(shù)大小為yi字節(jié)。 方法C的程序?qū)崿F(xiàn)略——編者注。 結(jié)語 由于可以帶來降低物料成本和節(jié)約PCB空間的好處,在內(nèi)部集成模擬非易失性存儲器的單片機(jī)越來越多,以上3種操作方法各有優(yōu)劣,在使用時要針對具體應(yīng)用的特點(比如參數(shù)變化的頻率等)選擇適宜的實現(xiàn)方式,另外,文中的執(zhí)行代碼可以方便地移植到其他的硬件平臺。 編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。 參考文獻(xiàn) [1] Renesas Electronics.RL78/G14用戶手冊(硬件篇)[EB/OL].[2015-12].http://www.renesas.com. [2] Renesas Electronics.Data Flash Library Type04 使用手冊[EB/OL].[2015-12].http://www.renesas.com. [3] Ellis Horowitz, Sartaj Sahni, Susan Anderson-Freed.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].李建中,張巖,李治軍,譯.北京:機(jī)械工業(yè)出版社,2006. [4] 譚浩強(qiáng).C程序設(shè)計[M].北京:清華大學(xué)出版社,2010. 付河(高級工程師),主要研究方向為自動控制和光機(jī)電一體化領(lǐng)域。 Fu He (Electricity Facilities Guangri Guangzhou Co.,Ltd.,Guangzhou 511447,China) Abstract:In order to reduce the non-volatile RAM data area erase cycles of internal Flash to improve the access efficiency of storage data and extend the life of the device,three methods of storage data using R5F104BC are proposed.The specific algorithm and the software implementation process are given,which achieves the balance between the running speed and the code size.In practical applications,the programmers can easily and quickly port the design to other microprocessor according to their own specific situation. Key words:Flash memory;non-volatile random access memory;chain table;R5F104BC 收稿日期:(責(zé)任編輯:楊迪娜2015-12-03) 中圖分類號:TP331 文獻(xiàn)標(biāo)識碼:A * 基金項目:國家高新技術(shù)研究發(fā)展計劃(863計劃)(2013AA03A106)。