国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

R5F104BC單片機(jī)Flash中數(shù)據(jù)存儲(chǔ)方法研

2016-05-27 08:46:16
關(guān)鍵詞:鏈表

付 河

(廣州廣日電氣設(shè)備有限公司,廣州511447)

?

付河

(廣州廣日電氣設(shè)備有限公司,廣州511447)

摘要:為了減少微處理器內(nèi)部集成的用于模擬非易失性RAM數(shù)據(jù)區(qū)域的Flash擦除次數(shù),提升存儲(chǔ)數(shù)據(jù)訪問效率和延長(zhǎng)器件使用壽命,以R5F104BC單片機(jī)為例,提出了三種存儲(chǔ)方法,給出具體的實(shí)現(xiàn)算法和軟件實(shí)現(xiàn)過程,在訪問速度與實(shí)現(xiàn)代碼大小之間實(shí)現(xiàn)平衡。在實(shí)際應(yīng)用中,編程人員可以根據(jù)具體情況,很方便和快捷地將本方法移植到其他的內(nèi)部集成了Flash的微處理器上。

關(guān)鍵詞:閃存;非易失性存儲(chǔ)器;鏈表;R5F104BC

引言

目前,非易失性存儲(chǔ)器(Non-Volatile Random Access Memory)主要類型有鐵電存儲(chǔ)器(Ferromagnetic Random Access Memory,F(xiàn)RAM)、電可擦可編程只讀存儲(chǔ)器(Electrically Erasable Programmable Read-Only Memory,EEPROM)和閃存 (Flash Memory)等。上述3種存儲(chǔ)器性能比較見表1。

表1 非易失性存儲(chǔ)器比較表

從表 1中可以看出,雖然閃存(Flash)在讀寫速度和擦除次數(shù)等方面處于劣勢(shì),但是成本較低。目前MCU的程序存儲(chǔ)器多數(shù)是使用Flash存儲(chǔ)器,所以很多MCU就在程序存儲(chǔ)器中劃出一塊空間作為非易失性存儲(chǔ)器,集成電路廠商在增加很小成本(甚至于不增加成本)的情況下,給用戶提供了片上非易失性存儲(chǔ)器,不但簡(jiǎn)化了外圍電路,而且降低了成本,提升了MCU的市場(chǎng)競(jìng)爭(zhēng)能力。本文針對(duì)Flash的特點(diǎn),提出一種基于瑞薩R5F104BC的數(shù)據(jù)存儲(chǔ)實(shí)現(xiàn)方法,其他單片機(jī)的應(yīng)用與此相似。

1硬件結(jié)構(gòu)

R5F104BC是瑞薩公司出品的一款RL78/G14系列的16位單片機(jī),3級(jí)流水線CISC體系結(jié)構(gòu),內(nèi)置32 KB程序閃存空間和4 KB數(shù)據(jù)閃存空間,內(nèi)部的高速時(shí)鐘最快可以達(dá)到64 MHz。R5F104BC存儲(chǔ)空間的分配如圖1所示。

圖1 R5F104BC存儲(chǔ)空間分配

4 KB的數(shù)據(jù)閃存由4個(gè)1 KB塊構(gòu)成。R5F104BC的數(shù)據(jù)閃存可以利用順序控制器實(shí)現(xiàn)在BGO(Background Operation)后臺(tái)寫入、擦除、校驗(yàn)數(shù)據(jù)和檢查Flash是否為空等操作,以提高單片機(jī)的工作效率。如圖2所示,發(fā)送命令完成后,交由順序控制器完成后續(xù)的工作,直到返回完成標(biāo)志為止[1]。

圖2 BGO(后臺(tái)操作)示意圖

R5F104BC還支持?jǐn)?shù)據(jù)傳送功能,通過一定的觸發(fā)源(比如中斷、定時(shí)器等)啟動(dòng)[1],將閃存中的數(shù)據(jù)在指定條件下傳送到指定存儲(chǔ)位置(比如某個(gè)起始地址RAM空間),這樣可以進(jìn)一步提升單片機(jī)的工作效率和實(shí)時(shí)性。在R5F104BC內(nèi)部存儲(chǔ)空間中Flash中data區(qū)域位于0xF10 00H開始的4 KB區(qū)域。

2存儲(chǔ)算法

與FRAM和EEPROM相比,F(xiàn)lash存儲(chǔ)器不能執(zhí)行讀—修改—寫操作過程。在寫入數(shù)據(jù)之前,先進(jìn)行空檢查,以確保用于存儲(chǔ)數(shù)據(jù)空間為空;否則必須先執(zhí)行擦除操作,將對(duì)應(yīng)空間的內(nèi)容擦除。但是Flash類型存儲(chǔ)器的特點(diǎn)決定了它不能對(duì)單個(gè)字節(jié)/字擦除,必須以BLOCK為單位擦除。對(duì)于不同的芯片,一個(gè)BLOCK的大小是不同的,R5F104BC的一個(gè)BLOCK大小是1024字節(jié),也就是說每次擦除最小空間是1024字節(jié)。

對(duì)Flash有3種不同存儲(chǔ)操作方式,通過對(duì)這3種方式執(zhí)行效率和效果進(jìn)行比較,確定不同工作條件下的最佳操作方式。

由于R5F104BC是以1024字節(jié)為一個(gè)BLOCK,以此為基礎(chǔ)進(jìn)行計(jì)算,對(duì)于多個(gè)BLOCK或者BLOCK大小不同的情況依此類推。

(1) 方法A

固定地址存儲(chǔ)特定的數(shù)據(jù),由于每一個(gè)地址空間內(nèi)容是指定的,當(dāng)任何一個(gè)數(shù)據(jù)發(fā)生變化時(shí),當(dāng)前BLOCK內(nèi)的數(shù)據(jù)全部讀出,然后將新數(shù)據(jù)與沒有發(fā)生變化的數(shù)據(jù)全部重新寫入Flash。如表2所列,假設(shè)當(dāng)前一個(gè)BLOCK只存儲(chǔ)4個(gè)字節(jié)內(nèi)容:標(biāo)識(shí)1~4,當(dāng)標(biāo)識(shí)1~4中的任何一個(gè)發(fā)生變化時(shí),擦除全部標(biāo)識(shí)1~4,將新的標(biāo)識(shí)1~4重新寫入到0x0001~0x0004地址空間。

表2 方法A地址分配表

(2) 方法B

為了簡(jiǎn)化計(jì)算,做如下假設(shè):一個(gè)BLOCK空間大小為x=1024字節(jié),一次存儲(chǔ)的數(shù)據(jù)為y字節(jié),且x>y(對(duì)于x

(1)

當(dāng)讀取數(shù)據(jù)時(shí),每次讀出y字節(jié),直到讀取的數(shù)據(jù)包全是0xFF時(shí),上一次讀出的y字節(jié)的數(shù)據(jù)包就是最新數(shù)據(jù)。方法B地址分配表如表3所列。如果表4中數(shù)據(jù)包3全是0xFF,則數(shù)據(jù)包2是最新的數(shù)據(jù)。

表3 方法B地址分配表

(3) 方法C

當(dāng)一個(gè)數(shù)據(jù)發(fā)生變化時(shí),只更新變化的數(shù)據(jù),其他數(shù)據(jù)保存在原來的位置不變。假定第i個(gè)參數(shù)都占用yi字節(jié),為了區(qū)分不同參數(shù)的意義,必須給每個(gè)參數(shù)分配一個(gè)參數(shù)序號(hào)和數(shù)據(jù)長(zhǎng)度,以方便參數(shù)的檢索。方法C地址分配表見表4。用2字節(jié)的標(biāo)識(shí)參數(shù)序號(hào)和2個(gè)字節(jié)標(biāo)識(shí)參數(shù),一個(gè)完整的參數(shù)數(shù)據(jù)包由2字節(jié)參數(shù)序號(hào)+2字節(jié)參數(shù)長(zhǎng)度 + yi字節(jié)參數(shù)組成。這樣一個(gè)BLOCK空間可以更新參數(shù)的最小次數(shù)times(每次寫入一個(gè)參數(shù)數(shù)據(jù)包)如下[3]:

(2)

其中,X代表每個(gè)BLOCK的字節(jié)數(shù),ymax是占用空間最大的參數(shù)。

表4 方法C地址分配表

Flash中的數(shù)據(jù)存儲(chǔ)方式與RAM中鏈表的存儲(chǔ)方式相似,不同的是鏈表中的數(shù)據(jù)可以對(duì)任意一個(gè)字節(jié)進(jìn)行修改,但是Flash中數(shù)據(jù)不能單獨(dú)修改1個(gè)字節(jié),不過可以將新的參數(shù)增加到空閑區(qū)域。確定某個(gè)參數(shù)是有效數(shù)據(jù)的方法為搜索整個(gè)BLOCK,最后一個(gè)對(duì)應(yīng)序號(hào)的參數(shù)就是最新的參數(shù),在此地址之前的該序號(hào)參數(shù)都是舊參數(shù),不予采用。比如表3中的參數(shù)2序號(hào)對(duì)應(yīng)的參數(shù)有2個(gè),第一個(gè)是舊的參數(shù),第二個(gè)是新的參數(shù)2,第二個(gè)序號(hào)2的參數(shù)有效。

綜上所述,對(duì)A、B和C三種存儲(chǔ)方法進(jìn)行比較,見表5。

表5 三種方法比較表

3軟件實(shí)現(xiàn)

為了更好理解上述3種方法,本文給出它們的程序?qū)崿F(xiàn)。在此之前先介紹一下R5F104BC的Flash Data區(qū)域的操作流程[2]。在讀寫Flash Data之前,先打開使能(DFLEN = 1),讀寫完成后關(guān)閉使能(DFLEN = 0)。Flash Data訪問過程見圖3。對(duì)Flash Data的每一步操作都需要進(jìn)行狀態(tài)檢查,避免由于Flash操作引起的數(shù)據(jù)讀/寫錯(cuò)誤。

