0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Nordic-RT-Thread5.1.0移植筆記

RT-Thread官方賬號(hào) ? 2024-10-16 08:09 ? 次閱讀

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)文件夾備用:

da4fe21a-8b52-11ef-b5cd-92fbcf53809c.png

提取 rt-thread-5.1.0\bsp\nrf5x\libraries\drivers 文件夾備用,按需添加到工程;

da71bb74-8b52-11ef-b5cd-92fbcf53809c.png

da75dd62-8b52-11ef-b5cd-92fbcf53809c.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 路徑下的兩個(gè)文件備用:

da92468c-8b52-11ef-b5cd-92fbcf53809c.png

由于當(dāng)前RT-Thread版本不允許定時(shí)器在回調(diào)函數(shù)里面再次啟動(dòng)定時(shí)器,也就是不允許蛇頭咬蛇尾。

因此,app_button.c 直接調(diào)用 app_timer_rtthread.c 會(huì)產(chǎn)生bug,需要通過修改 app_button.c 解決定時(shí)器套娃問題。

Keil MDK 移植

RT-Thread源碼與相關(guān)庫添加至nRF5X SDK工程

1. 打開 ble_app_hids_mouse_pca10056_s140.uvprojx 這個(gè)工程,在項(xiàng)目資源管理器內(nèi)創(chuàng)建四個(gè)文件夾,分別命名為:

daa73556-8b52-11ef-b5cd-92fbcf53809c.png

2. 添加RT-Thread源文件,并添加頭文件路徑;

dab1eb90-8b52-11ef-b5cd-92fbcf53809c.png

3.RTT_Kernel 文件夾內(nèi)的文件需要右鍵添加配置define __RT_KERNEL_SOURCE__,否則相關(guān)文件編譯會(huì)報(bào)錯(cuò);

dacbcc68-8b52-11ef-b5cd-92fbcf53809c.png

4.RTT_components 文件夾內(nèi)的文件需要右鍵添加配置define __RT_IPC_SOURCE__,否則相關(guān)文件編譯會(huì)報(bào)錯(cuò);

dad7a3f8-8b52-11ef-b5cd-92fbcf53809c.png

5.nRF_Libraries 文件夾添加 app_timer_rtthread.c,移除或者排除文件夾下的 app_timer2.c drv_rtc.c;

dae22a30-8b52-11ef-b5cd-92fbcf53809c.png

必須覆蓋掉app_timer.h,否則編譯報(bào)錯(cuò)。

6. ALT + F7 打開工程配置,移除 APP_TIMER_V2APP_TIMER_V2_RTC1_ENABLED 兩項(xiàng)配置,并添加 __RTTHREAD__ RTTHREAD_ENABLED ;

修改前:

daf50646-8b52-11ef-b5cd-92fbcf53809c.png

修改后:

db05cfc6-8b52-11ef-b5cd-92fbcf53809c.png

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 文件夾,并添加源文件與頭文件;

db13d2e2-8b52-11ef-b5cd-92fbcf53809c.png

此處文件來自:

rt-thread-5.1.0\bsp\nrf5x\nrf52840\board

rt-thread-5.1.0\bsp\nrf5x\libraries\drivers

9.Application 文件夾添加 application.c,移除或者排除文件夾下的 main.c

db1fd9f2-8b52-11ef-b5cd-92fbcf53809c.png

ble_app_hids_mouse.c 為修改后的main.c,在文件夾內(nèi)復(fù)制修改后,添加到Application文件夾,需要進(jìn)行如下的修改:

db36d95e-8b52-11ef-b5cd-92fbcf53809c.png

mian.c 命名為 ble_app_hids_mouse.c,并將 mian() 修改為下面這段內(nèi)容:

db5431ca-8b52-11ef-b5cd-92fbcf53809c.pngdb6b7b14-8b52-11ef-b5cd-92fbcf53809c.png

10. 頭文件加載路徑匯總:

db88f23e-8b52-11ef-b5cd-92fbcf53809c.png

編譯無報(bào)錯(cuò),可嘗試編譯燒錄,此時(shí),RT-Thread是可以正常啟動(dòng)的,如果有打印輸出,說明可以進(jìn)入下一步了。

調(diào)試報(bào)錯(cuò)處理

