<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > RTOS文件系統對比:LittleFS Vs. SPIFFS

RTOS文件系統對比:LittleFS Vs. SPIFFS

發(fā)布人:電子禪石 時(shí)間:2024-09-14 來(lái)源:工程師 發(fā)布文章
概述#

在RTOS上免費的文件系統本身就不多,廣泛使用且掉電安全的就更少了。本文選取當前RTOS上比較受歡迎的兩個(gè)文件系統 SPIFFS 和 LittleFS 做全方位的對比,以便項目上評估在RTOS上使用什么FS。

對嵌入式設備來(lái)說(shuō),掉電時(shí)有發(fā)生。如果文件系統無(wú)法保證掉電安全,那么非常有可能在某一次掉電時(shí),設備就變磚了。

不管是 SPIFFS 還是 LittleFS 的小型文件系統,都號稱(chēng)做到掉電安全。而常見(jiàn)的FAT32由于無(wú)法做到掉電安全,或者某些特供版要付費使用,更多時(shí)候是在需要Windows兼容性時(shí)才會(huì )考慮。

LittleFS 官網(wǎng)鏈接
SPIFFS 官網(wǎng)鏈接

開(kāi)源協(xié)議#

不管是 SPIFFS 還是 LittleFS 都開(kāi)源在 GitHub 中。前者是 MIT開(kāi)源協(xié)議,后者是 BSD開(kāi)源協(xié)議。

在文章《了解常見(jiàn)的開(kāi)源協(xié)議(BSD, GPL, LGPL,MIT)》 上這么評論 BSD開(kāi)源協(xié)議

CopyBSD代碼鼓勵代碼共享,但需要尊重代碼作者的著(zhù)作權。BSD由于允許使用者修改和重新發(fā)布代碼,也允許使用或在BSD代碼上開(kāi)發(fā)商業(yè)軟件發(fā)布和銷(xiāo)售,因此是對商業(yè)集成很友好的協(xié)議。

對MIT開(kāi)源協(xié)議有如下總結:

CopyMIT是和BSD一樣寬范的許可協(xié)議,作者只想保留版權,而無(wú)任何其他了限制。也就是說(shuō),你必須在你的發(fā)行版里包含原許可協(xié)議的聲明,無(wú)論你是以二進(jìn)制發(fā)布的還是以源代碼發(fā)布的。

雖然從使用者的權限來(lái)說(shuō),MIT開(kāi)源協(xié)議要比BSD開(kāi)源協(xié)議更少限制,但對企業(yè)商用來(lái)說(shuō),兩者都可放心使用。

社區維護情況#

以GibHub上第一個(gè)提交作為項目開(kāi)始時(shí)間,那么SPIFFS項目作者是Peter Andersson,始于2013年7月4日。而LittleFS的作者是Christopher Haster,始于2017年2月20日。值得一提的是,LittleFS是ARM工程師折騰出來(lái)的文件系統,最先應該是運用在A(yíng)RMmbed上的。

從時(shí)間上來(lái)說(shuō),LittleFS項目要晚于SPIFFS項目。我們再看看社區當前維護情況。

SPIFFS項目在2018年沒(méi)有任何提交,在2019年只有2個(gè)提交。分析提交補丁的內容,我們發(fā)現對FS的運行流程有實(shí)質(zhì)修改的最后一個(gè)提交是在2017年10月15日。換句話(huà)說(shuō),SPIFFS項目要不是已經(jīng)足夠穩定到?jīng)]有任何bug,要不漸漸被遺棄。

相比與SPIFFS項目的落日余暉,LittleFS更像冉冉升起的太陽(yáng)。從2017年到文本撰稿時(shí)的2020年3月初,社區一直非?;钴S,以2019年為例,共計合并了124個(gè)提交,釋放了10個(gè)版本。目前最新的版本是2.1.4,而據我與作者的溝通,其正在為2.2版本做Bug修復。

到目前為止,在GitHub的統計上,SPIFFS項目共計934個(gè)星,而LittleFS項目達到1.7K個(gè)星。

