env的使用需要學習,必須要配置為右鍵時顯示“ConEmu Here”這個選項。
env第一次啟動后,不要移動目錄,會造成env相關指令執行失敗,刪掉env文件夾,重新解壓啟動即可。
移植準備
解壓 nRF5x SDK v17.1.0 備用,作為工程的主體
解壓 RT-Thread V5.1.0
提取根目錄rt-thread-5.1.0\下的RT-Thread相關文件夾備用:
![da4fe21a-8b52-11ef-b5cd-92fbcf53809c.png](https://file1.elecfans.com//web1/M00/F3/00/wKgZoWcPJlWAMWQuAATB4mv2PgM355.png)
提取 rt-thread-5.1.0\bsp\nrf5x\libraries\drivers 文件夾備用,按需添加到工程;
![da71bb74-8b52-11ef-b5cd-92fbcf53809c.png](https://file1.elecfans.com//web1/M00/F3/00/wKgZoWcPJlWAdowGAADTw7Ai8pQ036.png)
提取 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 路徑下的兩個文件備用:
![da92468c-8b52-11ef-b5cd-92fbcf53809c.png](https://file1.elecfans.com//web1/M00/F3/00/wKgZoWcPJlaAbx-qAABfRMOY8vU061.png)
由于當前RT-Thread版本不允許定時器在回調函數里面再次啟動定時器,也就是不允許蛇頭咬蛇尾。
因此,app_button.c 直接調用 app_timer_rtthread.c 會產生bug,需要通過修改 app_button.c 解決定時器套娃問題。
Keil MDK 移植
RT-Thread源碼與相關庫添加至nRF5X SDK工程
1. 打開 ble_app_hids_mouse_pca10056_s140.uvprojx 這個工程,在項目資源管理器內創建四個文件夾,分別命名為:
![daa73556-8b52-11ef-b5cd-92fbcf53809c.png](https://file1.elecfans.com//web1/M00/F3/00/wKgZoWcPJlaAbDVkAACgPwPuBec440.png)
2. 添加RT-Thread源文件,并添加頭文件路徑;
3.RTT_Kernel 文件夾內的文件需要右鍵添加配置define __RT_KERNEL_SOURCE__,否則相關文件編譯會報錯;
4.RTT_components 文件夾內的文件需要右鍵添加配置define __RT_IPC_SOURCE__,否則相關文件編譯會報錯;
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 內添加宏定義 #define RT_TIMER_TICK_PER_SECOND RT_TICK_PER_SECOND,否則 app_timer_rtthread.c 將會出現報錯;
8. 在項目管理器創建 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,在文件夾內復制修改后,添加到Application文件夾,需要進行如下的修改:
將 mian.c 命名為 ble_app_hids_mouse.c,并將 mian() 修改為下面這段內容:
10. 頭文件加載路徑匯總:
編譯無報錯,可嘗試編譯燒錄,此時,RT-Thread是可以正常啟動的,如果有打印輸出,說明可以進入下一步了。
調試報錯處理
1. 不開啟BLE,沒有報錯,LED閃;開啟BLE之后,出現RAM報錯。
打印 NRF_ERROR_NO_MEM,是內存相關問題,結合上下文,說明可能內存配小了,需要往后挪挪位置。
RAM修改:START 0x20002260 變更為 START 0x20002270,Size 倒是可以不用進行修改。
修改前:
修改后:
2. 啟動BLE后,閃燈閃爍一段時間之后 或者 PC端進行連接, 然后LED燈就不閃了。
目測是某些機制沒啟動,導致跑死了,看起來像是EVENT管理,比如 NRF_SDH_DISPATCH_MODEL 之類的沒有執行?
為什么會跑死?
NRF_SDH_DISPATCH_MODEL 沒有配置好;
極大可能是這個問題,但是,由于是三選一,也不確定是哪個可行。
進入了休眠模式?睡死了?
屏蔽掉進入休眠模式的代碼:現象未解除,所以不是睡眠的問題;
通過觀察時長,閃爍的時間是30秒左右,而且是打印 Fast advertising. 之后,就沒有打印Slow advertising. 。
根據代碼推測,應該是服務切換失敗了,而服務在Softdevice里面應該是Event相關的內容出了問題,而與Event相關的是 NRF_SDH_DISPATCH_MODEL 這個值,通過百度搜索可以獲取到的可以參考的文章是FreeRTOS的相關移植文章:
52832帶softdevice工程移植freertos
https://www.eemaker.com/52832-softdevice-freertos.html
“修改sdk_config.h文件中:NRF_SDH_DISPATCH_MODEL 2
該配置的意思是修改softdevice底層事件到應用層的方式,模式2代表是application主動獲取。
在freertos的主動獲取的實現就是在我們前面添加的nrf_sdh_freertos.c文件中如果用mode0 中斷方式通知到應用層,就不需要添加nrf_sdh_freertos.c文件,但是我測試的時候發現會出現藍牙斷開的情況)”
為什么,FreeRTOS可以使用NRF_SDH_DISPATCH_MODEL ?
因為官方提供的移植API提供了相關的代碼,使用的就是輪詢方式。
創建一個Task,然后,在Task里面while()死循環獲取事件,相關代碼如下:
咨詢群友,說是RTOS就應該配置為 2,但是,還是覺得不對勁,總覺得這個事件獲取應該是和代碼有關,而不是和系統的有無有關。
偶然之下,將 NRF_SDH_DISPATCH_MODEL 的值從 2 設置為 0,解決這個卡死問題,實錘了與系統的有無毫無關聯:
0 是中斷方式:RT-Thread
1 是app_scheduler:nRF5X SDK Demo
2 是輪詢方式:FreeRTOS
中斷模式 和 輪詢模式 ,這兩個哪個更好?不知道了。
Visual Studio + VisualGDB 導入MDK工程
最好是先KEIL MDK搭起來能用的工程,然后再導入到VisualGDB里面,是代碼先跑,還是你人先跑,那就不好說了。
創建VisualGDB工程(ARMCC)
1. 偷懶了,不想一個文件一個文件的添加,直接將Keil MDK的項目直接導入到VisualGDB里;
單擊【創建新項目】
選擇【嵌入式工程向導】
填寫【工程名】【方案名】【方案創建路徑】
方案(visualgdb) -> 工程(ble_app_hids_mouse_pca10056_s140)
選擇【工程類型】【編譯器類型】【工程路徑】
選擇【MCU】,但是這個界面已配置好,點選【Next】即可
配置 DEBUG的方式,這里選擇【J-Llink】、【USB】、【SWD】、【Before programming】、【After programming】,點選【Next】進入下一頁
路徑映射界面,看不懂,所以直接點擊【Finish】結束配置;
完善工程配置(丟失的配置需要補全)
1. 打開左側的【解決方案資源管理器】,找到篩選器【::Device】,添加圖里面的這兩個文件到篩選器;
Keil工程也有添加這兩個文件,但是,導入工程時丟失了。
2. 執行上述操作后,此時應該還有部分文件沒有導入,如果右上角提示有文件沒有include,直接點擊確認包含即可;
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】彈出選單,選擇【屬性】進入工程配置界面:
5. ble_app_hids_mouse_pca10056_s140 工程配置:
配置應用程序二進制接口: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)
添加預編譯器定義: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是用的”,“與” “進行宏的分隔,而VisualGDB只能用”;“去分隔,進入到編輯界面之后,回車換行即可,退出編輯之后,回車會自動轉換為”;“
配置C/C++語言標準: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直接導入,可以從RT-Thread獲取模板:
rt-thread-5.1.0\bsp\nrf5x\libraries\templates\nrfx\board\linker_scripts
link.sct簡單修改:
link.lds簡單修改:
目前使用的是ARMCC,使用GCC時,內存相關的打印還要根據編譯器進行啟動地址的打印 :
這時候,一般就編譯成功了,有一堆警告,但是,沒關系的。
注意,導入成功了,不要隨便切回Keil MDK進行編輯,否則再次啟動VisualGDB觸發改動檢測的。
-
HID
+關注
關注
2文章
130瀏覽量
46633 -
BLE
+關注
關注
12文章
660瀏覽量
59427 -
Nordic
+關注
關注
9文章
172瀏覽量
47345 -
RT-Thread
+關注
關注
31文章
1293瀏覽量
40217
發布評論請先 登錄
相關推薦
i.MX RT1170:VGLite移植RT-Thread Nano過程講解(下)
移植RT-Thread的原理與方法
【國產MCU移植】HC32F460基于Keil MDK 移植 RT-Thread Nano
![【國產MCU<b class='flag-5'>移植</b>】HC32F460基于Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 應用筆記 - RTC Alarm 組件的使用
![<b class='flag-5'>RT-Thread</b> 應用<b class='flag-5'>筆記</b> - RTC Alarm 組件的使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內核學習筆記 - 理解defunct僵尸線程
![<b class='flag-5'>RT-Thread</b> 內核學習<b class='flag-5'>筆記</b> - 理解defunct僵尸線程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內核學習筆記 - 設備模型rt_device的理解
![<b class='flag-5'>RT-Thread</b> 內核學習<b class='flag-5'>筆記</b> - 設備模型<b class='flag-5'>rt</b>_device的理解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
基于 Keil MDK 移植 RT-Thread Nano
![基于 Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論