引言
在許多基于 BlueNRG-1/2 系列芯片的低功耗藍(lán)牙的設(shè)計(jì)項(xiàng)目時(shí),客戶通常會(huì)在 Flash的特定區(qū)域存儲(chǔ)定制的數(shù)據(jù)。然而需要特別注意的是,在 BlueNRG-1/2 方案中,用戶對(duì)Flash 的讀寫操作必須在射頻空閑的情況下進(jìn)行,兩者是互斥的關(guān)系。
問題描述
客戶經(jīng)常反饋類似問題,諸如:當(dāng)用戶程序嘗試將用戶定制數(shù)據(jù)寫入 Flash 中特定區(qū)域時(shí),發(fā)現(xiàn) BLE 射頻部分停止工作,或芯片直接死機(jī)了。
解決辦法
使用一個(gè)雙向鏈表來管理 Flash 操作(Flash 擦除或者是 Flash 寫,F(xiàn)lash 讀無需和BLE 相關(guān)事件互斥),并使用一個(gè)雙向鏈表來管理空余時(shí)間狀態(tài)。在空余的時(shí)間執(zhí)行Flash 操作。從芯片手冊(cè)可以知道,操作 Flash,特別是擦除時(shí),會(huì)占用比較多的時(shí)間。為了避免操作 Flash 占用過多的時(shí)間片,把每次寫或者擦除 Flash,用一個(gè)列表來管理,每次寫或者擦除操作,插入 Flash 操作鏈表的最后。 在主循環(huán)中檢測(cè)是否有足夠的時(shí)間寫,如果當(dāng)前空閑的時(shí)間足夠,取出 Flash 操作鏈表中最前的一個(gè)節(jié)點(diǎn),執(zhí)行 Flash 操作,然后將節(jié)點(diǎn)移除。對(duì)于如何檢測(cè)空閑時(shí)刻,也用一個(gè)鏈表來管理空閑時(shí)刻。
將上述方案加入客戶工程的步驟示例
小結(jié)
- 如果使用此方法中的 Flash 擦除,沒有任何 BLE 事件時(shí),直接調(diào)用此方法不會(huì)執(zhí)行任何 Flash 的操作。所以當(dāng)沒有藍(lán)牙事件時(shí),可以使用 SDK 默認(rèn)的 Flash 訪問接口或者是手工調(diào)度函數(shù),類似這樣:flash_list_tick(~0u)
- 工程測(cè)試源碼參考附件壓縮包:BlueNRG Flash vs BLE event handle source code.7z
- 工程路徑為:BlueNRG_Demo/BlueNRG-1_2 DK 3.1.0/Project/Supply/BLE_Chat_Master_Slave_WithFlashAccess/