www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 電源 > 數(shù)字電源
[導(dǎo)讀]隨著NAND Flash存儲(chǔ)器作為大容量數(shù)據(jù)存儲(chǔ)介質(zhì)的普及,基于NAND閃存的文件系統(tǒng)YAFFS(Yet Another Flash File System)正逐漸被應(yīng)用到各種嵌入式系統(tǒng)中。本文將詳細(xì)闡述YAFFS文件系統(tǒng)在C51系統(tǒng)上的實(shí)現(xiàn)過(guò)程。1 NAND Fl

隨著NAND Flash存儲(chǔ)器作為大容量數(shù)據(jù)存儲(chǔ)介質(zhì)的普及,基于NAND閃存的文件系統(tǒng)YAFFS(Yet Another Flash File System)正逐漸被應(yīng)用到各種嵌入式系統(tǒng)中。本文將詳細(xì)闡述YAFFS文件系統(tǒng)在C51系統(tǒng)上的實(shí)現(xiàn)過(guò)程。

1  NAND Flash的特點(diǎn)

  非易失性閃速存儲(chǔ)器Flash具有速度快、成本低、密度大的特點(diǎn),被廣泛應(yīng)用于嵌入式系統(tǒng)中。Flash存儲(chǔ)器主要有NOR和NAND兩種類(lèi)型。NOR型比較適合存儲(chǔ)程序代碼;NAND型則可用作大容量數(shù)據(jù)存儲(chǔ)。NAND閃存的存儲(chǔ)單元為塊和頁(yè)。本文使用的Samsung公司的K9F5608包括2 048塊,每一塊又包括32頁(yè),一頁(yè)大小為528字節(jié),依次分為2個(gè)256字節(jié)的數(shù)據(jù)區(qū),最后是16字節(jié)的備用空間。

  K9F5608具有以下特點(diǎn): 以頁(yè)為單位進(jìn)行讀/寫(xiě)操作,而擦除操作以塊為單位,讀、寫(xiě)和擦除操作均通過(guò)命令完成;不能字節(jié)擦除,在每次改寫(xiě)操作之前需要先擦除一整塊;出廠時(shí)有一定比例的壞塊存在;每一塊的擦除次數(shù)有限,為10萬(wàn)次左右[1]。