因此,SPIFFS在社區上已經(jīng)不怎么維護,而LittleFS依然活躍。持續迭代的軟件會(huì )更強大和更穩定。

靜態(tài)系統資源#

對比靜態(tài)系統資源,我們主要比較編譯后的bin文件的text/data/bss段的大小。

Copytext段:存放代碼執行語(yǔ)句data段:存放已初始化的全局變量和局部靜態(tài)變量bss段:未初始化的全局變量和局部靜態(tài)變量

這3個(gè)段的數據都是在編譯時(shí)就已經(jīng)確定下來(lái)的。如果某一個(gè)軟件代碼量非常龐大,其對應的text段也會(huì )龐大,也就意味著(zhù)在運行時(shí),需要用更多的內存存放代碼語(yǔ)句。

我設計了下面的Shell命令統計靜態(tài)信息:

Copyfind -name "*.o" -exec size {} \; | awk '
	BEGIN{
		datasum = 0;
		textsum = 0;
		bsssum = 0;
	};
	/data/{
		getline;
		textsum += $1;
		datasum += $2;
		bsssum += $3;
	};
	END{
		printf "text %d\ndata %d\nbss %d\n", textsum, datasum, bsssum
	}
'

統計結果如下:

FStextdatabss
littlefs2400000
spiffs3694000

可以發(fā)現,SPIFFS的代碼量比LittleFS多53%,也就意味著(zhù)SPIFFS需要更多的內存存放代碼。

實(shí)測-環(huán)境#

并不是所有的對比都可以直接從代碼上看出來(lái),我們需要上機實(shí)測。實(shí)測是為了獲取最真實(shí)的對比數據。

不講環(huán)境和配置,直接對比SPIFFS和LittleFS,簡(jiǎn)直是在耍流氓。因此,我們先看看實(shí)測的環(huán)境。

測試時(shí)使用 0.3.7 版本的SPIFFS,其配置如下:

Copyphys_size = 5013504Bphys_addr = 0phys_erase_block = 32Klog_block_szie = 64Klog_page_size = 256B

測試時(shí)使用 2.1.3 版本的LittleFS,其配置如下:

Copyread_size = 256Bprog_size = 256Bblock_szie = 32K or 4Kcache_size = 256Blookahead_size = 16

在旺宏16M的SPI Nor上測試,SPI Nor運行在4線(xiàn)讀寫(xiě)命令和100MHz的SPI時(shí)鐘頻率上。用于做測試的分區有4896KB。

確保RTOS上并無(wú)任何無(wú)關(guān)進(jìn)程在搶CPU、IO資源。

換句話(huà)說(shuō),測試在使用相同的硬件環(huán)境,無(wú)其他進(jìn)程干擾的情況下進(jìn)行。

空間利用率#

文件系統需要額外空間存放一些元數據,因此用戶(hù)可用的空間實(shí)際大小并不直接等于分區大小。在 4896KB 的分區上分別掛載SPIFFS和Littlefs兩個(gè)文件系統,他們的可用空間是多少呢?

空的文件系統體現不出來(lái),我們試著(zhù)往不同文件系統中存放一些資源文件,再觀(guān)察使用情況。

這些資源文件在ubuntu的ext4 (塊大小為4K)中統計有2794KB的大小。以此為標準,我們看看SPIFFS和LittleFS的空間使用情況

FSused(KB)total(KB)note
SPIFFS27224607
LittleFS36804896block size = 32K
LittleFS28004896block size = 4K

由于LittleFS的塊大小決定了文件存儲的最小單位,因此分別統計塊大小為4K和32K的空間使用情況。當塊越大,則越有可能會(huì )出現空間浪費的情況。例如32K的塊大小,即使文件內容只有1KB,LittleFS也會(huì )為其分配32K的空間,造成了31K的空間浪費。

從空間利用率來(lái)看,SPIFFS略?xún)?yōu)于LittleFS。

掉電安全和修復#

文件系統的掉電安全指在任意一時(shí)刻掉電,文件系統依然能保證其一致性,文件系統允許丟失掉電時(shí)沒(méi)寫(xiě)完整的數據,但不能奔潰。

