某個方案使用的是spinor做爲存儲介質,每次燒錄新固件都耗時數分鐘,爲了提升效率,須要對其進行優化。html
當前燒錄流程,有一個可選步驟,全盤擦除,這個步驟耗時達數分鐘。不過這是可選的。性能
接下來必經的步驟,就是從PC端接收數據寫入flash了。優化
目前卻是已經有一個優化,在收到數據須要寫入時,會先讀出flash中的數據跟這筆要寫入的數據進行比較,若是數據相同就直接跳過,數據不一樣,才進行擦除和寫入。
這個優化的依據是,相對於一次擦除和寫入的耗時來講,讀出和比較的耗時不多,一旦命中就可節省掉此次寫的開銷。在平時調試的時候,兩次燒錄的固件可能有些數據是徹底同樣的,這種場景下此處的優化就能發揮做用了。url
初步分析,從流程上看沒什麼問題,最大的耗時在擦除上,但畢竟nor的物理特性就是須要先擦除再寫入的。調試
但仔細分析,其實仍是有優化空間的,這個空間還就在於nor的擦除上。htm
nor擁有多條擦除的命令,能夠擦除4k,32k,64k或者整片擦除。這些命令的耗時是不一樣的。blog
方案上因爲分區規劃設置了最小爲4k的分區,因此nor就被配置爲4k sector,則nor驅動使用的擦除命令就是對應的4k擦除的命令。而這是效率最低的一種擦除方式。ip
當前方案在全盤擦除時,是使用循環調用4k擦除實現的,在後續寫入數據時也都是以4k爲單位進行擦除和寫入,在擦除上耗費了大量時間。get
這幾種擦除方式,差別到底有多大呢?flash
找兩款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擦除了。