FDS操作時掉電導緻固件變磚分析
産品使用nRF52840, nRF5 17.02 SDK。 通過FDS來存儲MAC位址,每次開機會讀取FDS中的MAC位址,每次開機主要MCU都會發MAC位址給藍牙闆,如果和本地存儲的MAC不一緻,就會寫入新MAC。 開機會判斷髒資料,進行GC操作。産品在産線上會更換主要闆和藍牙闆,并且會随時拔插電池(斷電)。
出現了幾個藍牙版通過産線測試後,無法正常啟動的現象。懷疑是操作Flash是導緻的問題。
一、分析
1 FDS格式

2 藍牙闆Flash分區
3 異常闆存MAC位址内容
藍牙闆1
$ nrfjprog -f nrf52 --memrd 0xf4000 --w 8 --n 64
0x000F4000: DE C0 AD DE FE 01 1E F1 11 11 02 00 02 00 00 00 |................|
0x000F4010: 13 00 00 00 01 00 00 00 FE C5 00 00 FF FF FF FF |................|
0x000F4020: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
0x000F4030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
$ nrfjprog -f nrf52 --memrd 0xf5000 --w 8 --n 64
0x000F5000: DE C0 AD DE FE 01 1E F1 FF FF FF FF FF FF FF FF |................|
0x000F5010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
0x000F5020: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
0x000F5030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
藍牙闆2
$ nrfjprog -f nrf52 --memrd 0xf4000 --w 8 --n 64
0x000F4000: DE C0 AD DE FE 01 1E F1 FF FF FF FF FF FF FF FF |................|
0x000F4010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
0x000F4020: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
0x000F4030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
$ nrfjprog -f nrf52 --memrd 0xf5000 --w 8 --n 64
0x000F5000: DE C0 AD DE FE 01 1E F1 11 11 02 00 02 00 00 00 |................|
0x000F5010: 0D 00 00 00 01 00 00 00 FE C5 00 00 FF FF FF FF |................|
0x000F5020: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
0x000F5030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
理論上要麼F4000和F5000上,必然有一個是0xF11E01FE一個是0xF11E01FF。現在兩個都是0xF11E01FE。導緻程式判斷異常,在BootLoader就當機了。
擦除F4000頁内容後,兩個固件都可以正常工作。
4 結論
隻有才GC(垃圾回收的時候)才會擦寫兩個分區頭部。鎖定是在GC操作的過程中,出現異常斷電情況導緻的。