Nano 配置
RT-Thread Nano 的配置在 rtconfig.h 中进行,通过开关宏定义来使能或关闭某些功能,接下来对该配置文件中的宏定义进行说明。
头文件
头文件 RTE_Components.h
仅由 Keil MDK 工程生成,其中仅定义了一个打开 FinSH 组件的宏 RTE_USING_FINSH
。
#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,可修改。
#define RT_THREAD_PRIORITY_MAX 8
2、设置 RT-Thread 操作系统节拍,表示多少 tick 每秒,如默认值为 100 ,表示一个时钟节拍(os tick)长度为 10ms。常用值为 100 或 1000。时钟节拍率越快,系统的额外开销就越大。
#define RT_TICK_PER_SECOND 100
3、字节对齐时设定对齐的字节个数,默认 4,常使用 ALIGN(RT_ALIGN_SIZE) 进行字节对齐。
#define RT_ALIGN_SIZE 4
4、设置对象名称的最大长度,默认 8 个字符,一般无需修改。
#define RT_NAME_MAX 8
5、设置使用组件自动初始化功能,默认需要使用,开启该宏则可以使用自动初始化功能。
#define RT_USING_COMPONENTS_INIT
6、开启 RT_USING_USER_MAIN
宏,则打开 user_main 功能,默认需要开启,这样才能调用 RT-Thread 的启动代码;main 线程的栈大小默认为 256,可修改。
#define RT_USING_USER_MAIN
#define RT_MAIN_THREAD_STACK_SIZE 256
内核调试功能配置
定义 RT_DEBUG
宏则开启 debug 模式,默认关闭。若开启系统调试,则可以打印系统 LOG 日志。
//#define RT_DEBUG // 关闭 debug
#define RT_DEBUG_INIT 0 // 启用组件初始化调试配置,设置为 1 则会打印自动初始化的函数名称
//#define RT_USING_OVERFLOW_CHECK // 关闭栈溢出检查
钩子函数配置
设置是否使用钩子函数,默认关闭。
//#define RT_USING_HOOK // 是否 开启系统钩子功能
//#define RT_USING_IDLE_HOOK // 是否 开启空闲线程钩子功能
软件定时器配置
设置是否启用软件定时器,以及相关参数的配置,默认关闭。
#define RT_USING_TIMER_SOFT 0 // 关闭软件定时器功能,为 1 则打开
#if RT_USING_TIMER_SOFT == 0
#undef RT_USING_TIMER_SOFT
#endif
#define RT_TIMER_THREAD_PRIO 4 // 设置软件定时器线程的优先级,默认为 4
#define RT_TIMER_THREAD_STACK_SIZE 512 // 设置软件定时器线程的栈大小,默认为 512 字节
IPC 配置
系统支持的 IPC 有:信号量、互斥量、事件集、邮箱、消息队列。通过定义相应的宏打开或关闭该 IPC 的使用。
#define RT_USING_SEMAPHORE // 设置是否使用 信号量
//#define RT_USING_MUTEX // 设置是否使用 互斥量
//#define RT_USING_EVENT // 设置是否使用 事件集
#define RT_USING_MAILBOX // 设置是否使用 邮箱
//#define RT_USING_MESSAGEQUEUE // 设置是否使用 消息队列
内存配置
RT-Thread 内存管理包含:内存池、内存堆、小内存算法。通过开启相应的宏定义使用相应的功能。
//#define RT_USING_MEMPOOL // 是否使用 内存池
//#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 可配置控制台缓冲大小。
#define RT_USING_CONSOLE // 控制台宏开关
#define RT_CONSOLEBUF_SIZE 128 // 设置控制台数据 buf 大小,默认 128 byte
FinSH 组件的使用通过定义 RT_USING_FINSH 开启,开启后可对 FinSH 组件相关的参数进行配置修改,FINSH_THREAD_STACK_SIZE 的值默认较小,请根据实际情况改大。
#if defined (RT_USING_FINSH) // 开关 FinSH 组件
#define FINSH_USING_MSH // 使用 FinSH 组件 MSH 模式
#define FINSH_USING_MSH_ONLY // 仅使用 MSH 模式
#define __FINSH_THREAD_PRIORITY 5 // 设置 FinSH 组件优先级,配置该值后通过下面的公式进行计算
#define FINSH_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX / 8 * __FINSH_THREAD_PRIORITY + 1)
#define FINSH_THREAD_STACK_SIZE 512 // 设置 FinSH 线程栈大小,范围 1-4096
#define FINSH_HISTORY_LINES 1 // 设置 FinSH 组件记录历史命令个数,值范围 1-32
#define FINSH_USING_SYMTAB // 使用符号表,需要打开,默认打开
#endif
常见问题
Q:移植完成之后出现 hard fault。
A:在默认情况下,系统配置的各种线程栈大小均较小,若不能正常运行,很有可能是栈不够用,可将栈值调大。例如 main 线程栈大小默认为 256,在实际使用时,main 中可能加入其它代码导致栈不够用的情况;FinSH 组件的线程 tshell,默认栈 512 也比较小,在使用时可以调大。