2  YAFFS文件系統(tǒng)簡(jiǎn)介

  YAFFS是第一個(gè)專(zhuān)門(mén)為NAND Flash存儲(chǔ)器設(shè)計(jì)的嵌入式文件系統(tǒng),適用于大容量的存儲(chǔ)設(shè)備;并且是在GPL(General Public License)協(xié)議下發(fā)布的,可在其網(wǎng)站免費(fèi)獲得源代碼。

  YAFFS中,文件是以固定大小的數(shù)據(jù)塊進(jìn)行存儲(chǔ)的,塊的大小可以是512字節(jié)、1 024字節(jié)或者2 048字節(jié)。這種實(shí)現(xiàn)依賴(lài)于它能夠?qū)⒁粋€(gè)數(shù)據(jù)塊頭和每個(gè)數(shù)據(jù)塊關(guān)聯(lián)起來(lái)。每個(gè)文件(包括目錄)都有一個(gè)數(shù)據(jù)塊頭與之相對(duì)應(yīng),數(shù)據(jù)塊頭中保存了ECC(Error Correction Code)和文件系統(tǒng)的組織信息,用于錯(cuò)誤檢測(cè)和壞塊處理。充分考慮了NAND Flash的特點(diǎn),YAFFS把這個(gè)數(shù)據(jù)塊頭存儲(chǔ)在Flash的16字節(jié)備用空間中。當(dāng)文件系統(tǒng)被掛載時(shí),只須掃描存儲(chǔ)器的備用空間就能將文件系統(tǒng)信息讀入內(nèi)存,并且駐留在內(nèi)存中,不僅加快了文件系統(tǒng)的加載速度,也提高了文件的訪(fǎng)問(wèn)速度,但是增加了內(nèi)存的消耗。

  為了在節(jié)省內(nèi)存的同時(shí)提高文件數(shù)據(jù)塊的查找速度,YAFFS利用更高效的映射結(jié)構(gòu)把文件位置映射到物理位置。文件的數(shù)據(jù)段被組織成樹(shù)型結(jié)構(gòu),這個(gè)樹(shù)型結(jié)構(gòu)具有32字節(jié)的節(jié)點(diǎn),每個(gè)內(nèi)部節(jié)點(diǎn)都包括8個(gè)指向其他節(jié)點(diǎn)的指針,葉節(jié)點(diǎn)包括16個(gè)2字節(jié)的指向物理地址的指針。YAFFS在文件進(jìn)行改寫(xiě)時(shí)總是先寫(xiě)入新的數(shù)據(jù)塊,然后將舊的數(shù)據(jù)塊從文件中刪除。這樣即使在修改文件時(shí)意外掉電,丟失的也只是這一次修改數(shù)據(jù)的最小寫(xiě)入單位,從而實(shí)現(xiàn)了掉電保護(hù),保證了數(shù)據(jù)完整性。

  結(jié)合貪心算法的高效性和隨機(jī)選擇的平均性,YAFFS實(shí)現(xiàn)了兼顧損耗平均和減小系統(tǒng)開(kāi)銷(xiāo)的目的。當(dāng)滿(mǎn)足特定的小概率條件時(shí),就會(huì)嘗試隨機(jī)選擇一個(gè)可回收的頁(yè)面;而在其他情況下,則使用貪心算法來(lái)回收最“臟”的塊[2]。

  YAFFS文件系統(tǒng)是按層次結(jié)構(gòu)設(shè)計(jì)的,分成以下4部分: yaffs_guts.c,文件系統(tǒng)的主要算法,這部分代碼完全是用可移植的C語(yǔ)言編寫(xiě)的;yaffs_fs.c,Linux VFS層的接口;NAND 接口,yaffs_guts 和NAND 內(nèi)存訪(fǎng)問(wèn)函數(shù)之間的包裝層,例如調(diào)用Linux mtd 層或者RAM模擬層;可移植函數(shù),服務(wù)的包裝函數(shù)。最重要的一點(diǎn)是,為了獲得更好的移植性,YAFFS提供直接調(diào)用的模式,這才使得我們有機(jī)會(huì)來(lái)實(shí)現(xiàn)YAFFS文件系統(tǒng)在C51系統(tǒng)上的移植。

3  移植過(guò)程

  可在http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/ 獲得direct源碼,包括以下幾個(gè)文件及其頭文件。

  ◆ yaffscfg.c: 設(shè)置各種設(shè)備參數(shù)和系統(tǒng)參數(shù)。
  ◆ yaffsfs.c: 主要實(shí)現(xiàn)直接調(diào)用的接口函數(shù),如打開(kāi)文件、寫(xiě)文件和關(guān)閉文件等。 使用時(shí)在應(yīng)用程序中包含其頭文件即可。
  ◆ yaffs_flashif.c: NAND Flash操作函數(shù)接口,就是直接對(duì)存儲(chǔ)器操作的底層函數(shù)。為了測(cè)試,此文件中用RAMDISK模擬的方法實(shí)現(xiàn)了對(duì)Flash存儲(chǔ)器的操作。實(shí)際應(yīng)用中,需要修改其中對(duì)Flash硬件操作函數(shù)的定義,包括yflash_EraseBlockInNAND()、yflash_WriteChunk?ToNAND()、yflash_ReadChunkFromNAND()和yflash_InitialiseNAND()。
  ◆ yaffs_guts.c: YAFFS文件系統(tǒng)的主要實(shí)現(xiàn)算法。
  ◆ nand_ecc.c:: ECC算法。
  ◆ yaffs_ramdisk.c:: RAMDISK支持代碼。
  ◆ yaffs_fileem.c: 用主機(jī)上的一個(gè)文件來(lái)模擬Flash存儲(chǔ)器,僅用于測(cè)試。
  ◆ dtest.c:: 直接調(diào)用文件系統(tǒng)的測(cè)試函數(shù)。

  獲得源碼以后,移植的過(guò)程可以分為2步:①  根據(jù)自己的需要進(jìn)行裁減;②  將代碼向C51風(fēng)格轉(zhuǎn)化。

