diff --git a/rt-thread-version/rt-thread-nano/finsh-port/an0045-finsh-port.md b/rt-thread-version/rt-thread-nano/finsh-port/an0045-finsh-port.md index 780376fe487bf9734e0efc7b6c0d71f637957ab8..7867098074af1d4dcfe92ac2c052fff2331a782a 100644 --- a/rt-thread-version/rt-thread-nano/finsh-port/an0045-finsh-port.md +++ b/rt-thread-version/rt-thread-nano/finsh-port/an0045-finsh-port.md @@ -1,18 +1,21 @@ # 在 RT-Thread Nano 上添加控制台与 FinSH 本篇文档分为两部分: -- 第一部分是添加 UART 控制台,用来向控制台对接的终端输出打印信息;该部分只需要实现两个函数,初始化和系统输出函数,即可完成 UART 控制台打印功能。 -- 第二部分是移植 FinSH 组件,用以在控制台输入命令调试系统;该部分的实现基于第一部分,只需要添加 FinSH 组件源码并再对接一个系统输入函数即可实现。 +- 第一部分是添加 UART 控制台(实现打印):用来向控制台对接的终端输出打印信息;该部分只需要实现两个函数,串口初始化和系统输出函数,即可完成 UART 控制台打印功能。 +- 第二部分是移植 FinSH 组件(实现命令输入),用以在控制台输入命令调试系统;该部分的实现基于第一部分,只需要添加 FinSH 组件源码并再对接一个系统输入函数即可实现。 下面将对这两部分进行说明。 -## 在 Nano 上添加 UART 控制台 +## 在 Nano 上添加 UART 控制台(实现打印) 在 RT-Thread Nano 上添加 UART 控制台打印功能后,就可以在代码中使用 RT-Thread 提供的打印函数 rt_kprintf() 进行信息打印,从而获取自定义的打印信息,方便定位代码 bug 或者获取系统当前运行状态等。实现控制台打印(需要确认 rtconfig.h 中已使能 `RT_USING_CONSOLE` 宏定义),需要完成基本的硬件初始化,以及对接一个系统输出字符的函数,本小节将详细说明。 ### 实现串口初始化 -使用串口对接控制台的打印,首先需要初始化串口,如引脚、波特率等。 uart_init() 需要在 board.c 中的 `rt_hw_board_init()` 函数中调用。 +使用串口对接控制台的打印,首先需要初始化串口,如引脚、波特率等。 初始化的串口函数 uart_init() 有以下两种调用方式,二选一: + +1. 方法一:默认使用宏 INIT_BOARD_EXPORT() 进行自动初始化,不需要显式调用,如下所示。 +2. 方法二:可以使用显式调用:uart_init() 需要在 board.c 中的 `rt_hw_board_init()` 函数中调用。 ```c /* 实现 1:初始化串口 */ @@ -43,7 +46,7 @@ static int uart_init(void) return 0; } -INIT_BOARD_EXPORT(uart_init); +INIT_BOARD_EXPORT(uart_init); /* 默认选择初始化方法一:使用宏 INIT_BOARD_EXPORT 进行自动初始化 */ ``` ```c @@ -51,7 +54,7 @@ INIT_BOARD_EXPORT(uart_init); void rt_hw_board_init(void) { .... - uart_init(); // 在 rt_hw_board_init 函数中调用 串口初始化 函数 + uart_init(); /* 初始化方法二:可以选择在 rt_hw_board_init 函数中直接调用 串口初始化 函数 */ .... } ``` @@ -96,7 +99,7 @@ void rt_hw_console_output(const char *str) ![示例](figures/ok1.png) -## 在 Nano 上添加 FinSH 组件 +## 在 Nano 上添加 FinSH 组件(实现命令输入) [RT-Thread FinSH](https://www.rt-thread.org/document/site/programming-manual/finsh/finsh/) 是 RT-Thread 的命令行组件(shell),提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信,使用 FinSH 组件基本命令的效果图如下所示: @@ -119,13 +122,19 @@ void rt_hw_console_output(const char *str) 勾选 shell,这将自动把 FinSH 组件的源码到工程: -![勾选 shell](figures/add.png) +![勾选 shell](figures/add-3.1.5.png) + +然后在 rtconfig.h 中打开 finsh 相关选项,如下图: + +![keil finsh](figures/keil-finsh-3.1.5.png) #### Cube MX 添加 FinSH 源码 打开一个 cube 工程,点击 Additional Software,在 Pack Vendor 中可勾选 RealThread 快速定位 RT-Thread 软件包,然后在 RT-Thread 软件包中勾选 shell,即可添加 FinSH 组件的源码到工程中。 -![Cube MX 添加 FinSH 源码](figures/cube-add-finsh-src.png) +![Cube MX 添加 FinSH 源码](figures/cube-add-finsh-src-3.1.5.png) + +然后在生成后的代码中,找到 rtconfig.h,使能 `#include "finsh_config.h"` 。 #### 其他 IDE 添加 FinSH 源码 @@ -138,14 +147,23 @@ void rt_hw_console_output(const char *str) 2、目标工程添加 FinSH 源码: - 打开工程,新建 `finsh` 分组,添加工程中 `finsh` 文件夹下的所有. c 文件,如下图; + + ``` + cmd.c + msh.c + shell.c + finsh_port.c + ``` + - 添加 `finsh` 文件夹的头文件路径(点击 `Project -> Options... ` 进入弹窗进行添加,如下图); -- 在 rtconfig.h 中添加 `#define RT_USING_FINSH` 宏定义,这样 FinSH 将生效,如下图。 -![添加 finsh 源码](figures/finsh-src.png) +- 在 rtconfig.h 中使能 `#define RT_USING_FINSH` 宏定义,这样 FinSH 将生效,如下图。 + +![添加 finsh 源码](figures/finsh-src-3.1.5.png) ![添加 finsh 头文件路径](figures/iar-finsh-h.png) -![添加 finsh 所需宏定义](figures/rtconfig-add.png) +![添加 finsh](figures/rtconfig-add-3.1.5.png) ### 实现 rt_hw_console_getchar @@ -156,9 +174,9 @@ void rt_hw_console_output(const char *str) char rt_hw_console_getchar(void); ``` -- rt_hw_console_getchar():控制台获取一个字符,即在该函数中实现 uart 获取字符,可以使用查询方式获取(注意不要死等,在未获取到字符时,需要让出 CPU),也可以使用中断方式获取。 +- rt_hw_console_getchar():控制台获取一个字符,即在该函数中实现 uart 获取字符,可以使用查询方式获取(注意不要死等,在未获取到字符时,需要让出 CPU),推荐使用中断方式获取。 -**示例代码**:如下是基于 STM32F103 HAL 串口驱动对接的 rt_hw_console_getchar(),完成对接 FinSH 组件,其中获取字符采用查询方式,示例仅做参考。 +**示例代码**:如下是基于 STM32F103 HAL 串口驱动对接的 rt_hw_console_getchar(),完成对接 FinSH 组件,其中获取字符采用查询方式,示例仅做参考,可自行实现中断方式获取字符。 ```c char rt_hw_console_getchar(void) @@ -463,9 +481,15 @@ A: 不可以。但是可以通过其他方法实现打印浮点数的目的, ![示例](figures/ok1.png) -A:可能的原因有:UART 驱动未实现字符输入函数、未打开 FinSH 组件等;如果手动开启了 HEAP,需要确定 HEAP 是否过小,导致 tshell 线程创建失败 。 +A:可能的原因有:UART 驱动未实现字符输入函数、未打开 FinSH 组件等;如果开启了 HEAP,需要确定 HEAP 是否过小,导致 tshell 线程创建失败 。 ### Q: 出现 hard fault。 A: ps 后关注各个线程栈的最大利用率,若某线程出现 100% 的情况,则表示该线程栈过小,需要将值调大。 +### Q:使用 AC6 编译错误。 + +A:汇编文件识别失败造成的,识别错误的情况下会识别为 c 文件,可以右击文件,将汇编文件的文件类型改为汇编类型,再次编译即可。 + + + diff --git a/rt-thread-version/rt-thread-nano/finsh-port/figures/add-3.1.5.png b/rt-thread-version/rt-thread-nano/finsh-port/figures/add-3.1.5.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe8d3209c3ac6ee6274ac7aa86d7ab8acbfcf2e Binary files /dev/null and b/rt-thread-version/rt-thread-nano/finsh-port/figures/add-3.1.5.png differ diff --git a/rt-thread-version/rt-thread-nano/finsh-port/figures/cube-add-finsh-src-3.1.5.png b/rt-thread-version/rt-thread-nano/finsh-port/figures/cube-add-finsh-src-3.1.5.png new file mode 100644 index 0000000000000000000000000000000000000000..9d46e1ebb2bf0e052a2e4d6f4c97ccf08b7eb4e1 Binary files /dev/null and b/rt-thread-version/rt-thread-nano/finsh-port/figures/cube-add-finsh-src-3.1.5.png differ diff --git a/rt-thread-version/rt-thread-nano/finsh-port/figures/finsh-src-3.1.5.png b/rt-thread-version/rt-thread-nano/finsh-port/figures/finsh-src-3.1.5.png new file mode 100644 index 0000000000000000000000000000000000000000..dac5ecb5dc69603217ce5dbcd718db312c264376 Binary files /dev/null and b/rt-thread-version/rt-thread-nano/finsh-port/figures/finsh-src-3.1.5.png differ diff --git a/rt-thread-version/rt-thread-nano/finsh-port/figures/keil-finsh-3.1.5.png b/rt-thread-version/rt-thread-nano/finsh-port/figures/keil-finsh-3.1.5.png new file mode 100644 index 0000000000000000000000000000000000000000..278c7422da8037bb6ce54b723a85f617fc8acf7c Binary files /dev/null and b/rt-thread-version/rt-thread-nano/finsh-port/figures/keil-finsh-3.1.5.png differ diff --git a/rt-thread-version/rt-thread-nano/finsh-port/figures/rtconfig-add-3.1.5.png b/rt-thread-version/rt-thread-nano/finsh-port/figures/rtconfig-add-3.1.5.png new file mode 100644 index 0000000000000000000000000000000000000000..790f41d766f26768befad957374c6b265c273c57 Binary files /dev/null and b/rt-thread-version/rt-thread-nano/finsh-port/figures/rtconfig-add-3.1.5.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-config/an0043-nano-config.md b/rt-thread-version/rt-thread-nano/nano-config/an0043-nano-config.md index cf9620a860d2a8fbf6dbcc9682b5d7fd97b81cc8..ee7e5423058974cf43217fd232c6e09f61c09a2e 100644 --- a/rt-thread-version/rt-thread-nano/nano-config/an0043-nano-config.md +++ b/rt-thread-version/rt-thread-nano/nano-config/an0043-nano-config.md @@ -2,36 +2,17 @@ RT-Thread Nano 的配置在 rtconfig.h 中进行,通过开关宏定义来使能或关闭某些功能,接下来对该配置文件中的宏定义进行说明。 -## 头文件 - -头文件 `RTE_Components.h` 仅由 Keil MDK 工程生成,其中仅定义了一个打开 FinSH 组件的宏 `RTE_USING_FINSH`。 - -```c - -#if defined (__CC_ARM) || (__CLANG_ARM) -#include "RTE_Components.h" /* 用来开关 FinSH 组件,仅 MDK 会产生该文件 */ - -#if defined(RTE_USING_FINSH) -#define RT_USING_FINSH -#endif //RTE_USING_FINSH - -#endif //(__CC_ARM) || (__CLANG_ARM) - -``` - -非 Keil MDK 则不需要该头文件,若需打开 FinSH 组件,可直接在 rtconfig.h 中手动定义 `RT_USING_FINSH` 打开 FinSH 组件。 - ## 基础配置 -1、设置系统最大优先级,可设置范围 8 到 256,默认值 8,可修改。 +1、设置系统最大优先级,可设置范围 8 到 256,默认值 32,可修改。 ```c -#define RT_THREAD_PRIORITY_MAX 8 +#define RT_THREAD_PRIORITY_MAX 32 ``` 2、设置 RT-Thread 操作系统节拍,表示多少 tick 每秒,如默认值为 100 ,表示一个时钟节拍(os tick)长度为 10ms。常用值为 100 或 1000。时钟节拍率越快,系统的额外开销就越大。 ```c -#define RT_TICK_PER_SECOND 100 +#define RT_TICK_PER_SECOND 1000 ``` 3、字节对齐时设定对齐的字节个数,默认 4,常使用 ALIGN(RT_ALIGN_SIZE) 进行字节对齐。 @@ -48,16 +29,15 @@ RT-Thread Nano 的配置在 rtconfig.h 中进行,通过开关宏定义来使 ```c #define RT_USING_COMPONENTS_INIT ``` -6、开启 `RT_USING_USER_MAIN` 宏,则打开 user_main 功能,默认需要开启,这样才能调用 RT-Thread 的启动代码;main 线程的栈大小默认为 256,可修改。 +6、开启 `RT_USING_USER_MAIN` 宏,则打开 user_main 功能,默认需要开启,这样才能调用 RT-Thread 的启动代码;main 线程的栈大小可修改。 ```c #define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 256 +#define RT_MAIN_THREAD_STACK_SIZE 512 ``` ## 内核调试功能配置 - -定义 `RT_DEBUG` 宏则开启 debug 模式,默认关闭。若开启系统调试,则可以打印系统 LOG 日志。 +定义 `RT_DEBUG` 宏则开启 debug 模式。若开启系统调试,则在实现打印之后可以打印系统 LOG 日志。请在代码开发与调试过程中打开该项,帮助调试定位问题,在代码发布时关闭该项。 ```c //#define RT_DEBUG // 关闭 debug @@ -94,7 +74,7 @@ RT-Thread Nano 的配置在 rtconfig.h 中进行,通过开关宏定义来使 系统支持的 IPC 有:信号量、互斥量、事件集、邮箱、消息队列。通过定义相应的宏打开或关闭该 IPC 的使用。 ```c -#define RT_USING_SEMAPHORE // 设置是否使用 信号量 +#define RT_USING_SEMAPHORE // 设置是否使用 信号量,默认打开 //#define RT_USING_MUTEX // 设置是否使用 互斥量 @@ -111,41 +91,54 @@ RT-Thread 内存管理包含:内存池、内存堆、小内存算法。通过 ```c //#define RT_USING_MEMPOOL // 是否使用 内存池 -//#define RT_USING_HEAP // 是否使用 内存堆 +#define RT_USING_HEAP // 是否使用 内存堆 #define RT_USING_SMALL_MEM // 是否使用 小内存管理 //#define RT_USING_TINY_SIZE // 是否使用 小体积的算法,牵扯到 rt_memset、rt_memcpy 所产生的体积 ``` -## FinSH 控制台配置 -定义 RT_USING_CONSOLE 则开启控制台功能,失能该宏则关闭控制台,不能实现打印;修改 RT_CONSOLEBUF_SIZE 可配置控制台缓冲大小。 +## FinSH 配置 + +当系统加入 FinSH 组件源码后,需要在 rtconfig.h 中开启以下项 ```c -#define RT_USING_CONSOLE // 控制台宏开关 -#define RT_CONSOLEBUF_SIZE 128 // 设置控制台数据 buf 大小,默认 128 byte +#include "finsh_config.h" ``` -FinSH 组件的使用通过定义 RT_USING_FINSH 开启,开启后可对 FinSH 组件相关的参数进行配置修改,FINSH_THREAD_STACK_SIZE 的值默认较小,请根据实际情况改大。 +该头文件中包含了对 FinSH 组件的配置。如下是该头文件中包含的 FinSH 组件的配置项: + ```c -#if defined (RT_USING_FINSH) // 开关 FinSH 组件 +/* 打开 FinSH 组件 */ +#define RT_USING_FINSH - #define FINSH_USING_MSH // 使用 FinSH 组件 MSH 模式 - #define FINSH_USING_MSH_ONLY // 仅使用 MSH 模式 +/* 使用 MSH 模式 */ +#define FINSH_USING_MSH +#define FINSH_USING_MSH_ONLY - #define __FINSH_THREAD_PRIORITY 5 // 设置 FinSH 组件优先级,配置该值后通过下面的公式进行计算 - #define FINSH_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX / 8 * __FINSH_THREAD_PRIORITY + 1) +/* tshell 线程的优先级与线程栈大小 */ +#define FINSH_THREAD_PRIORITY 21 // 请检查系统最大优先级的值,该值必须在系统支持的优先级范围之内 +#define FINSH_THREAD_STACK_SIZE 1024 - #define FINSH_THREAD_STACK_SIZE 512 // 设置 FinSH 线程栈大小,范围 1-4096 +/* 使用符号表,使用命令描述 */ +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +``` - #define FINSH_HISTORY_LINES 1 // 设置 FinSH 组件记录历史命令个数,值范围 1-32 - #define FINSH_USING_SYMTAB // 使用符号表,需要打开,默认打开 +注意:若未加入 FinSH 组件源码,请勿开启此项。 +## DEVICE 框架配置 -#endif +当系统中加入 device 框架源码时,则需要在 rtconfig.h 中开启以下项 + +```c +#define RT_USING_DEVICE ``` +开启该项则将加入 device 框架源码。 + +注意:若未加入 device 源码,请勿开启此项。 ## 常见问题 Q:移植完成之后出现 hard fault。 -A:在默认情况下,系统配置的各种线程栈大小均较小,若不能正常运行,很有可能是栈不够用,可将栈值调大。例如 main 线程栈大小默认为 256,在实际使用时,main 中可能加入其它代码导致栈不够用的情况;FinSH 组件的线程 tshell,默认栈 512 也比较小,在使用时可以调大。 \ No newline at end of file +A:在默认情况下,系统配置的各种线程栈大小均较小,若不能正常运行,很有可能是栈不够用,可将栈值调大。例如 main 线程栈大小默认为 256,在实际使用时,main 中可能加入其它代码导致栈不够用的情况;FinSH 组件的线程 tshell,默认栈 512 也比较小,在使用时可以调大。 diff --git a/rt-thread-version/rt-thread-nano/nano-port-cube/an0041-nano-port-cube.md b/rt-thread-version/rt-thread-nano/nano-port-cube/an0041-nano-port-cube.md index 9f316ef1b8fb70d446be87fb0ee101495d3d434a..e41dcad59a9a24d642b8128b9b2bb356a94bf1a2 100644 --- a/rt-thread-version/rt-thread-nano/nano-port-cube/an0041-nano-port-cube.md +++ b/rt-thread-version/rt-thread-nano/nano-port-cube/an0041-nano-port-cube.md @@ -24,7 +24,7 @@ RT-Thread Nano 已集成在 CubeMX 中,可以直接在 IDE 中进行下载添 ![完成安装](figures/from_url.png) -`check` 通过后,点击 OK 回到 `User Defined Packs Manager` 界面,再次点击 OK,CubeMX 自动连接服务器,获取包描述文件。回到 `Manage embedded software packages` 界面,就会发现 `RT-Thread Nano 3.1.3` 软件包,选择该软件包,点击 `Install Now`,如下图所示: +`check` 通过后,点击 OK 回到 `User Defined Packs Manager` 界面,再次点击 OK,CubeMX 自动连接服务器,获取包描述文件。回到 `Manage embedded software packages` 界面,就会发现 `RT-Thread Nano 3.1.5` 软件包,选择该软件包,点击 `Install Now`,如下图所示: ![选择版本](figures/exisit_pack.png) @@ -54,17 +54,17 @@ RT-Thread Nano 已集成在 CubeMX 中,可以直接在 IDE 中进行下载添 ### 选择 Nano 组件 -选中芯片型号之后,点击 `Additional Softwares`,进入 `Additional Software Components selection` 界面,在 `Pack Vendor` 中选择 `RealThread`, 然后根据需求选择 RT-Thread 组件(此处只移植 Nano,只选择 kernel 即可),然后点击 OK 按钮,如下图所示: +选中芯片型号之后,点击 `Softwares Packages`->`Select Components`,进入组件配置界面,选择 `RealThread`, 然后根据需求选择 RT-Thread 组件,然后点击 OK 按钮,如下图所示: -![选择软件包](figures/pack_choice.png) +![选择软件包](figures/pack_choice-3.1.5.png) -> 注意:RT-Thread Nano 软件包中包含 kernel 与 shell 两个部分,仅选择 kernel 表示只使用 RT-Thread 内核,工程中会添加内核代码;选择 kernel 与 shell 表示在使用 RT-Thread Nano 的基础上使用 FinSH Shell 组件,工程中会添加内核代码与 FinSH 组件的代码,FinSH 的移植详见 [《在 RT-Thread Nano 上添加控制台与 FinSH》](../finsh-port/an0045-finsh-port.md)。 +> 注意:RT-Thread Nano 软件包中包含 kernel, shell 和 device 三个部分,仅选择 kernel 表示只使用 RT-Thread 内核,工程中会添加内核代码;选择 kernel 与 shell 表示在使用 RT-Thread Nano 的基础上使用 FinSH Shell 组件,工程中会添加内核代码与 FinSH 组件的代码,FinSH 的移植详见 [《在 RT-Thread Nano 上添加控制台与 FinSH》](../finsh-port/an0045-finsh-port.md)。再选择 device 表示使用 rt-thread 的 device 框架,用户基于此框架编写外设驱动并注册后,就可以使用 device 统一接口操作外设。 ### 配置 Nano 选择组件之后,对组件参数进行配置。在工程界面 `Pinout & Configuration` 中,进入所选组件参数配置区,按照下图进行配置 -![配置 rt-thread](figures/pack_config.png) +![配置 rt-thread](figures/pack_config-3.1.5.jpg) ### 工程管理 @@ -80,9 +80,9 @@ RT-Thread Nano 已集成在 CubeMX 中,可以直接在 IDE 中进行下载添 ### 中断与异常处理 -RT-Thread 操作系统重定义 `HardFault_Handler`、`PendSV_Handler`、`SysTick_Handler` 中断函数,为了避免重复定义的问题,在生成工程之前,需要在中断配置中,代码生成的选项中,取消选择三个中断函数(对应注释选项是 `Hard fault interrupt`, `Pendable request`, `Time base :System tick timer`),最后点击生成代码,具体操作如下图中步骤 11-15 所示: +RT-Thread 操作系统重定义 `HardFault_Handler`、`PendSV_Handler`、`SysTick_Handler` 中断函数,为了避免重复定义的问题,在生成工程之前,需要在中断配置中,代码生成的选项中,取消选择三个中断函数(对应注释选项是 `Hard fault interrupt`, `Pendable request`, `Time base :System tick timer`),最后点击生成代码,具体操作如下图 所示: -![中断配置](figures/nvic_config.png) +![中断配置](figures/nvic_config-3.1.5.png) 等待工程生成完毕,点击打开工程,如下图所示,即可进入 MDK5 工程中。 @@ -182,7 +182,7 @@ void rt_hw_board_init() ### Q: check 网址失败 -**A**: 建议升级 Cube MX 版本至 5.0。 +**A**: 建议升级 Cube MX 版本至 5.0 以上。 ### Q: CubeMX 如何升级 diff --git a/rt-thread-version/rt-thread-nano/nano-port-cube/figures/exisit_pack.png b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/exisit_pack.png index a6e53960a94f759d11beb57d5e3dc5a9c359bc73..7065689a2be853a08897ba5a17569cb3498ab9f1 100644 Binary files a/rt-thread-version/rt-thread-nano/nano-port-cube/figures/exisit_pack.png and b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/exisit_pack.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-cube/figures/finish.png b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/finish.png index 7eae30ed16775866dbc5e0a256433215169139a5..048f851cf54a34a21469e1d5ce6aab006be16993 100644 Binary files a/rt-thread-version/rt-thread-nano/nano-port-cube/figures/finish.png and b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/finish.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-cube/figures/installed_url.png b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/installed_url.png index d2a9de0c1989a63ee79191d994420791f8841bb5..1167f5f359507c3c41c2004b2a67b31facea025d 100644 Binary files a/rt-thread-version/rt-thread-nano/nano-port-cube/figures/installed_url.png and b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/installed_url.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-cube/figures/nvic_config-3.1.5.png b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/nvic_config-3.1.5.png new file mode 100644 index 0000000000000000000000000000000000000000..5c3695a72ca6ff9c60a10fd711697b8c4efa9599 Binary files /dev/null and b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/nvic_config-3.1.5.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-cube/figures/pack_choice-3.1.5.png b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/pack_choice-3.1.5.png new file mode 100644 index 0000000000000000000000000000000000000000..7e3641e1f271146d90dac75868a00c533bb3e53e Binary files /dev/null and b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/pack_choice-3.1.5.png differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-cube/figures/pack_config-3.1.5.jpg b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/pack_config-3.1.5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..520d4df7cf39f416155da773a1d30e1918dac12e Binary files /dev/null and b/rt-thread-version/rt-thread-nano/nano-port-cube/figures/pack_config-3.1.5.jpg differ diff --git a/rt-thread-version/rt-thread-nano/nano-port-gcc-riscv/an0042-nano-port-gcc-riscv.md b/rt-thread-version/rt-thread-nano/nano-port-gcc-riscv/an0042-nano-port-gcc-riscv.md index 8dfbaa36795b2363cb1b68cba6781170e6d26736..1a1d9104acb0c475a120fb069804211bc2237390 100644 --- a/rt-thread-version/rt-thread-nano/nano-port-gcc-riscv/an0042-nano-port-gcc-riscv.md +++ b/rt-thread-version/rt-thread-nano/nano-port-gcc-riscv/an0042-nano-port-gcc-riscv.md @@ -59,6 +59,7 @@ ipc.c irq.c kservice.c mem.c +mempool.c object.c scheduler.c thread.c @@ -197,5 +198,5 @@ RT-Thread 提供中断管理方法,当系统没有实现类似中断向量表 ... ``` -RT-Thread Nano 默认未开启宏 RT_USING_HEAP,故只支持静态方式创建任务及信号量。若要通过动态方式创建对象则需要在 rtconfig.h 文件里开启 RT_USING_HEAP 宏定义。完整配置详见 [《 RT-Thread Nano 配置》](../nano-config/an0043-nano-config.md)。 +RT-Thread Nano 完整配置详见 [《 RT-Thread Nano 配置》](../nano-config/an0043-nano-config.md)。 diff --git a/rt-thread-version/rt-thread-nano/nano-port-iar/an0040-nano-port-iar.md b/rt-thread-version/rt-thread-nano/nano-port-iar/an0040-nano-port-iar.md index 9de9bc20b040e35ebf3846c6a34d321bbfc404a1..9f215d0c6b5ac6a33da983ae872df9cee7641f59 100644 --- a/rt-thread-version/rt-thread-nano/nano-port-iar/an0040-nano-port-iar.md +++ b/rt-thread-version/rt-thread-nano/nano-port-iar/an0040-nano-port-iar.md @@ -63,6 +63,7 @@ ipc.c irq.c kservice.c mem.c +mempool.c object.c scheduler.c thread.c @@ -197,5 +198,5 @@ void rt_hw_board_init() ... ``` -RT-Thread Nano 默认未开启宏 RT_USING_HEAP,故只支持静态方式创建任务、信号量等对象。若要通过动态方式创建对象则需要在 rtconfig.h 文件里开启 RT_USING_HEAP 宏定义。完整配置详见 [《 RT-Thread Nano 配置》](../nano-config/an0043-nano-config.md)。 +若不开启宏 RT_USING_HEAP,则只支持静态方式创建任务、信号量等对象。若要通过动态方式创建对象则需要在 rtconfig.h 文件里开启 RT_USING_HEAP 宏定义。完整配置详见 [《 RT-Thread Nano 配置》](../nano-config/an0043-nano-config.md)。 diff --git a/rt-thread-version/rt-thread-nano/nano-port-principle/an0044-nano-port-principle.md b/rt-thread-version/rt-thread-nano/nano-port-principle/an0044-nano-port-principle.md index 8a55b25526fa3e74dcd206db46c4ad3b61b6adc2..249c40201f0cbab80493d726ac2ef6d13d71e758 100644 --- a/rt-thread-version/rt-thread-nano/nano-port-principle/an0044-nano-port-principle.md +++ b/rt-thread-version/rt-thread-nano/nano-port-principle/an0044-nano-port-principle.md @@ -60,11 +60,11 @@ int entry(void) 最终调用 main() 函数进入用户 main()。 -### 上下文切换 context_xx.s +### 上下文切换 context_xx.S 上下文切换表示 CPU 从一个线程切换到另一个线程、或者线程与中断之间的切换等。在上下文切换过程中,CPU 一般会停止处理当前运行的代码,并保存当前程序运行的具体位置以便之后继续运行。 -在该文件中除了实现上下文切换的函数外,还需完成全局开关中断函数,详见编程指南 [《内核移植》 - CPU 架构移植](../../../programming-manual/porting/porting/) 章节中的 “实现全局开关中断 ” 小节与 “实现上下文切换” 小节。 +在该文件中除了实现上下文切换的函数外,还需完成全局开关中断函数,详见编程指南 [《内核移植》 - CPU 架构移植](../../../programming-manual/porting/porting/) 章节中的 “实现全局开关中断” 小节与 “实现上下文切换” 小节。 | 需实现的函数 | 描述 | | ------------------------------------------------------------ | ------------------------------------------------------------ | @@ -114,7 +114,7 @@ int entry(void) 1. 配置系统时钟。 2. 实现 OS 节拍。 -3. 初始化外设:如 GPIO/UART 等等。 +3. 初始化外设:如 GPIO/UART 等等,若需要请在此处调用。 4. 初始化系统内存堆,实现动态堆内存管理。 5. 板级自动初始化,使用 INIT_BOARD_EXPORT() 自动初始化的函数会在此处被初始化。 6. 其他必要的初始化,如 MMU 配置(需要时请自行在 rt_hw_board_init 函数中调用应用函数实现)。 @@ -123,39 +123,47 @@ int entry(void) /* board.c */ void rt_hw_board_init(void) { - /* System Clock Update */ - SystemCoreClockUpdate(); + /* 第一部分:系统初始化、系统时钟配置等 */ + HAL_init(); // 一些系统层初始化,若需要则增加此部分 + SystemClock_Config(); // 配置系统时钟 + SystemCoreClockUpdate(); // 更新系统时钟频率 SystemCoreClock - /* System Tick Configuration */ + /* 第二部分:配置 OS Tick 的频率,实现 OS 节拍(并在中断服务例程中实现 OS Tick 递增) */ _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + /* 第三部分:初始化硬件外设,若有需要,则放在此处调用 */ + + /* 第四部分:系统动态内存堆初始化 */ #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get()); #endif - /* Call components board initial (use INIT_BOARD_EXPORT()) */ + /* 第五部分:使用 INIT_BOARD_EXPORT() 进行的初始化 */ #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif + + /* 第六部分:其他初始化 */ } ``` -### 配置系统时钟 +### 一、配置系统时钟 -系统时钟是给各个硬件模块提供工作时钟的基础,一般在 `rt_hw_board_init()` 函数中完成,可以调用库函数实现配置,也可以自行实现。 +系统时钟是给各个硬件模块提供工作时钟的基础,在 `rt_hw_board_init()` 函数中完成,可以调用库函数实现配置,也可以自行实现。 -如下是 stm32 配置系统时钟调用示例(调用库函数 SystemCoreClockUpdate()): +如下是配置系统时钟调用示例: ```c /* board.c */ void rt_hw_board_init() { - SystemCoreClockUpdate(); // 在无库函数使用时,一般使用 rt_hw_clock_init() 配置,函数名不做要求,函数自行实现 + /* 第一部分:系统初始化、系统时钟配置等 */ + rt_hw_clock_init() // 时钟初始化,函数名不做要求,函数自行实现,如 SystemClock_Config()、SystemCoreClockUpdate() ... } ``` -### 实现 OS 节拍 +### 二、实现 OS 节拍 OS 节拍也叫时钟节拍或 OS tick。任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件。 @@ -168,11 +176,12 @@ OS 节拍也叫时钟节拍或 OS tick。任何操作系统都需要提供一个 void rt_hw_board_init() { ... + /* 第二部分:配置 OS Tick 的频率,实现 OS 节拍(并在中断服务例程中实现 OS Tick 递增) */ _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); // 使用 SysTick 实现时钟节拍 ... } -/* 中断服务例程 */ +/* systick 中断服务例程 */ void SysTick_Handler(void) { /* enter interrupt */ @@ -192,6 +201,7 @@ void SysTick_Handler(void) void rt_hw_board_init() { ... + /* 第二部分:配置 OS Tick 的频率,实现 OS 节拍(并在中断服务例程中实现 OS Tick 递增) */ rt_hw_timer_init(); // 使用 硬件定时器 实现时钟节拍,一般命名为 rt_hw_timer_init() ... } @@ -203,7 +213,7 @@ int rt_hw_timer_init(void) // 函数自行实现,并需要装载中断服务 rt_hw_interrupt_umask(IRQ_PBA8_TIMER2_3); } -/* 中断服务例程 */ +/* TIMER 中断服务例程 */ static void rt_hw_timer_isr(int vector, void *param) { rt_interrupt_enter(); @@ -215,7 +225,7 @@ static void rt_hw_timer_isr(int vector, void *param) > [!NOTE] > 注:在初始化时钟节拍的时候,会用到宏 `RT_TICK_PER_SECOND`。通过修改该宏的值,可以修改系统中一个时钟节拍的时间长度。 -### 硬件外设初始化 +### 三、硬件外设初始化 硬件初始化,如 UART 初始化等(对接控制台),需要在 rt_hw_board_init() 函数中手动调用 UART 初始化函数。 @@ -224,12 +234,14 @@ static void rt_hw_timer_isr(int vector, void *param) void rt_hw_board_init(void) { .... + /* 第三部分:初始化硬件外设,若有需要,则放在此处调用 */ uart_init(); .... } ``` +注意,uart_init() 或者其他的外设初始化函数,若已经使用了宏 INIT_BOARD_EXPORT() 进行初始化,则不需要在此进行显式调用。两种初始化方法选择一种即可。 -### 实现动态内存堆 +### 四、实现动态内存堆 RT-Thread Nano 默认不开启动态内存堆功能,开启 RT_USING_HEAP 将可以使用动态内存功能,即可以使用 rt_malloc、rt_free 以及各种系统动态创建对象的 API。动态内存堆管理功能的初始化是通过 rt_system_heap_init() 函数完成的,动态内存堆的初始化需要指定堆内存的起始地址和结束地址,函数原型如下: