diff --git a/rt-thread-version/rt-thread-nano/nano-port-keil/an0039-nano-port-keil.md b/rt-thread-version/rt-thread-nano/nano-port-keil/an0039-nano-port-keil.md index 6815da9e9b70b5d63ec11f6a54867dd4ddd061db..cf1f16f813ac2b62878a9c0ab8b766b5dbe85466 100644 --- a/rt-thread-version/rt-thread-nano/nano-port-keil/an0039-nano-port-keil.md +++ b/rt-thread-version/rt-thread-nano/nano-port-keil/an0039-nano-port-keil.md @@ -14,7 +14,7 @@ RT-Thread Nano 已集成在 Keil MDK 中,可以直接在 IDE 中进行下载 ## 准备工作 -- 准备一份基础的裸机源码工程,如一份 stm32 的 LED 指示灯闪烁示例代码。 +- 准备一份基础的裸机源码 (可通过 STM32CubeMx 可视化软件创建也可按照工程项目所需文档手动创建) 工程,如一份 stm32 的 LED 指示灯闪烁示例代码。 - 在 KEIL 上安装 RT-Thread Nano Pack。 ### 基础工程准备 @@ -35,19 +35,19 @@ Nano Pack 可以通过在 Keil MDK IDE 内进行安装,也可以手动安装 ![Packs 安装](figures/packs.png) -点击右侧的 Pack,展开 Generic,可以找到 RealThread::RT-Thread,点击 Action 栏对应的 Install ,就可以在线安装 Nano Pack 了。另外,如果需要安装其他版本,则需要展开 RealThread::RT-Thread,进行选择。 +点击右侧的 Pack,展开 Generic,可以找到 RealThread::RT-Thread,点击 Action 栏对应的 Install ,就可以在线安装 Nano Pack 了。另外,如果需要安装其他版本,则需要展开 RealThread::RT-Thread,进行选择,箭头所指代表已经安装的版本。 -![Packs 管理](figures/packs-install.png) +![packs-install](figures\packs-install.png) #### 方法二:手动安装 -我们也可以从官网下载安装文件,[RT-Thread Nano 离线安装包下载](https://download.rt-thread.org/download/mdk/RealThread.RT-Thread.3.1.3.pack),下载结束后双击文件进行安装: +我们也可以从官网下载安装文件,[RT-Thread Nano 离线安装包下载](https://www.rt-thread.org/download/mdk/RealThread.RT-Thread.3.1.5.pack),下载结束后双击文件进行安装: -![Packs 手动安装](figures/packs-install-man.png) +![packs-install-man](figures\packs-install-man.png) -## 添加 RT-Thread Nano 到工程 ## +## 添加 RT-Thread Nano 到工程 打开已经准备好的可以运行的裸机程序,将 RT-Thread 添加到工程。如下图,点击 Manage Run-Time Environment。 @@ -55,11 +55,11 @@ Nano Pack 可以通过在 Keil MDK IDE 内进行安装,也可以手动安装 在 Manage Rum-Time Environment 里 "Software Component" 栏找到 RTOS,Variant 栏选择 RT-Thread,然后勾选 kernel,点击 "OK" 就添加 RT-Thread 内核到工程了。 -![添加 Nano 内核](figures/3-2.png) +![3-2](figures\3-2.png) 现在可以在 Project 看到 RT-Thread RTOS 已经添加进来了,展开 RTOS,可以看到添加到工程的文件: -![添加了 RTOS 的工程](figures/rtos2.jpg) +![rtos2](figures\rtos2.png) Cortex-M 芯片内核移植代码: @@ -79,6 +79,7 @@ ipc.c irq.c kservice.c mem.c +mempool.c object.c scheduler.c thread.c @@ -100,35 +101,57 @@ RT-Thread 会接管异常处理函数 `HardFault_Handler()` 和悬挂处理函 ### 系统时钟配置 -需要在 board.c 中实现 ` 系统时钟配置 `(为 MCU、外设提供工作时钟)与 `os tick 的配置 `(为操作系统提供心跳 / 节拍)。 +需要在 board.c 中实现 ` 系统时钟配置 `(为 MCU、外设提供工作时钟)与 `os tick ` 的配置 (为操作系统提供心跳 / 节拍)。 -如下代码所示, `HAL_Init()` 初始化 HAL 库, `SystemClock_Config() `配置了系统时钟, `SystemCoreClockUpdate()` 对系统时钟进行更新,`_SysTick_Config()` 配置了 OS Tick。此处 OS Tick 使用滴答定时器 systick 实现,需要用户在 board.c 中实现 `SysTick_Handler()` 中断服务例程,调用 RT-Thread 提供的 `rt_tick_increase()` ,如下图所示。 +如下代码所示,用户需要在 board.c 文件中系统初始化和 OS Tick 的配置,用户需在 timer 定时器中断服务函数调用 rt_os_tick_callback function,cortex-m 架构使用 SysTick_Handler() ```c /* board.c */ -void rt_hw_board_init() + +/* timer 定时器中断服务函数调用 rt_os_tick_callback function,cortex-m 架构使用 SysTick_Handler() */ +void rt_os_tick_callback(void) +{ + rt_interrupt_enter(); /* 进入中断时必须调用 */ + + rt_tick_increase(); /* RT-Thread 系统时钟计数 */ + + rt_interrupt_leave(); /* 退出中断时必须调用 */ +} + +/* cortex-m 架构使用 SysTick_Handler() */ +SysTick_Handler() { - HAL_Init(); - SystemClock_Config(); - - /* System Clock Update */ - SystemCoreClockUpdate(); + rt_os_tick_callback(); +} + +void rt_hw_board_init(void) +{ + /* + * TODO 1: OS Tick Configuration + * Enable the hardware timer and call the rt_os_tick_callback function + * periodically with the frequency RT_TICK_PER_SECOND. + */ - /* System Tick Configuration */ - _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + /* 1、系统、时钟初始化 */ + HAL_Init(); // 初始化 HAL 库 + SystemClock_Config(); // 配置系统时钟 + SystemCoreClockUpdate(); // 对系统时钟进行更新 - /* Call components board initial (use INIT_BOARD_EXPORT()) */ + /* 2、OS Tick 频率配置,RT_TICK_PER_SECOND = 1000 表示 1ms 触发一次中断 */ + _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + + /* Call components board initial (use INIT_BOARD_EXPORT()) */ #ifdef RT_USING_COMPONENTS_INIT - rt_components_board_init(); + rt_components_board_init(); #endif #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) - rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get()); + rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get()); #endif } ``` -![OS Tick 的实现](figures/systick.png) +![os_tick](figures\os_tick.png) 由于 `SysTick_Handler()` 中断服务例程由用户在 board.c 中重新实现,做了系统 OS Tick,所以还需要删除工程里中原本已经实现的 `SysTick_Handler()` ,避免在编译时产生重复定义。如果此时对工程进行编译,没有出现函数重复定义的错误,则不用做修改。 @@ -138,16 +161,16 @@ void rt_hw_board_init() 开启系统 heap 将可以使用动态内存功能,如使用 rt_malloc、rt_free 以及各种系统动态创建对象的 API。若需要使用系统内存堆功能,则打开 RT_USING_HEAP 宏定义即可,此时内存堆初始化函数 rt_system_heap_init() 将被调用,如下所示: -![系统 heap 初始化](figures/heap1.png) +![heap1](figures\heap1.png) 初始化内存堆需要堆的起始地址与结束地址这两个参数,系统中默认使用数组作为 heap,并获取了 heap 的起始地址与结束地址,该数组大小可手动更改,如下所示: -![默认 heap 的实现](figures/6-2.png) +![6-2](figures\6-2.png) 注意:开启 heap 动态内存功能后,heap 默认值较小,在使用的时候需要改大,否则可能会有申请内存失败或者创建线程失败的情况,修改方法有以下两种: - 可以直接修改数组中定义的 RT_HEAP_SIZE 的大小,至少大于各个动态申请内存大小之和,但要小于芯片 RAM 总大小。 -- 也可以参考[《RT-Thread Nano 移植原理》——实现动态内存堆](../nano-port-principle/an0044-nano-port-principle.md) 章节进行修改,使用 RAM ZI 段结尾处作为 HEAP 的起始地址,使用 RAM 的结尾地址作为 HEAP 的结尾地址,这是 heap 能设置的最大值的方法。 +- 也可以参考 [《RT-Thread Nano 移植原理》——实现动态内存堆](../nano-port-principle/an0044-nano-port-principle.md) 章节进行修改,使用 RAM ZI 段结尾处作为 HEAP 的起始地址,使用 RAM 的结尾地址作为 HEAP 的结尾地址,这是 heap 能设置的最大值的方法。 ## 编写第一个应用 @@ -170,7 +193,7 @@ void rt_hw_board_init() 2). 初始化系统时钟的位置不同:移植好 RT-Thread Nano 之后,不需要再在 main() 中做相应的系统配置(如 hal 初始化、时钟初始化等),这是因为 RT-Thread 在系统启动时,已经做好了系统时钟初始化等的配置,这在上一小节 “系统时钟配置” 中有讲解。 -## 配置 RT-Thread Nano ## +## 配置 RT-Thread Nano 用户可以根据自己的需要通过修改 rtconfig.h 文件里面的宏定义配置相应功能。 @@ -178,7 +201,7 @@ RT-Thread Nano 默认未开启宏 RT_USING_HEAP,故只支持静态方式创建 MDK 的配置向导 configuration Wizard 可以很方便的对工程进行配置,Value 一栏可以选中对应功能及修改相关值,等同于直接修改配置文件 rtconfig.h。更多细节配置详见 [《 RT-Thread Nano 配置》](../nano-config/an0043-nano-config.md)。 -![Nano 配置](figures/rtconfig.png) +![rtconfig](figures\rtconfig.png) ## 获取示例代码 @@ -190,17 +213,15 @@ Keil MDK 中集成的 RT-Thread Nano 软件包附带示例代码,如果需要 右侧界面切换到 Examples,然后在左侧界面搜索 Device 或者 Boards,点击搜索出的芯片或者开发板,会显示与其相关的所有示例代码,同时可以看到 RT-Thread 的示例代码也在其中,点击 Copy,选择一个路径,然后点击 OK 即可打开示例代码工程。 - - ## 常见问题 ### Q: 如何升级 pack? -**A**: Pack 升级步骤基本如同软件包,展开 RealThread::RT-Thread 后,选择比较新的 Nano 版本,点击 Install 进行安装。如下图所示,点击红色框中的 Install 进行升级,即可将 3.1.2 版本升级到 3.1.3。 +**A**: Pack 升级步骤基本如同软件包,展开 RealThread::RT-Thread 后,选择比较新的 Nano 版本,点击 Install 进行安装。如下图所示,点击红色箭头指中的 Install 进行升级,即可安装相应版本,矩形方框框选的代表已经安装的包,点击红色箭头指中的 Remove 即可卸载。 > 需要注意的是,若多个版本同时安装,则最终向工程添加 Nano 时,只能选择高版本进行添加。 -![Nano 升级](figures/pack-upgrade.png) +![pack-upgrade](figures\pack-upgrade.png) ### Q: 在安装 pack 后,未找到可选的 RT-Thread pack。 @@ -210,7 +231,7 @@ Keil MDK 中集成的 RT-Thread Nano 软件包附带示例代码,如果需要 ### Q: 在添加 Nano 时,选择 shell 后,编译报错。 -**A**: 报错 "Undefined symbol rt_hw_console_getchar (referrred from shell.o)"。这是由于添加 FinSH 组件源码之后,还需要自行定义与实现该函数才能完成 FinSH 的移植,详见 [《在 RT-Thread Nano 上添加控制台与 FinSH》](../finsh-port/an0045-finsh-port.md)。 +**A**: 详见 [《在 RT-Thread Nano 上添加控制台与 FinSH》](../finsh-port/an0045-finsh-port.md)。 diff --git a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/3-2.png b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/3-2.png index 3c420dbd0a9049f61800b969535d86a2f7de272a..174f58f5ac5e315a5e848a86c3f32a8b12cbf2d4 100644 Binary files a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/3-2.png and b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/3-2.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/6-2.png b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/6-2.png index 9be4c302e3ae1a748a5dfad858db0016c26f89eb..465c03b3ab7fe086c985316d162aac4e067e6b2c 100644 Binary files a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/6-2.png and b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/6-2.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/heap1.png b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/heap1.png index 88280781fcacf92aff963064215cca73895eced7..c309038776e7b733b4ee93a6f355669dc3308a52 100644 Binary files a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/heap1.png and b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/heap1.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/pack-upgrade.png b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/pack-upgrade.png index 7886d8116de67f7686af3aeffb825d4acb655bd1..67c25b0ab026fea5b8f87d03f97cfd1bef97bd26 100644 Binary files a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/pack-upgrade.png and b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/pack-upgrade.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/packs-install-man.png b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/packs-install-man.png index 25118bae6baaca440e887d81ee2852bb5765c6f3..20c279f9e9ce7d301ded714ddccc2ee1d770e271 100644 Binary files a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/packs-install-man.png and b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/packs-install-man.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/packs-install.png b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/packs-install.png index 279bd93ae0d9edfa7487915ed8b18f71ead7d412..867857a6f8d79f628fcacc427fe96cfd7473bad8 100644 Binary files a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/packs-install.png and b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/packs-install.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/rtconfig.png b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/rtconfig.png index 25f7523d0e5b6c7b2b62d045012ab86b3cce1cf8..6d95211a3a5745075454d79a5f40455ced013e56 100644 Binary files a/rt-thread-version/rt-thread-nano/nano-port-keil/figures/rtconfig.png and b/rt-thread-version/rt-thread-nano/nano-port-keil/figures/rtconfig.png differ