3.1  裁減

  YAFFS是一個(gè)功能強(qiáng)大的文件系統(tǒng),考慮到C51系統(tǒng)的程序代碼存儲(chǔ)器和RAM資源都很有限,而應(yīng)用中可能不需要某些文件操作的功能,所以有必要對(duì)這個(gè)文件系統(tǒng)進(jìn)行裁減。裁減包括代碼裁減和數(shù)據(jù)結(jié)構(gòu)的修改。

  首先,將用來(lái)測(cè)試的yaffs_ramdisk.c、yaffs_ramdisk.h、yaffs_fileem.c和interface.h這幾個(gè)文件去掉,并在yaffscfg.c加上#include yaffs_flashif.h。

  本系統(tǒng)中,只是對(duì)K9F5608中的3個(gè)數(shù)據(jù)庫(kù)文件進(jìn)行讀/寫(xiě),一級(jí)目錄足夠,單用戶(hù)不存在操作權(quán)限問(wèn)題,簡(jiǎn)單的文件存儲(chǔ)不涉及連接(Linux類(lèi)操作系統(tǒng)文件間的關(guān)系)問(wèn)題,所以可在系統(tǒng)中刪除與目錄操作、操作權(quán)限以及文件連接相關(guān)的操作函數(shù)。

  在yaffsfs.c及其頭文件中包括(省略yaffs_前綴): readlink(), DumpDir(), readdir(), opendir(), lstat(), stat(), freespace(), chmod(), mkdir(), rename(),link(), closedir(), FollowLink(), fstat(), listclear(), fchmod(),sylink()和mknod()。

  在yaffs_guts.c及其頭文件中包括(省略yaffs_前綴): Renameobject(), mknodedirectoty(), mknodSymLink(), mknodSpecial(), Link(), GetAttributes(), GetSymLinkAlias(), root(), LostNFound(), GutsTest(), DumpObject(), GetNumberofFreeChunk(), GetObjectLInkCount()和GetEquivalentObject()。

  然后根據(jù)自己的需要進(jìn)行數(shù)據(jù)結(jié)構(gòu)修改,與上文提到的目錄操作、操作權(quán)限以及文件連接相關(guān)的數(shù)據(jù)結(jié)構(gòu)(如Uid、Gid、nlink等)對(duì)我們來(lái)說(shuō)就沒(méi)有意義了,因此需要修改相關(guān)的數(shù)據(jù)結(jié)構(gòu)。為了節(jié)省內(nèi)存,還要修改一些宏定義的數(shù)據(jù)常量,例如同時(shí)在運(yùn)行的句柄數(shù)目和文件名的最大長(zhǎng)度等。

  裁減工作最好能在一臺(tái)裝有Linux操作系統(tǒng)的機(jī)器上進(jìn)行,可以邊裁減,邊利用模擬方式來(lái)檢查是否能實(shí)現(xiàn)自己所需的功能。[!--empirenews.page--]