1. 不開啟BLE,沒有報(bào)錯(cuò),LED閃;開啟BLE之后,出現(xiàn)RAM報(bào)錯(cuò)。

db8efab2-8b52-11ef-b5cd-92fbcf53809c.png

打印 NRF_ERROR_NO_MEM,是內(nèi)存相關(guān)問題,結(jié)合上下文,說明可能內(nèi)存配小了,需要往后挪挪位置。

RAM修改:START 0x20002260 變更為 START 0x20002270Size 倒是可以不用進(jìn)行修改。

修改前:

dbaa7b84-8b52-11ef-b5cd-92fbcf53809c.png

修改后:

dbbbe978-8b52-11ef-b5cd-92fbcf53809c.png

2. 啟動(dòng)BLE后,閃燈閃爍一段時(shí)間之后 或者 PC端進(jìn)行連接, 然后LED燈就不閃了。

目測(cè)是某些機(jī)制沒啟動(dòng),導(dǎo)致跑死了,看起來像是EVENT管理,比如 NRF_SDH_DISPATCH_MODEL 之類的沒有執(zhí)行?

為什么會(huì)跑死?

NRF_SDH_DISPATCH_MODEL 沒有配置好;

極大可能是這個(gè)問題,但是,由于是三選一,也不確定是哪個(gè)可行。

dbc73dd2-8b52-11ef-b5cd-92fbcf53809c.png

進(jìn)入了休眠模式?睡死了?

藍(lán)牙停止廣播,理論上不應(yīng)該讓RTOS也睡死。

屏蔽掉進(jìn)入休眠模式的代碼:現(xiàn)象未解除,所以不是睡眠的問題;

通過觀察時(shí)長(zhǎng),閃爍的時(shí)間是30秒左右,而且是打印 Fast advertising. 之后,就沒有打印Slow advertising. 。

dbe50de4-8b52-11ef-b5cd-92fbcf53809c.png

根據(jù)代碼推測(cè),應(yīng)該是服務(wù)切換失敗了,而服務(wù)在Softdevice里面應(yīng)該是Event相關(guān)的內(nèi)容出了問題,而與Event相關(guān)的是 NRF_SDH_DISPATCH_MODEL 這個(gè)值,通過百度搜索可以獲取到的可以參考的文章是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)牙斷開的情況)”

為什么,F(xiàn)reeRTOS可以使用NRF_SDH_DISPATCH_MODEL ?

因?yàn)楣俜教峁┑囊浦睞PI提供了相關(guān)的代碼,使用的就是輪詢方式。

創(chuàng)建一個(gè)Task,然后,在Task里面while()死循環(huán)獲取事件,相關(guān)代碼如下:

dc829f50-8b52-11ef-b5cd-92fbcf53809c.pngdc966ca6-8b52-11ef-b5cd-92fbcf53809c.png

咨詢?nèi)河眩f是RTOS就應(yīng)該配置為 2,但是,還是覺得不對(duì)勁,總覺得這個(gè)事件獲取應(yīng)該是和代碼有關(guān),而不是和系統(tǒng)的有無有關(guān)。

偶然之下,將 NRF_SDH_DISPATCH_MODEL 的值從 2 設(shè)置為 0,解決這個(gè)卡死問題,實(shí)錘了與系統(tǒng)的有無毫無關(guān)聯(lián):

0 是中斷方式:RT-Thread

1 是app_scheduler:nRF5X SDK Demo

2 是輪詢方式:FreeRTOS

中斷模式輪詢模式 ,這兩個(gè)哪個(gè)更好?不知道了。

Visual Studio + VisualGDB 導(dǎo)入MDK工程

最好是先KEIL MDK搭起來能用的工程,然后再導(dǎo)入到VisualGDB里面,是代碼先跑,還是你人先跑,那就不好說了。

創(chuàng)建VisualGDB工程(ARMCC)

1. 偷懶了,不想一個(gè)文件一個(gè)文件的添加,直接將Keil MDK的項(xiàng)目直接導(dǎo)入到VisualGDB里;

單擊【創(chuàng)建新項(xiàng)目】

dca87dce-8b52-11ef-b5cd-92fbcf53809c.png

選擇【嵌入式工程向?qū)А?/p>

dcb8a2bc-8b52-11ef-b5cd-92fbcf53809c.png