我們通過(guò)讀寫(xiě)掉電的方式驗證掉電安全,即在讀寫(xiě)壓測時(shí)隨機時(shí)間掉電,再次上電后需要保證文件系統正常運行且已寫(xiě)入的文件數據不丟失。

SPIFFS掉電后需要調用SPIFFS_check()進(jìn)行修復,否則無(wú)法保證文件系統一致性。這就類(lèi)似于ext4與e2fsck的關(guān)系。

在實(shí)測中,4896KB的空間,SPIFFS的修復竟然要510s,相對于一次RTOS啟動(dòng)總耗時(shí)23s而言,簡(jiǎn)直無(wú)法忍受。在項目中已經(jīng)放棄對其的掉電壓測。

與SPIFFS相反,LittleFS在設計時(shí)就保證了掉電安全的問(wèn)題,因此不需要每次掉電后執行修復工作。

而2.1.3版本的LittleFS在10W次的掉電測試中,在數萬(wàn)次掉電后小概率出現文件系統奔潰導致不能正確掛載的情況。分析良久,確認是LittleFS本身邏輯的問(wèn)題。已反饋社區,預計在2.2版本解決。

總的來(lái)說(shuō),SPIFFS的掉電安全修復耗時(shí)不符合項目需求,而LittleFS目前還做不到絕對的掉電安全。比較幸運的是,LittleFS的掉電安全問(wèn)題復現概率比較低,且LittleFS社區比較活躍,在發(fā)現問(wèn)題后能及時(shí)提出解決方案。

讀寫(xiě)性能#

當空間使用率不同,測試的性能有可能不一樣,在SPIFFS中尤其明顯。

IO操作空閑空間SPIFFSLittleFS(32K Block)LittleFS(4K Block)
20%6095.24 KB/s8629.21 KB/s7529.41 KB/s
100%6564.10 KB/s8727.27 KB/s7314.29 KB/s
寫(xiě)20%21.64 KB/s142.54 KB/s121.92 KB/s
寫(xiě)100%128.49 KB/s155.37 KB/s127.87 KB/s

在讀寫(xiě)性能表現上,SPIFFS最差,且剩余空間越少,SPIFFS寫(xiě)性能越差。LittleFS的性能相對比較高和穩定,塊大小會(huì )直接影響到寫(xiě)性能。

動(dòng)態(tài)內存#

動(dòng)態(tài)內存指通過(guò)malloc申請分配的堆內存大小。不管是SPIFFS還是LittleFS都是為小系統設計的,其內存使用情況都經(jīng)過(guò)精心設計,內存占用非常小。

LittleFS會(huì )為每個(gè)打開(kāi)的文件單獨申請一個(gè)cache_size的內存,在測試時(shí),cache_size 為256B。為了對比的公平性,我們假設SPIFFS和LittleFS打開(kāi)相同數量的文件情況下統計內存。

LittleFSSPIFFS
3856 B3790 B

兩者使用動(dòng)態(tài)內存的情況相近,在最大打開(kāi)數量的情況下,SPIFFS使用動(dòng)態(tài)內存略少。

由于SPIFFS的內存使用并不會(huì )隨著(zhù)打開(kāi)文件增加而增加,也就意味著(zhù),在打開(kāi)少量文件的情況下,LittleFS會(huì )比SPIFFS更少的動(dòng)態(tài)內存使用量。

CPU占用#

在讀寫(xiě)壓測時(shí),統計進(jìn)程使用的CPU資源百分比

LittleFS (32K)LittleFS (4K)SPIFFS
22~2727~5044~80

可以發(fā)現,在相同情況下,LittleFS的CPU占用率會(huì )比SPIFFS少。

總結#

本文從多個(gè)方面對比評估 LittleFS 和 SPIFFS,發(fā)現資源、性能、掉電安全和社區支持情況來(lái)說(shuō),后來(lái)者 LittleFS 已經(jīng)青出于藍。


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: littlefs

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>