3.2  向C51風(fēng)格轉(zhuǎn)化

  YAFFS文件系統(tǒng)是在Linux環(huán)境下利用開(kāi)發(fā)用戶(hù)程序的C語(yǔ)言開(kāi)發(fā)的。它與C51是有些差別的,主要有:

  ◇ C51不支持__inline__函數(shù)修飾符,可以將其宏定義為空;
  ◇ u8、u16、u32都需要重新宏定義成為C51的數(shù)據(jù)類(lèi)型unsigned char、unsigned int和unsigned long;
  ◇ off_t定義為long。

  在YAFFS源代碼中有用data和bit作為變量的,而在C51中這些都是關(guān)鍵詞,須將其替換。

  在YAFFS源代碼中yaffs_Device結(jié)構(gòu)體的定義中使用了帶參數(shù)的函數(shù)指針,通過(guò)調(diào)用該指針指向的函數(shù)來(lái)對(duì)Flash硬件進(jìn)行操作,而C51中通過(guò)寄存器函數(shù)指針來(lái)調(diào)用函數(shù)不能傳遞實(shí)際參數(shù),除非所得參數(shù)可在寄存器間傳遞。因此這里將yaffs_Device結(jié)構(gòu)體定義中的函數(shù)指針去掉,而直接調(diào)用yaffs_if.c中的Flash接口函數(shù)。

  向C51風(fēng)格轉(zhuǎn)化時(shí),最好是在Keil集成開(kāi)發(fā)環(huán)境中一邊修改,一邊編譯,發(fā)現(xiàn)錯(cuò)誤后再進(jìn)行修改。當(dāng)編譯器提示有多個(gè)錯(cuò)誤時(shí),要從第一個(gè)錯(cuò)誤開(kāi)始修改;可能前面的錯(cuò)誤修改完畢,后面的錯(cuò)誤就不再是錯(cuò)誤了。

4  C51系統(tǒng)下的YAFFS使用實(shí)例

  下面的程序代碼是設(shè)計(jì)中的對(duì)DBF數(shù)據(jù)庫(kù)文件操作的關(guān)鍵代碼。

yaffs_StartUp();//設(shè)置一些參數(shù),包括各分區(qū)在Flash中的起始?jí)K和結(jié)束塊的地址、預(yù)留塊數(shù)等
yaffs_mount("/flash"); //YAFFS支持多個(gè)分區(qū),這里選擇掛載/flash分區(qū)新建文件db1.dbf
f=yaffs_open("/flash/db1.dbf", O_CREAT,S_IREAD | S_IWRITE);
yaffs_close(f);//關(guān)閉文件db1.dbf
f=yaffs_open("/flash/db1.dbf", O_RDWR,0);//以讀/寫(xiě)的方式打開(kāi)文件db1.dbf
r=yaffs_write(f,"hello",5);//向文件寫(xiě)數(shù)據(jù)
yaffs_lseek(f,2,SEEK_SET);//移動(dòng)文件讀/寫(xiě)指針
r=yaffs_write(f,"world",5);
r=yaffs_lseek(f,0,SEEK_SET);
r=yaffs_read(f,buffer,10);//從文件讀取數(shù)據(jù)
r=yaffs_close(f);//關(guān)閉文件db1.dbf
r=yaffs_unlink("/flash/db1.dbf");//刪除文件db1.dbf

  可見(jiàn), YAFFS的接口函數(shù)的使用方法與標(biāo)準(zhǔn)C語(yǔ)言中對(duì)文件的操作函數(shù)十分相似,簡(jiǎn)單易用。

5  總結(jié)

  YAFFS文件系統(tǒng)是第一個(gè)專(zhuān)門(mén)為NAND Flash存儲(chǔ)器編寫(xiě)的嵌入式文件系統(tǒng)。它實(shí)現(xiàn)了掉電保護(hù)、疲勞均衡和有效的垃圾回收,與JFFS相比占用資源更少,運(yùn)行速度更快;與FAT相比,更適合用于管理NAND Flash數(shù)據(jù)存儲(chǔ)器。在C51系統(tǒng)中如果需要實(shí)現(xiàn)Flash文件系統(tǒng),那么移植YAFFS是個(gè)不錯(cuò)的選擇,但是畢竟它是一個(gè)在32位機(jī)的Linux下開(kāi)發(fā)出來(lái)的,要讓它能與8位機(jī)的C51風(fēng)格完美結(jié)合,還需要進(jìn)一步的努力。 

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