填寫【工程名】【方案名】【方案創(chuàng)建路徑】

dcd91d94-8b52-11ef-b5cd-92fbcf53809c.png

方案(visualgdb) -> 工程(ble_app_hids_mouse_pca10056_s140)

選擇【工程類型】【編譯器類型】【工程路徑】

dcdcebae-8b52-11ef-b5cd-92fbcf53809c.png

選擇【MCU】,但是這個(gè)界面已配置好,點(diǎn)選【Next】即可

dce5c832-8b52-11ef-b5cd-92fbcf53809c.png

配置 DEBUG的方式,這里選擇【J-Llink】、【USB】、【SWD】、【Before programming】、【After programming】,點(diǎn)選【Next】進(jìn)入下一頁

dcfef6e0-8b52-11ef-b5cd-92fbcf53809c.png

路徑映射界面,看不懂,所以直接點(diǎn)擊【Finish】結(jié)束配置;

dd1c993e-8b52-11ef-b5cd-92fbcf53809c.png

完善工程配置(丟失的配置需要補(bǔ)全)

1. 打開左側(cè)的【解決方案資源管理器】,找到篩選器【::Device】,添加圖里面的這兩個(gè)文件到篩選器;

Keil工程也有添加這兩個(gè)文件,但是,導(dǎo)入工程時(shí)丟失了。

dd3581d8-8b52-11ef-b5cd-92fbcf53809c.png

2. 執(zhí)行上述操作后,此時(shí)應(yīng)該還有部分文件沒有導(dǎo)入,如果右上角提示有文件沒有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)入工程配置界面:

dd537954-8b52-11ef-b5cd-92fbcf53809c.png

5. ble_app_hids_mouse_pca10056_s140 工程配置:

配置應(yīng)用程序二進(jìn)制接口Keil Settings -> Floating-point ABI : Hardware FP (-mfloat-abi=hard)

