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