圖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():初始化和啟動(dòng)Flash Data訪問,設(shè)置工作電壓和頻率。

PFDL_Close():關(guān)閉Flash Data訪問,在每次操作結(jié)束之前執(zhí)行關(guān)閉操作,以保證Flash Data中的數(shù)據(jù)不會(huì)發(fā)生意外變化。

PFDL_Execute():包含空檢查、讀數(shù)據(jù)、擦除、寫數(shù)據(jù)和校驗(yàn)。

PFDL_Handler():讀取狀態(tài)。

PFDL_GetVersionString():讀取Data Flash Library版本信息。

3.績(jī)效考核體系具有客觀公正性,因此可以很好的區(qū)分職工工作狀態(tài)是高效還是低效,根據(jù)不同職工工作水平?jīng)Q定他們不同的工資和福利待遇,合理的分配獎(jiǎng)金和晉升機(jī)會(huì),這樣才能可以對(duì)員工起到激勵(lì)作用。

參數(shù)說明如下:

BLOCK_No為BLOCK編號(hào)(0~3);*Start_Addr為指向BLOCK中寫入數(shù)據(jù)起始地址;

WrBuf為寫數(shù)據(jù)緩沖區(qū);Len為寫入數(shù)據(jù)長(zhǎng)度(假定小于BLOCK大小,Len 0xFF);

RdBuf為讀數(shù)據(jù)緩沖區(qū)。

對(duì)于方法A的程序?qū)崿F(xiàn),任何數(shù)據(jù)變化時(shí)擦除所在的BLOCK。

Bool FunctionA(){

if(!FDL_Init()){//初始化Flash Data

return PFDL_NG;//Flash 初始化錯(cuò)誤

}

//擦除Flash Data中對(duì)應(yīng)的Block

returnPFDL_NG;//Flash 擦除錯(cuò)誤

}

if(!FDL_Write(Start_Addr,Block_No,WrBuf,Len)){

//數(shù)據(jù)相應(yīng)的BLOCK,包含檢驗(yàn)和數(shù)據(jù)檢查

returnPFDL_NG;//Flash 寫入錯(cuò)誤

}

if(!FDL_Close()){//關(guān)閉Flash

returnPFDL_NG;//關(guān)閉Flash錯(cuò)誤

}

returnPFDL_OK;//Flash 操作正常

}

在方法B中任何數(shù)據(jù)發(fā)生變化時(shí),在寫入數(shù)據(jù)之前,先判斷當(dāng)前BLOCK剩余空間是否比數(shù)據(jù)包字節(jié)數(shù)多,如果大于所需空間,則在后續(xù)空間繼續(xù)寫入數(shù)據(jù),否則擦除BLOCK數(shù)據(jù),從起始地址寫入數(shù)據(jù)。在主程序初始化時(shí)用合適的查表法(比如折半查找等)找到下一個(gè)參數(shù)數(shù)據(jù)存儲(chǔ)的起始地址。本文不再贅述,假定已經(jīng)找到該起始地址,R5F104BC每個(gè)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 初始化錯(cuò)誤

}

if(0x0000 == *Start_Addr){

//剩余空間不足存儲(chǔ)下一個(gè)數(shù)據(jù)包

if(!FDL_Erase(Block_No)){

//擦除Flash Data中對(duì)應(yīng)的Block

returnPFDL_NG;//Flash 擦除錯(cuò)誤

}

}

if(!FDL_Write(Start_Addr,Block_No,WrBuf,Len)){

//數(shù)據(jù)相應(yīng)的BLOCK,包含檢驗(yàn)和數(shù)據(jù)檢查

returnPFDL_NG;//Flash 寫入錯(cuò)誤

}