配置浮點(diǎn)單元類型: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)入到編輯界面之后,回車換行即可,退出編輯之后,回車會(huì)自動(dòng)轉(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簡(jiǎn)單修改:

dd874b94-8b52-11ef-b5cd-92fbcf53809c.png

link.lds簡(jiǎn)單修改:

dddc5b0c-8b52-11ef-b5cd-92fbcf53809c.png

目前使用的是ARMCC,使用GCC時(shí),內(nèi)存相關(guān)的打印還要根據(jù)編譯器進(jìn)行啟動(dòng)地址的打印 :

dde93a5c-8b52-11ef-b5cd-92fbcf53809c.png

這時(shí)候,一般就編譯成功了,有一堆警告,但是,沒關(guān)系的。

注意,導(dǎo)入成功了,不要隨便切回Keil MDK進(jìn)行編輯,否則再次啟動(dòng)VisualGDB觸發(fā)改動(dòng)檢測(cè)的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • HID
    HID
    +關(guān)注

    關(guān)注

    2

    文章

    128

    瀏覽量

    46501
  • BLE
    BLE
    +關(guān)注

    關(guān)注

    12

    文章

    643

    瀏覽量

    59249
  • Nordic
    +關(guān)注

    關(guān)注

    9

    文章

    161

    瀏覽量

    47251
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1249

    瀏覽量

    39717
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    i.MX RT1170:VGLite移植RT-Thread Nano過程講解(下)

    上篇介紹了如何移植 RT-Thread Nano 內(nèi)核與 Finsh 控制臺(tái)到 RT1170。本篇繼續(xù)介紹如何將 NXP 官方的 VGLite API 移植
    的頭像 發(fā)表于 11-09 11:22 ?817次閱讀

    移植RT-Thread的原理與方法

    大家好我是驚覺。是的,失蹤人口回來了。最近參加了rt-thread的國(guó)產(chǎn)MCU移植活動(dòng),移植rt-thread到華大的HC32L196。rtt論壇中已有許多介紹
    的頭像 發(fā)表于 09-17 09:41 ?7579次閱讀

    【國(guó)產(chǎn)MCU移植】HC32F460基于Keil MDK 移植 RT-Thread Nano

    【國(guó)產(chǎn)MCU移植】HC32F460基于Keil MDK 移植 RT-Thread Nano
    發(fā)表于 11-18 18:51 ?65次下載
    【國(guó)產(chǎn)MCU<b class='flag-5'>移植</b>】HC32F460基于Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    【國(guó)產(chǎn)MCU移植移植RT-Thread到國(guó)產(chǎn)芯片HC32F460PETB

    【國(guó)產(chǎn)MCU移植移植RT-Thread到國(guó)產(chǎn)芯片HC32F460PETB
    發(fā)表于 11-23 18:06 ?37次下載
    【國(guó)產(chǎn)MCU<b class='flag-5'>移植</b>】<b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b>到國(guó)產(chǎn)芯片HC32F460PETB

    RT-Thread Nano入門學(xué)習(xí)筆記

    RT-Thread Nano入門學(xué)習(xí)筆記
    發(fā)表于 11-26 12:36 ?20次下載
    <b class='flag-5'>RT-Thread</b> Nano入門學(xué)習(xí)<b class='flag-5'>筆記</b>

    【國(guó)產(chǎn)MCU移植移植RT-Thread到國(guó)產(chǎn)芯片F(xiàn)M33LC026

    【國(guó)產(chǎn)MCU移植移植RT-Thread到國(guó)產(chǎn)芯片F(xiàn)M33LC026
    發(fā)表于 11-30 16:51 ?22次下載
    【國(guó)產(chǎn)MCU<b class='flag-5'>移植</b>】<b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b>到國(guó)產(chǎn)芯片F(xiàn)M33LC026

    RT-Thread系統(tǒng)移植到STM32f103

    RT-Thread系統(tǒng)移植到STM32f103
    發(fā)表于 12-09 12:51 ?26次下載
    <b class='flag-5'>RT-Thread</b>系統(tǒng)<b class='flag-5'>移植</b>到STM32f103

    RT-Thread 應(yīng)用筆記 - RTC Alarm 組件的使用

    RT-Thread 應(yīng)用筆記 - 不正確使用LOG也會(huì)引發(fā)hard faultRT-Thread 應(yīng)用筆記 - RTC Alarm 組件的使用RT-
    發(fā)表于 01-25 18:18 ?10次下載
    <b class='flag-5'>RT-Thread</b> 應(yīng)用<b class='flag-5'>筆記</b> - RTC Alarm 組件的使用

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 理解defunct僵尸線程

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象管理RT-Thread 內(nèi)核學(xué)
    發(fā)表于 01-25 18:19 ?8次下載
    <b class='flag-5'>RT-Thread</b> 內(nèi)核學(xué)習(xí)<b class='flag-5'>筆記</b> - 理解defunct僵尸線程

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 設(shè)備模型rt_device的理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象管理RT-Thread 內(nèi)核學(xué)
    發(fā)表于 01-25 18:19 ?8次下載
    <b class='flag-5'>RT-Thread</b> 內(nèi)核學(xué)習(xí)<b class='flag-5'>筆記</b> - 設(shè)備模型<b class='flag-5'>rt</b>_device的理解

    基于 Keil MDK 移植 RT-Thread Nano

    本文介紹如何基于 Keil MDK 移植 RT-Thread Nano ,并以一個(gè) stm32f103 的基礎(chǔ)工程作為示例進(jìn)行講解。 RT-Thread Nano 已集成在 Keil MD...
    發(fā)表于 01-26 17:04 ?16次下載
    基于 Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    RT-Thread文檔_Nordic BSP 上手指南

    RT-Thread文檔_Nordic BSP 上手指南
    發(fā)表于 02-22 18:26 ?7次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>Nordic</b> BSP 上手指南

    RT-Thread文檔_內(nèi)核移植

    RT-Thread文檔_內(nèi)核移植
    發(fā)表于 02-22 18:31 ?3次下載
    <b class='flag-5'>RT-Thread</b>文檔_內(nèi)核<b class='flag-5'>移植</b>

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與<b class='flag-5'>移植</b>

    RT-Thread v5.1.0 發(fā)布

    RT-Thread5.1.0版本正式發(fā)布啦~!我們一起來看看它都有什么新功能、新特性吧!
    的頭像 發(fā)表于 04-26 08:35 ?693次閱讀
    <b class='flag-5'>RT-Thread</b> v<b class='flag-5'>5.1.0</b> 發(fā)布