env的使用需要學(xué)習(xí),必須要配置為右鍵時顯示“ConEmu Here”這個選項。
env第一次啟動后,不要移動目錄,會造成env相關(guān)指令執(zhí)行失敗,刪掉env文件夾,重新解壓啟動即可。
移植準(zhǔn)備
解壓 nRF5x SDK v17.1.0 備用,作為工程的主體
解壓 RT-Thread V5.1.0
提取根目錄rt-thread-5.1.0\下的RT-Thread相關(guān)文件夾備用:
提取 rt-thread-5.1.0\bsp\nrf5x\libraries\drivers 文件夾備用,按需添加到工程;
提取 rt-thread-5.1.0\bsp\nrf5x\nrf52840\board 文件夾備用;
提取 rt-thread-5.1.0\bsp\nrf5x\nrf52840\applications 文件夾備用;
3. 解壓 ZJ-SDK-RT-Thread-nRF52840
提取
ZJ-SDK-RT-Thread-NORDIC-master\ZJ_Application_NRF52840\018.ble_nus\NORDIC_SDK\components\libraries\timer 路徑下的兩個文件備用:
由于當(dāng)前RT-Thread版本不允許定時器在回調(diào)函數(shù)里面再次啟動定時器,也就是不允許蛇頭咬蛇尾。
因此,app_button.c 直接調(diào)用 app_timer_rtthread.c 會產(chǎn)生bug,需要通過修改 app_button.c 解決定時器套娃問題。
Keil MDK 移植
RT-Thread源碼與相關(guān)庫添加至nRF5X SDK工程
1. 打開 ble_app_hids_mouse_pca10056_s140.uvprojx 這個工程,在項目資源管理器內(nèi)創(chuàng)建四個文件夾,分別命名為:
2. 添加RT-Thread源文件,并添加頭文件路徑;
3.RTT_Kernel 文件夾內(nèi)的文件需要右鍵添加配置define __RT_KERNEL_SOURCE__,否則相關(guān)文件編譯會報錯;
4.RTT_components 文件夾內(nèi)的文件需要右鍵添加配置define __RT_IPC_SOURCE__,否則相關(guān)文件編譯會報錯;
5.nRF_Libraries 文件夾添加 app_timer_rtthread.c,移除或者排除文件夾下的 app_timer2.c 與 drv_rtc.c;
必須覆蓋掉app_timer.h,否則編譯報錯。
6. ALT + F7 打開工程配置,移除 APP_TIMER_V2 與 APP_TIMER_V2_RTC1_ENABLED 兩項配置,并添加 __RTTHREAD__ 與 RTTHREAD_ENABLED ;
修改前:
修改后:
7. 需在 rtconfig.h 內(nèi)添加宏定義 #define RT_TIMER_TICK_PER_SECOND RT_TICK_PER_SECOND,否則 app_timer_rtthread.c 將會出現(xiàn)報錯;
8. 在項目管理器創(chuàng)建 Drivers 文件夾,并添加源文件與頭文件;
此處文件來自:
rt-thread-5.1.0\bsp\nrf5x\nrf52840\board
rt-thread-5.1.0\bsp\nrf5x\libraries\drivers
9.Application 文件夾添加 application.c,移除或者排除文件夾下的 main.c ;
ble_app_hids_mouse.c 為修改后的main.c,在文件夾內(nèi)復(fù)制修改后,添加到Application文件夾,需要進(jìn)行如下的修改:
將 mian.c 命名為 ble_app_hids_mouse.c,并將 mian() 修改為下面這段內(nèi)容:
10. 頭文件加載路徑匯總:
編譯無報錯,可嘗試編譯燒錄,此時,RT-Thread是可以正常啟動的,如果有打印輸出,說明可以進(jìn)入下一步了。
調(diào)試報錯處理
1. 不開啟BLE,沒有報錯,LED閃;開啟BLE之后,出現(xiàn)RAM報錯。
打印 NRF_ERROR_NO_MEM,是內(nèi)存相關(guān)問題,結(jié)合上下文,說明可能內(nèi)存配小了,需要往后挪挪位置。
RAM修改:START 0x20002260 變更為 START 0x20002270,Size 倒是可以不用進(jìn)行修改。
修改前:
修改后:
2. 啟動BLE后,閃燈閃爍一段時間之后 或者 PC端進(jìn)行連接, 然后LED燈就不閃了。
目測是某些機制沒啟動,導(dǎo)致跑死了,看起來像是EVENT管理,比如 NRF_SDH_DISPATCH_MODEL 之類的沒有執(zhí)行?
為什么會跑死?
NRF_SDH_DISPATCH_MODEL 沒有配置好;
極大可能是這個問題,但是,由于是三選一,也不確定是哪個可行。
進(jìn)入了休眠模式?睡死了?
藍(lán)牙停止廣播,理論上不應(yīng)該讓RTOS也睡死。
屏蔽掉進(jìn)入休眠模式的代碼:現(xiàn)象未解除,所以不是睡眠的問題;
通過觀察時長,閃爍的時間是30秒左右,而且是打印 Fast advertising. 之后,就沒有打印Slow advertising. 。
根據(jù)代碼推測,應(yīng)該是服務(wù)切換失敗了,而服務(wù)在Softdevice里面應(yīng)該是Event相關(guān)的內(nèi)容出了問題,而與Event相關(guān)的是 NRF_SDH_DISPATCH_MODEL 這個值,通過百度搜索可以獲取到的可以參考的文章是FreeRTOS的相關(guān)移植文章:
52832帶softdevice工程移植freertos
https://www.eemaker.com/52832-softdevice-freertos.html
“修改sdk_config.h文件中:NRF_SDH_DISPATCH_MODEL 2
該配置的意思是修改softdevice底層事件到應(yīng)用層的方式,模式2代表是application主動獲取。
在freertos的主動獲取的實現(xiàn)就是在我們前面添加的nrf_sdh_freertos.c文件中如果用mode0 中斷方式通知到應(yīng)用層,就不需要添加nrf_sdh_freertos.c文件,但是我測試的時候發(fā)現(xiàn)會出現(xiàn)藍(lán)牙斷開的情況)”
為什么,F(xiàn)reeRTOS可以使用NRF_SDH_DISPATCH_MODEL ?
因為官方提供的移植API提供了相關(guān)的代碼,使用的就是輪詢方式。
創(chuàng)建一個Task,然后,在Task里面while()死循環(huán)獲取事件,相關(guān)代碼如下:
咨詢?nèi)河眩f是RTOS就應(yīng)該配置為 2,但是,還是覺得不對勁,總覺得這個事件獲取應(yīng)該是和代碼有關(guān),而不是和系統(tǒng)的有無有關(guān)。
偶然之下,將 NRF_SDH_DISPATCH_MODEL 的值從 2 設(shè)置為 0,解決這個卡死問題,實錘了與系統(tǒng)的有無毫無關(guān)聯(lián):
0 是中斷方式:RT-Thread
1 是app_scheduler:nRF5X SDK Demo
2 是輪詢方式:FreeRTOS
中斷模式 和 輪詢模式 ,這兩個哪個更好?不知道了。
Visual Studio + VisualGDB 導(dǎo)入MDK工程
最好是先KEIL MDK搭起來能用的工程,然后再導(dǎo)入到VisualGDB里面,是代碼先跑,還是你人先跑,那就不好說了。
創(chuàng)建VisualGDB工程(ARMCC)
1. 偷懶了,不想一個文件一個文件的添加,直接將Keil MDK的項目直接導(dǎo)入到VisualGDB里;
單擊【創(chuàng)建新項目】
選擇【嵌入式工程向?qū)А?/p>
填寫【工程名】【方案名】【方案創(chuàng)建路徑】
方案(visualgdb) -> 工程(ble_app_hids_mouse_pca10056_s140)
選擇【工程類型】【編譯器類型】【工程路徑】
選擇【MCU】,但是這個界面已配置好,點選【Next】即可
配置 DEBUG的方式,這里選擇【J-Llink】、【USB】、【SWD】、【Before programming】、【After programming】,點選【Next】進(jìn)入下一頁
路徑映射界面,看不懂,所以直接點擊【Finish】結(jié)束配置;
完善工程配置(丟失的配置需要補全)
1. 打開左側(cè)的【解決方案資源管理器】,找到篩選器【::Device】,添加圖里面的這兩個文件到篩選器;
Keil工程也有添加這兩個文件,但是,導(dǎo)入工程時丟失了。
2. 執(zhí)行上述操作后,此時應(yīng)該還有部分文件沒有導(dǎo)入,如果右上角提示有文件沒有include,直接點擊確認(rèn)包含即可;
3. 找到 main.c ,app_timer2.c, drv_rt.c ,nrf_sdh_ble_rtt.c ,ble_conn_params_rtt.c 這幾個文件:右鍵 - 屬性- Keil Settings - Excluded From Build -> 【是】
4.【右鍵】點擊【ble_app_hids_mouse_pca10056_s140】彈出選單,選擇【屬性】進(jìn)入工程配置界面:
5. ble_app_hids_mouse_pca10056_s140 工程配置:
配置應(yīng)用程序二進(jìn)制接口:Keil Settings -> Floating-point ABI : Hardware FP (-mfloat-abi=hard)
配置浮點單元類型:Keil Settings -> Floating-point unit type : fpv4-sp-d16 (-mfpu=fpv4-sp-d16)
配置ARM CPU類型:Keil Settings -> ARM CPU type : -mcpu=arm7m
配置ARMCC CPU類型:Keil Settings -> CPU Type for ARMCC/ARMASM : Cortex-M4.fp.sp (--cpu=Cortex-M4.fp.sp)
添加預(yù)編譯器定義:C/C++ -> Preprocessor -> Preprocessor Definitions :
__RTTHREAD__;RTTHREAD_ENABLED;BOARD_PCA10056;BOARD_PCA10059;NRF52840_XXAA;CONFIG_GPIO_AS_PINRESET;
FLOAT_ABI_HARD;NRF_SD_BLE_API_VERSION=7;S140;SOFTDEVICE_PRESENT;__HEAP_SIZE=8192;__STACK_SIZE=8192;
Keil MDK是用的”,“與” “進(jìn)行宏的分隔,而VisualGDB只能用”;“去分隔,進(jìn)入到編輯界面之后,回車換行即可,退出編輯之后,回車會自動轉(zhuǎn)換為”;“
配置C/C++語言標(biāo)準(zhǔn):C/C++ -> Advanced -> Language Standard for C++ files : C99 (--c99)
配置GNU拓展:C/C++ -> Advanced -> Enable GNU Language Extensions : 否
配置ROM與RAM映射:Linker -> Memory Layout -> Scatter Files : ..\examples\ble_peripheral\ble_app_hids_mouse\pca10056\s140\visualgdb\ble_app_hids_mouse_pca10056_s140\nrf52840_xxaa.sct
如果一開始就是直接作為GCC直接導(dǎo)入,可以從RT-Thread獲取模板:
rt-thread-5.1.0\bsp\nrf5x\libraries\templates\nrfx\board\linker_scripts
link.sct簡單修改:
link.lds簡單修改:
目前使用的是ARMCC,使用GCC時,內(nèi)存相關(guān)的打印還要根據(jù)編譯器進(jìn)行啟動地址的打印 :
這時候,一般就編譯成功了,有一堆警告,但是,沒關(guān)系的。
注意,導(dǎo)入成功了,不要隨便切回Keil MDK進(jìn)行編輯,否則再次啟動VisualGDB觸發(fā)改動檢測的。
-
HID
+關(guān)注
關(guān)注
2文章
130瀏覽量
46606 -
BLE
+關(guān)注
關(guān)注
12文章
660瀏覽量
59391 -
Nordic
+關(guān)注
關(guān)注
9文章
168瀏覽量
47322 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1285瀏覽量
40081
發(fā)布評論請先 登錄
相關(guān)推薦
評論