*Start_Addr += Len;//指向下一個(gè)數(shù)據(jù)包起始地址

if(*Start_Addr +Len > MAX_LENGTH){

//剩余空間不足存儲(chǔ)下一個(gè)數(shù)據(jù)包

*Start_Addr= 0x0000

//指向BLOCK起始地址

}

if(!FDL_Close()){//關(guān)閉Flash

returnPFDL_NG;//關(guān)閉Flash錯(cuò)誤

}

returnPFDL_OK;//Flash操作正常

}

方法C與方法B相同的部分是任何數(shù)據(jù)發(fā)生變化時(shí),在寫入數(shù)據(jù)之前,先判斷當(dāng)前BLOCK剩余空間是否能夠容納即將寫入的數(shù)據(jù),如果大于所需空間,在后續(xù)空間繼續(xù)寫入數(shù)據(jù),否則擦除BLOCK數(shù)據(jù),從起始地址寫入有參數(shù)的最新數(shù)據(jù)。不同之處在于,方法B在BLOCK沒有寫滿之前,重新寫入所有的參數(shù);而方法C只寫入變化的參數(shù),同時(shí)為每個(gè)參數(shù)增加編號(hào)和長(zhǎng)度,以方便操作。與方法B類似,在主程序初始化時(shí)讀取Flash中的數(shù)據(jù),建立每個(gè)參數(shù)鏈表,同時(shí)在參數(shù)鏈表前面的2個(gè)字節(jié)存儲(chǔ)BLOCK中未被使用的空間的起始地址,指針Start_Addr指向鏈表基地址。假定已經(jīng)找到該起始地址,R5F104BC每個(gè)BLOCK最大的字節(jié)數(shù)MAX_LENGTH=1024字節(jié),第i個(gè)參數(shù)大小為yi字節(jié)。 方法C的程序?qū)崿F(xiàn)略——編者注。

結(jié)語

由于可以帶來降低物料成本和節(jié)約PCB空間的好處,在內(nèi)部集成模擬非易失性存儲(chǔ)器的單片機(jī)越來越多,以上3種操作方法各有優(yōu)劣,在使用時(shí)要針對(duì)具體應(yīng)用的特點(diǎn)(比如參數(shù)變化的頻率等)選擇適宜的實(shí)現(xiàn)方式,另外,文中的執(zhí)行代碼可以方便地移植到其他的硬件平臺(tái)。

編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。

參考文獻(xiàn)

[1] Renesas Electronics.RL78/G14用戶手冊(cè)(硬件篇)[EB/OL].[2015-12].http://www.renesas.com.

[2] Renesas Electronics.Data Flash Library Type04 使用手冊(cè)[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è)計(jì)[M].北京:清華大學(xué)出版社,2010.

付河(高級(jí)工程師),主要研究方向?yàn)樽詣?dòng)控制和光機(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)

中圖分類號(hào):TP331

文獻(xiàn)標(biāo)識(shí)碼:A

* 基金項(xiàng)目:國家高新技術(shù)研究發(fā)展計(jì)劃(863計(jì)劃)(2013AA03A106)。

猜你喜歡
鏈表
蒙特卡羅模擬中基于雙向鏈表的元胞鏈表方法
如何用鏈表實(shí)現(xiàn)一元多項(xiàng)式相加
青年生活(2020年16期)2020-07-06 11:27:07
基于二進(jìn)制鏈表的粗糙集屬性約簡(jiǎn)
跟麥咭學(xué)編程
基于鏈表多分支路徑樹的云存儲(chǔ)數(shù)據(jù)完整性驗(yàn)證機(jī)制
一種基于鏈表的戰(zhàn)場(chǎng)態(tài)勢(shì)顯示方法
基于MTF規(guī)則的非阻塞自組織鏈表
C++的基于函數(shù)模板實(shí)現(xiàn)單向鏈表
一種基于有序雙端鏈表的高效排序算法
單向鏈表快速排序算法*
崇信县| 韶关市| 雅江县| 长沙县| 齐齐哈尔市| 建德市| 崇文区| 泌阳县| 丰镇市| 永顺县| 元朗区| 清丰县| 南郑县| 保德县| 蚌埠市| 德令哈市| 韶山市| 安宁市| 毕节市| 蕲春县| 万年县| 通河县| 孝义市| 酉阳| 威远县| 百色市| 安吉县| 海兴县| 呈贡县| 慈利县| 宣武区| 丰都县| 柳林县| 武城县| 邯郸市| 余干县| 县级市| 巴林左旗| 砀山县| 长汀县| 龙江县|