營銷型網站有哪些特點外貿網站建設 google
目錄
1、框架總述
2、com區(qū)和bank區(qū)
com區(qū)(公共區(qū)):
bank區(qū)(也稱為flash區(qū)):
3、開發(fā)時需要注意:
終上所述, 開發(fā)時需要注意如下:
4、函數放入com區(qū)的寫法
1、框架總述
? ? ? ?隨著藍訊藍牙方案在這一年兩迅速崛起, 公司也開始涉及到藍訊藍牙方案開發(fā), 在這里記錄一些找到資料和自己的理解, 和大家一起分享。
? ? ? ?LX藍牙芯片采用最近比較流行的RISC-V(32位)開源內核架構 + 國產RT-Thread操作系統(tǒng)。不過從代碼上來看,?操作系統(tǒng)代碼已經被封裝到庫中, 一般用戶可以不用涉及操作系統(tǒng)代碼, 降低了開發(fā)難度。
LX芯片“馮·諾依曼結構”, 即代碼與數據的統(tǒng)一編址??蚣芙Y構大致如下:
?
芯片內部一般會封裝一顆512K或1M SpiFlash, 用于存放代碼及資源文件/參數記憶等. SpiFlash和芯片之間通過spi接口進行通信.
? ? ? ?首先,代碼不會直接在SpiFlash上運行, SpiFlash中所有程序及數據均需要先通過spi接口加載到芯片RAM中, CPU再從RAM中取指令或數據運行.
2、com區(qū)和bank區(qū)
基于上述的程序存儲框架, LX芯片在程序編寫時, 有兩個重要的概念: com區(qū)(公共區(qū)) 和 bank區(qū).
com區(qū)(公共區(qū)):
? ? ? ?芯片上電, 一般從Mask程序區(qū)開始運行,?在進入main函數之前, 程序會先把com區(qū)程序從Flash加載到芯片內部Ram. 由于在程序的整個生命周期內, com區(qū)程序會一直保留在RAM中. CPU執(zhí)行com區(qū)代碼會很快. ?
但由于芯片RAM有限, com區(qū)一般分配在幾十K以內.
bank區(qū)(也稱為flash區(qū)):
Flash中的bank區(qū)(存儲區(qū))一般是幾百K以上.
RAM中的bank程序運行區(qū)(類似cache), 一般從幾K到幾十K不等.
? ? ? ?由于RAM中的bank區(qū)遠遠小于FLASH中的bank區(qū), 所以CPU會根據需要不斷把Flash(bank程序存儲區(qū))中的代碼動態(tài)替換(加載)到 RAM中的bank程序運行區(qū)運行. 由于芯片與Flash之間通過spi進行通信, bank區(qū)代碼執(zhí)行速度相對比較慢.
3、開發(fā)時需要注意:
終上所述, 開發(fā)時需要注意如下:
-
1)中斷函數(及其子函數)必須放入com區(qū),?否則(放入bank區(qū))會導致死機.
? ?中斷響應需要非常及時, com區(qū)程序常駐于RAM中, CPU可以迅速響應中斷函數. ?
? ? ? ?如果中斷函數放入bank區(qū), 中斷響應時,可能該bank區(qū)還未加載到RAM中, 還需要先加載再運行,耗時相對較慢. ?為了防止中斷響應慢,芯片做了限定: 中斷中加載bank區(qū)代碼則直接死機.?
? ?另外需要特別注意:?中斷函數中不能有switch語句,?swith語句編譯后生成的跳轉常量表會默認放到bank區(qū), 引起中斷函數訪問bank區(qū)死機. 請用if-else語句代替switch語句.
? ?一些實時性要求比較高的代碼,首選放入com區(qū).
-
2).函數前沒有AT指定存放段的代碼, 默認放入bank區(qū),??bank區(qū)代碼自動加載(或替換), 不需要人工干預.
? ? ? ?由于bank區(qū)加載到RAM, 需要spi通信, IO翻轉會有一定干擾, 在一些對干擾敏感的應用中, 如FM,?可以把所有相關程序放入同一個命名的bank, 這樣bank加載時, 會大概率地把所有同一bank中的程序一次性加載到RAM中,減少程序運行時可能不斷多次地加載引起的spi通信干擾.
4、函數放入com區(qū)的寫法
在函數前面加入AT(.指定段名到com區(qū)) 即可.示例如 usr_tmr1ms_isr函數前面AT(.com_text.timer)
AT(.com_text.timer)
void usr_tmr1ms_isr(void)
{gui_scan(); .....
}
?在map.text中可以看到, usr_tmr1ms_isr位于 0x20e4a.位于0x20000~ (0x20000+34K) 的com區(qū)內.
?
另外有一點, printf參數中的字符串常量也是默認放在bank區(qū)中, 如果在中斷中調用printf, 也需要把字符串常量放入com區(qū).
如下:
AT(.com_text.str1)
const char str1[] = “Com String”;
AT(.com_text.str2) / / 注意每個字符串前都需要增加 AT定位到com區(qū)去.
const char str2[] = “val = %d\n”;
調用printf時, 直接使用該字符串即可:
AT(.com_text.timer)void usr_tmr5ms_isr(void){ printf(str1);printf(str2, test_val);……}
參考資料:
[1]中科藍訊藍皮書————芯片框架簡述