背景
某個方案使用的是spinor作為存儲介質,每次燒錄新固件都耗時數分鍾,為了提高效率,需要對其進行優化。
分析流程
基本流程
當前燒錄流程,有一個可選步驟,全盤擦除,這個步驟耗時達數分鍾。不過這是可選的。
接下來必經的步驟,就是從PC端接收數據寫入flash了。
已有優化
目前倒是已經有一個優化,在收到數據需要寫入時,會先讀出flash中的數據跟這筆要寫入的數據進行比較,如果數據相同就直接跳過,數據不同,才進行擦除和寫入。
這個優化的依據是,相對於一次擦除和寫入的耗時來說,讀出和比較的耗時很少,一旦命中就可節省掉這次寫的開銷。在平時調試的時候,兩次燒錄的固件可能有些數據是完全一樣的,這種場景下此處的優化就能發揮作用了。
優化點
初步分析,從流程上看沒什么問題,最大的耗時在擦除上,但畢竟nor的物理特性就是需要先擦除再寫入的。
但仔細分析,其實還是有優化空間的,這個空間還就在於nor的擦除上。
nor擁有多條擦除的命令,可以擦除4k,32k,64k或者整片擦除。這些命令的耗時是不同的。
方案上由於分區規划設置了最小為4k的分區,所以nor就被配置為4k sector,則nor驅動使用的擦除命令就是對應的4k擦除的命令。而這是效率最低的一種擦除方式。
當前方案在全盤擦除時,是使用循環調用4k擦除實現的,在后續寫入數據時也都是以4k為單位進行擦除和寫入,在擦除上耗費了大量時間。
nor的幾種擦除命令
這幾種擦除方式,差異到底有多大呢?
找兩款16M的norflash規格書看看。
比較表格:
擦除大小(Kbytes) | 擦除時間(ms) | 每4k擦除耗時(ms) | 以4k為基准的耗時比例 |
---|---|---|---|
4 | 70 | 70 | 100% |
32 | 150 | 18.75 | 26% |
64 | 200 | 12.5 | 17% |
16 * 1024 | 3500 | 0.85 | 1.2% |
另一款:
比較表格:
擦除大小(Kbytes) | 擦除時間(ms) | 每4k擦除耗時(ms) | 以4k為基准的耗時比例 |
---|---|---|---|
4 | 25 | 25 | 100% |
32 | 140 | 17.5 | 70% |
64 | 250 | 15.62 | 62% |
16 * 1024 | 2600 | 0.63 | 2.5% |
從以上統計結果看,一次擦除的空間越大,平均速度就越快。
特別是chip擦除的速度高達到4k擦除的幾十倍。
優化方案
找到了優化點,結合燒錄流程就有了以下思路
方案一
設法將4k擦除改為32k,64k擦除。
這種對於分區本身並非4k對齊來說,實現上會比較麻煩,需要代碼中維護一個緩沖區進行數據的拼接,並處理一些邊界情況。
方案二
在燒錄的最開始進行一次chip擦除。並在后續的寫入時,跳過擦除步驟,直接寫入。
這種方案對於燒錄場景來說,非常合適,實現起來也簡單。
最終采用方案二,改動小,效果明顯,燒錄速度從數分鍾降到了1分鍾以內。
但這個只適用於燒錄場景。如果是要對系統運行時的寫性能進行優化,就只能考慮盡量用64k擦除了。