Nordic-RT-Thread5.1.0移植笔记

关键词:RT-Thread、v17.1.0、softdevie、BLE、HID、mouse、Nordic、52840

资源获取

  1. nRF5x SDK v17.1.0:https://github.com/cbraissant/nRF5_SDK_17.1.0_ddde560

  2. RT-Thread V5.1.0:https://github.com/RT-Thread/rt-thread

  3. ZJ-SDK-RT-Thread-nRF52840:https://github.com/ZJ-TEK/ZJ-SDK-RT-Thread-NORDIC

env的使用需要学习,必须要配置为右键时显示"ConEmu Here"这个选项。

env第一次启动后,不要移动目录,会造成env相关指令执行失败,删掉env文件夹,重新解压启动即可。

移植准备

  1. 解压 nRF5x SDK v17.1.0 备用,作为工程的主体

  2. 解压 RT-Thread V5.1.0

  • 提取根目录rt-thread-5.1.0\下的RT-Thread相关文件夹备用:
  • 提取 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 文件夹备用;

  1. 解压 ZJ-SDK-RT-Thread-nRF52840

提取 ZJ-SDK-RT-Thread-NORDIC-master\ZJ_Application_NRF52840\018.ble_nus\NORDIC_SDK\components\libraries\timer 路径下的两个文件备用:

由于当前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 这个工程,在项目资源管理器内创建四个文件夹,分别命名为:
  1. 添加RT-Thread源文件,并添加头文件路径;
  1. RTT_Kernel 文件夹内的文件需要右键添加配置define RT_KERNEL_SOURCE,否则相关文件编译会报错;
  1. RTT_components 文件夹内的文件需要右键添加配置define RT_IPC_SOURCE,否则相关文件编译会报错;
  1. nRF_Libraries 文件夹添加 app_timer_rtthread.c,移除或者排除文件夹下的 app_timer2.c 与 drv_rtc.c;

必须覆盖掉app_timer.h,否则编译报错。

  1. ALT + F7 打开工程配置,移除 APP_TIMER_V2 与 APP_TIMER_V2_RTC1_ENABLED 两项配置,并添加 RTTHREAD 与 RTTHREAD_ENABLED ;

修改前:

修改后:

  1. 需在 rtconfig.h 内添加宏定义 #define RT_TIMER_TICK_PER_SECOND RT_TICK_PER_SECOND,否则 app_timer_rtthread.c 将会出现报错;

  2. 在项目管理器创建 Drivers 文件夹,并添加源文件与头文件;

此处文件来自:

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

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

  1. Application 文件夹添加 application.c,移除或者排除文件夹下的 main.c ;

ble_app_hids_mouse.c 为修改后的main.c,在文件夹内复制修改后,添加到Application文件夹,需要进行如下的修改:

将 mian.c 命名为 ble_app_hids_mouse.c,并将 mian() 修改为下面这段内容:

  1. 头文件加载路径汇总:

编译无报错,可尝试编译烧录,此时,RT-Thread是可以正常启动的,如果有打印输出,说明可以进入下一步了。

调试报错处理

  1. 不开启BLE,没有报错,LED闪;开启BLE之后,出现RAM报错。

打印 NRF_ERROR_NO_MEM,是内存相关问题,结合上下文,说明可能内存配小了,需要往后挪挪位置。

RAM修改:START 0x20002260 变更为 START 0x20002270,Size 倒是可以不用进行修改。

修改前:

修改后:

  1. 启动BLE后,闪灯闪烁一段时间之后 或者 PC端进行连接, 然后LED灯就不闪了。

目测是某些机制没启动,导致跑死了,看起来像是EVENT管理,比如 NRF_SDH_DISPATCH_MODEL 之类的没有执行?

为什么会跑死?

  • NRF_SDH_DISPATCH_MODEL 没有配置好;

极大可能是这个问题,但是,由于是三选一,也不确定是哪个可行。

  • 进入了休眠模式?睡死了?

蓝牙停止广播,理论上不应该让RTOS也睡死。

屏蔽掉进入休眠模式的代码:现象未解除,所以不是睡眠的问题;

通过观察时长,闪烁的时间是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工程也有添加这两个文件,但是,导入工程时丢失了。

  1. 执行上述操作后,此时应该还有部分文件没有导入,如果右上角提示有文件没有include,直接点击确认包含即可;

  2. 找到 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】弹出选单,选择【属性】进入工程配置界面:

  1. 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触发改动检测的。

相关推荐
你要飞3 小时前
Hexo + Butterfly 博客添加 Live2D 看板娘指南
笔记
ajsbxi6 小时前
【Java 基础】核心知识点梳理
java·开发语言·笔记
呱呱巨基6 小时前
vim编辑器
linux·笔记·学习·编辑器·vim
新子y6 小时前
【小白笔记】普通二叉树(General Binary Tree)和二叉搜索树的最近公共祖先(LCA)
开发语言·笔记·python
聪明的笨猪猪6 小时前
Java JVM “调优” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
爱学习的uu7 小时前
CURSOR最新使用指南及使用思路
人工智能·笔记·python·软件工程
YuCaiH7 小时前
Linux文件处理
linux·笔记·嵌入式
Cathy Bryant7 小时前
大模型损失函数(二):KL散度(Kullback-Leibler divergence)
笔记·神经网络·机器学习·数学建模·transformer
qq_398586547 小时前
Threejs入门学习笔记
javascript·笔记·学习
hour_go8 小时前
TCP/IP协议相关知识点
网络·笔记·网络协议·tcp/ip