Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Nordic_NRF52840
蓝牙BLE
Nordic移植笔记: RT_Thread v5.1.0(基于Nordic nRF52840的ble_app_hids_mouse工程)
发布于 2024-09-25 20:51:58 浏览:405
订阅该版
[tocm] 关键词:RT-Thread、v17.1.0、softdevie、BLE、HID、mouse、Nordic、52840 ![蟑螂-20240925012022-44w488b.png](https://oss-club.rt-thread.org/uploads/20240925/400baca2d8658214325091ea333493f4.png.webp) 北欧蜜汁奥力给,吃啊,你怎么不吃啊! # 资源获取 1. nRF5x SDK v17.1.0:[https://github.com/cbraissant/nRF5_SDK_17.1.0_ddde560](https://github.com/cbraissant/nRF5_SDK_17.1.0_ddde560) 2. RT-Thread V5.1.0:[https://github.com/RT-Thread/rt-thread](https://github.com/RT-Thread/rt-thread) 3. ZJ-SDK-RT-Thread-nRF52840:[https://github.com/ZJ-TEK/ZJ-SDK-RT-Thread-NORDIC](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` 1. 提取根目录`rt-thread-5.1.0\`下的RT-Thread相关文件夹备用: ```c components //RT-Thread组件 include //RTOS文件 libcpu //RTOS文件 src //RTOS文件 ``` ![image-20240925011341-8jm06bo.png](https://oss-club.rt-thread.org/uploads/20240925/2e9998e99b19a6ebf07d7cdfbb245dd2.png.webp) 2. 提取 `rt-thread-5.1.0\bsp\nrf5x\libraries\drivers` 文件夹备用,**按需添加到工程**; ```c drv_adc.c drv_adc.h drv_flash.c drv_gpio.c //添加到工程 drv_gpio.h //添加到工程 drv_hwtimer.c drv_i2c.c drv_i2c.h drv_pwm.c drv_qspi_flash.c drv_rtc.c drv_spi.c drv_spi.h drv_uart.c //添加到工程 drv_uart.h //添加到工程 drv_uarte.c drv_uarte.h drv_wdt.c ``` ![image-20240925011801-nvt7nzy.png](https://oss-club.rt-thread.org/uploads/20240925/d53420366f253a8a3a376a676b30980d.png.webp) 3. 提取 `rt-thread-5.1.0\bsp\nrf5x\nrf52840\board` 文件夹备用; 4. 提取 `rt-thread-5.1.0\bsp\nrf5x\nrf52840\applications` 文件夹备用; 3. 解压 `ZJ-SDK-RT-Thread-nRF52840` 1. 提取 `ZJ-SDK-RT-Thread-NORDIC-master\ZJ_Application_NRF52840\018.ble_nus\NORDIC_SDK\components\libraries\timer` 路径下的两个文件备用: ```c app_timer_rtthread.c //添加app_timer_rtthread.c的同时,app_timer2.c与drv_rtc.c需要禁止编译或者移除 app_timer.h //头文件需要进行替换 ``` > 由于当前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` 这个工程,在项目资源管理器内创建四个文件夹,分别命名为: ```c RTT_Kernel // RT-Thread 内核 RTT_libcpu // 芯片移植相关文件 RTT_Finsh // FinSH控制台 RTT_Compiler // RT-Thread 编译相关 RTT_components //RT_Thread组件 ``` 2. 添加RT-Thread源文件,并添加头文件路径; ![project files-20240926013628-ksvo7y1.bmp](https://oss-club.rt-thread.org/uploads/20240926/9971090ccb81a634ecce519a6139b370.bmp.webp) 3. `RTT_Kernel` 文件夹内的文件需要右键添加配置define `__RT_KERNEL_SOURCE__`,否则相关文件编译会报错; ![image-20240926010104-lo60rlt.png](https://oss-club.rt-thread.org/uploads/20240926/2930594589f01a420634961afa3bee2d.png) 4. `RTT_components` 文件夹内的文件需要右键添加配置define `__RT_IPC_SOURCE__`,否则相关文件编译会报错; ![image-20240926015333-u86hmwm.png](https://oss-club.rt-thread.org/uploads/20240926/c9802adcfd22d66fad6f66daadf338b8.png) 5. `nRF_Libraries` 文件夹添加 `app_timer_rtthread.c`,移除或者排除文件夹下的 `app_timer2.c` 与 `drv_rtc.c`; ![image-20240925000326-cx8sbsf.png](https://oss-club.rt-thread.org/uploads/20240925/e17c7072f6199024b329a26741d201fa.png.webp) > 必须覆盖掉`app_timer.h`,否则编译报错。 > 6. `ALT` + `F7` 打开工程配置,移除 `APP_TIMER_V2` 与 `APP_TIMER_V2_RTC1_ENABLED` 两项配置,并添加 `__RTTHREAD__` 与 `RTTHREAD_ENABLED` ; 修改前: ![image-20240925170233-896tw7z.png](https://oss-club.rt-thread.org/uploads/20240925/4105cd837adb62e96f19674d2ef0cba0.png) 修改后: ![image-20240925001116-wpq7d5g.png](https://oss-club.rt-thread.org/uploads/20240925/337882f63465cde3250e82ef3d13ce56.png) 7. 需在 `rtconfig.h` 内添加宏定义 `#define RT_TIMER_TICK_PER_SECOND RT_TICK_PER_SECOND`,否则 `app_timer_rtthread.c` 将会出现报错; 8. 在项目管理器创建 `Drivers` 文件夹,并添加源文件与头文件; ![image-20240925005010-n708hpp.png](https://oss-club.rt-thread.org/uploads/20240925/bc473c426845452cf38b096785f889e7.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` ; ![image-20240925001246-f7edw9u.png](https://oss-club.rt-thread.org/uploads/20240925/061fc64ebdb2c29931f67a51ff4588d2.png) ble_app_hids_mouse.c 为修改后的main.c,在文件夹内复制修改后,添加到`Application`文件夹,需要进行如下的修改: ```c /**@brief Function for application main entry. */ int main(void) { bool erase_bonds; // Initialize. log_init(); timers_init(); buttons_leds_init(&erase_bonds); power_management_init(); ble_stack_init(); scheduler_init(); gap_params_init(); gatt_init(); advertising_init(); services_init(); sensor_simulator_init(); conn_params_init(); peer_manager_init(); // Start execution. NRF_LOG_INFO("HID Mouse example started."); timers_start(); advertising_start(erase_bonds); // Enter main loop. for (;;) { idle_state_handle(); } } ``` 将 **`mian.c`** 命名为 `ble_app_hids_mouse.c`,并将 `mian()` 修改为下面这段内容: ```c static void ble_app_softdevice(void* param) { // Initialize. bool erase_bonds; //log_init(); timers_init(); buttons_leds_init(&erase_bonds); power_management_init(); __GGOUT__ ble_stack_init(); __GGOUT__ //scheduler_init(); gap_params_init(); __GGOUT__ gatt_init(); __GGOUT__ advertising_init(); __GGOUT__ services_init(); __GGOUT__ sensor_simulator_init(); conn_params_init(); __GGOUT__ peer_manager_init(); __GGOUT__ // Start execution. NRF_LOG_INFO("HID Mouse example started."); timers_start(); advertising_start(erase_bonds); } /**@brief Function for starting the BLE HID mouse service. * * @details This function starts the BLE HID mouse service by creating a new thread for the SoftDevice. * * @return RT_EOK if the service was started successfully, or an error code otherwise. */ int ble_hid_on(void) { static rt_thread_t ble_service_thread_handle = RT_NULL; /**@brief 创建一个新的线程, 用于运行 BLE 协议栈。 * * @param name 创建一个新的线程 "softdevice"。 * @param entry 线程入口函数,即线程启动时执行的函数 ble_app_softdevice。 * @param parameter RT_NULL 表示该线程不需要传递给入口函数的参数。 * @param stack_size 线程的栈大小为 4096 字节。 * @param priority 线程的优先级为 22。 * @param tick 线程的时间片为 5 个时钟节拍。 * * @return tid1 如果线程创建成功,则返回线程的句柄;如果线程创建失败,则返回 RT_NULL。 */ ble_service_thread_handle = rt_thread_create("softdevice", ble_app_softdevice, RT_NULL, 4096, 22, 5); if (ble_service_thread_handle != RT_NULL) { rt_thread_startup(ble_service_thread_handle); rt_kprintf("\nsoftdevice thread create.\r"); } return RT_EOK; } /**@brief here is add a msh command for starting the BLE HID mouse service. */ MSH_CMD_EXPORT(ble_hid_on, ble app hids mouse service); ``` 10. 头文件加载路径汇总: ```c ../../../../../../external/rt-thread ../../../../../../external/rt-thread/src ../../../../../../external/rt-thread/include ../../../../../../external/rt-thread/libcpu/arm/common ../../../../../../external/rt-thread/libcpu/arm/cortex-m4 ../../../../../../external/rt-thread/components/finsh ../../../../../../external/rt-thread/components/libc/compilers/common/extension ../../../../../../external/rt-thread/components/libc/compilers/common/extension/fcntl ../../../../../../external/rt-thread/components/libc/compilers/common/extension/fcntl/octal ../../../../../../external/rt-thread/components/libc/compilers/common/include ../../../../../../external/rt-thread/components/libc/compilers/common/include/posix ../../../../../../external/rt-thread/components/libc/posix ../../../../../../external/rt-thread/components/libc/posix/ipc ../../../../../../external/rt-thread/components/libc/posix/io/epoll ../../../../../../external/rt-thread/components/libc/posix/io/eventfd ../../../../../../external/rt-thread/components/libc/posix/io/poll ../../../../../../external/rt-thread/components/drivers/include ../../../../../../external/rt-thread/components/drivers/spi ../../../../../../external/rt-thread/external/nRF_Drivers ../../../board ``` > 编译无报错,可尝试编译烧录,此时,RT-Thread是可以正常启动的,如果有打印输出,说明可以进入下一步了。 ## 调试报错处理 1. 不开启BLE,没有报错,LED闪;开启BLE之后,出现RAM报错。 ```c softdevice thread create. [Info] Init functon: ble_app_softdevice, line: 1337 [Debug] State request: 0x00000000 [Debug] Notify observer 0x00044434 => ready [Debug] State change: 0x00000000 [Debug] State change: 0x00000001 [Info] Function: nrfx_clock_init, error code: NRF_ERROR_MODULE_ALREADY_INITIALIZED. [Info] Function: nrf_drv_clock_init, error code: NRF_ERROR_MODULE_ALREADY_INITIALIZED. [Warning] Insufficient RAM allocated for the SoftDevice. [Warning] Change the RAM start location from 0x20002260 to 0x20002270. [Warning] Maximum RAM size for application is 0x3dd90. [Error] sd_ble_enable() returned NRF_ERROR_NO_MEM. [Error] Fatal error [Warning] System reset [Info] Function: nrfx_gpiote_init, error code: NRF_SUCCESS. using softdevice the RAM at 0x20002260 ``` 打印 NRF_ERROR_NO_MEM,是内存相关问题,结合上下文,说明可能内存配小了,需要往后挪挪位置。 RAM修改:START `0x20002260` 变更为 STARRT `0x20002270`,`Size` 倒是可以不用进行修改。 修改前: ![image-20240925164728-j3nv3oy.png](https://oss-club.rt-thread.org/uploads/20240925/a4950c5269701c236fb91a463ba3dc5e.png) 修改后: ![image-20240925164801-hbq2kjs.png](https://oss-club.rt-thread.org/uploads/20240925/a48c19eeee0acf4b069e8122a85c3df0.png) 2. 启动BLE后,**闪灯闪烁一段时间之后 或者 PC端进行连接,** 然后LED灯就不闪了。 目测是某些机制没启动,导致跑死了,看起来像是EVENT管理,比如 `NRF_SDH_DISPATCH_MODEL` 之类的没有执行? > 为什么会跑死? > > 1. `NRF_SDH_DISPATCH_MODEL` 没有配置好; > > > 极大可能是这个问题,但是,由于是三选一,也不确定是哪个可行。 > > > > ```c > > /**@brief SoftDevice events are passed to the application from the interrupt context. */ > > #define NRF_SDH_DISPATCH_MODEL_INTERRUPT 0 > > > > /**@brief SoftDevice events are passed to the application using @ref app_scheduler. > > * > > * @note @ref app_scheduler must be initialized before enabling the SoftDevice handler. > > */ > > #define NRF_SDH_DISPATCH_MODEL_APPSH 1 > > > > /**@brief SoftDevice events are polled manually using @ref nrf_sdh_evts_poll(). > > * > > * @note In this mode, a user application can also implement SD_EVT_IRQHandler() to receive a > > * notification about incoming events. > > */ > > #define NRF_SDH_DISPATCH_MODEL_POLLING 2 > > ``` > > > 2. 进入了休眠模式?睡死了? > > > 蓝牙停止广播,理论上不应该让RTOS也睡死。 > > > > 屏蔽掉进入休眠模式的代码:现象未解除,所以不是睡眠的问题; > > > 通过观察时长,闪烁的时间是30秒左右,而且是打印 `Fast advertising.` 之后,就没有打印 `Slow advertising.` 。 ![image-20240925172206-h75hru2.png](https://oss-club.rt-thread.org/uploads/20240925/91a7739863fb5d19c60a1481d05029b3.png) 根据代码推测,应该是服务切换失败了,而服务在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()死循环获取事件,相关代码如下: > > ```c > /* nrf_sdh_freertos.c */ > > /* This function gets events from the SoftDevice and processes them. */ > static void softdevice_task(void * pvParameter) > { > NRF_LOG_DEBUG("Enter softdevice_task."); > > if (m_task_hook != NULL) > { > m_task_hook(pvParameter); > } > > while (true) > { > nrf_sdh_evts_poll(); /* let the handlers run first, incase the EVENT occured before creating this task */ > > (void) ulTaskNotifyTake(pdTRUE, /* Clear the notification value before exiting (equivalent to the binary semaphore). */ > portMAX_DELAY); /* Block indefinitely (INCLUDE_vTaskSuspend has to be enabled).*/ > } > } > > void nrf_sdh_freertos_init(nrf_sdh_freertos_task_hook_t hook_fn, void * p_context) > { > NRF_LOG_DEBUG("Creating a SoftDevice task."); > > m_task_hook = hook_fn; > > BaseType_t xReturned = xTaskCreate(softdevice_task, > "BLE", > NRF_BLE_FREERTOS_SDH_TASK_STACK, > p_context, > 2, > &m_softdevice_task); > if (xReturned != pdPASS) > { > NRF_LOG_ERROR("SoftDevice task not created."); > APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); > } > } > ``` > > ```c > /* mian.c */ > > int main(void) > { > > ... > > nrf_sdh_freertos_init(advertising_start, &erase_bonds); // Create a FreeRTOS task for the BLE stack.The task will run advertising_start() before entering its loop. > > ... > > } > ``` > 咨询群友,说是RTOS就应该配置为 `2`,但是,还是绝觉得不对劲,总觉得这个事件获取应该是和代码有关,而不是和系统的有无有关。 偶然之下,将 `NRF_SDH_DISPATCH_MODEL` 的值从 `2` 设置为 `0`,解决这个卡死问题,实锤了与系统的有无毫无关联: 1. `0` 是中断方式:`RT-Thread` 2. `1` 是app_scheduler:`nRF5X SDK Demo` 3. `2` 是轮询方式:`FreeRTOS` > **`中断模式`** 和 **`轮询模式`** ,这两个哪个更好?不知道了。 > # Visual Stuido + VisualGDB 导入MDK工程 > 最好是先KEIL MDK搭起来能用的工程,然后再导入到VisualGDB里面,是代码先跑,还是你人先跑,那就不好说了。 ## 创建VisualGDB工程(ARMCC) 1. 偷懒了,不想一个文件一个文件的添加,直接将Keil MDK的项目直接导入到VisualGDB里; 1. 单击【创建新项目】 ![image-20240925012936-3i98zcw.png](https://oss-club.rt-thread.org/uploads/20240925/8f59c5cc6febc6d14b52066f8d79034f.png.webp) 2. 选择【嵌入式工程向导】 ![image-20240925013050-f7v1wrx.png](https://oss-club.rt-thread.org/uploads/20240925/d5d5467d7616633cc3566d2da95e03de.png.webp) 3. 填写【工程名】【方案名】【方案创建路径】 ![image-20240925161112-aoxgcm0.png](https://oss-club.rt-thread.org/uploads/20240925/4f83419fe3d4589a0b9aec6aa3e9243d.png.webp) > 方案(visualgdb) -> 工程(ble_app_hids_mouse_pca10056_s140) > 4. 选择【工程类型】【编译器类型】【工程路径】 ![image-20240925162048-892y1ve.png](https://oss-club.rt-thread.org/uploads/20240925/ca86687945f4ab9eb04c86ce4e209eab.png.webp) 5. 选择【MCU】,但是这个界面已配置好,点选【Next】即可 ![image-20240925162334-zuakcai.png](https://oss-club.rt-thread.org/uploads/20240925/05651a9e91561eddef581a2571a23254.png.webp) 6. 配置 DEBUG的方式,这里选择【J-Llink】、【USB】、【SWD】、【Before programming】、【After programming】,点选【Next】进入下一页 ![image-20240925162410-p2rjmmn.png](https://oss-club.rt-thread.org/uploads/20240925/9b998589c86a69a5048b7695d4772d90.png.webp) 7. 路径映射界面,看不懂,所以直接点击【Finsh】结束配置; ![image-20240925163422-iey5cih.png](https://oss-club.rt-thread.org/uploads/20240925/69cacd281ea5e4ea9976743ce26dcdb0.png.webp) ## 完善工程配置(丢失的配置需要补全) 1. 打开左侧的【解决方案资源管理器】,找到筛选器【::Device】,添加图里面的这两个文件到筛选器; Keil工程也有添加这两个文件,但是,导入工程时丢失了。 ![image-20240925184210-eyjaimr.png](https://oss-club.rt-thread.org/uploads/20240925/d8bdf417604e792648342c20d06b4f02.png.webp) 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】弹出选单,选择【属性】进入工程配置界面: ![image-20240925185114-4h57lla.png](https://oss-club.rt-thread.org/uploads/20240925/ea2b084c80a76b66cc2a0f34f4498734.png.webp) 5. `ble_app_hids_mouse_pca10056_s140` 工程配置: 1. 配置应用程序二进制接口:**`Keil Settings -> Floating-point ABI`** : `Hardware FP (-mfloat-abi=hard)` 2. 配置浮点单元类型:**`Keil Settings -> Floating-point unit type`** : `fpv4-sp-d16 (-mfpu=fpv4-sp-d16)` 3. 配置ARM CPU类型:**`Keil Settings -> ARM CPU type`** : `-mcpu=arm7m` 4. 配置ARMCC CPU类型:**`Keil Settings -> CPU Type for ARMCC/ARMASM`** : `Cortex-M4.fp.sp (--cpu=Cortex-M4.fp.sp)` 5. **添加**预编译器定义:**`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只能用”;“去分隔,进入到编辑界面之后,回车换行即可,退出编辑之后,回车会自动转换为”;“ > 6. 配置C/C++语言标准:**`C/C++ -> Advanced -> Language Standard for C++ files`** : `C99 (--c99)` 7. 配置GNU拓展:**`C/C++ -> Advanced -> Enable GNU Language Extensions`** : `否` 8. 配置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简单修改:** > > ```c > ; ************************************************************* > ; *** Scatter-Loading Description File generated by uVision *** > ; ************************************************************* > > LR_IROM1 0x00000000 0x100000 { ; load region size_region > ER_IROM1 0x00000000 0x100000 { ; load address = execution address > *.o (RESET, +First) > *(InRoot$$Sections) > .ANY (+RO) > } > RW_IRAM1 0x20000000 0x40000 { ; RW data > .ANY (+RW +ZI) > } > } > ``` > > ```c > ; ************************************************************* > ; *** Scatter-Loading Description File generated by uVision *** > ; ************************************************************* > > LR_IROM1 0x00027000 0x000D9000 { ; load region size_region > ER_IROM1 0x00027000 0x000D9000 { ; load address = execution address > *.o (RESET, +First) > *(InRoot$$Sections) > .ANY (+RO) > .ANY (+XO) > } > RW_IRAM1 0x20002270 0x0003DDA0 { ; RW data > .ANY (+RW +ZI) > } > } > ``` > > **link.lds简单修改:** > > ```c > /* Linker script to configure memory regions. */ > > SEARCH_DIR(.) > GROUP(-lgcc -lc -lnosys) > > MEMORY > { > FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x100000 > RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x40000 > } > > INCLUDE "packages/nrfx-v2.1.0/mdk/nrf_common.ld" > ``` > > ```c > /* Linker script to configure memory regions. */ > > SEARCH_DIR(.) > GROUP(-lgcc -lc -lnosys) > > MEMORY > { > FLASH (rx) : ORIGIN = 0x00027000 , LENGTH = 0x000D9000 > RAM (rwx) : ORIGIN = 0x20002270, LENGTH = 0x0003DDA0 > } > > INCLUDE "../modules/nrfx/mdk/nrf_common.ld" > ``` > > **目前使用的是ARMCC,使用GCC时,内存相关的打印还要根据编译器进行启动地址的打印 :** > > ![image-20240925194527-dbbc1g2.png](https://oss-club.rt-thread.org/uploads/20240925/e99a2e1de3d61131210d69ea566ebb9a.png.webp) > 9. 这时候,一般就编译成功了,有一堆警告,但是,没关系的。 > **注意,导入成功了,不要随便切回Keil MDK进行编辑,否则再次启动VisualGDB触发改动检测的。** >
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Ghost_Girls
这家伙很懒,什么也没写!
文章
2
回答
4
被采纳
0
关注TA
发私信
相关文章
1
nRF52840 2个串口驱动
2
实现基于RT-Thread Nano的蓝牙三模键盘的三个小白问题
3
nRF52840 BSP 没有nrf5x_sdk这个选项
4
NRF52840 BSP softdevice BLE sample配置添加J-Link RTT后,不能正常运行
5
rtthread小程序“WIFI配网助手”进行蓝牙连接失败
6
透传的BLE蓝牙模块解析
7
柿饼派能实现蓝牙配网吗
8
ab32的notify的内容如何修改?
9
RT-Thread对低功耗蓝牙的支持
10
请问蓝牙mesh开发中如何实现ble部分
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部