k_config.h说明
更新时间:2019-01-31 14:08:20
config体系概述
AliOS-Things的内核(称为Rhino)可以通过宏进行功能配置。完整的配置宏可以在"k_default_config.h"文件中看到,里面的宏可分为两类——开关类与数值设置类。开关类负责打开或关闭一个内核模块,数值设置用于设定一些参数。"k_default_config.h"文件位于Rhino内核代码中,其对每个可配置宏都进行了默认值的设置。
针对每一个AliOS-Things支持的单板,还配套有一个"k_config.h"。其用于设定本单板环境下特定的内核Rhino配置,这些宏配置值通常与"k_default_config.h"值不同。这些"k_config.h"位于\board\\*\目录下,***为具体单板名称。
AliOS-Things内部组件都是通过#include "k_api.h"来使用这些配置宏的,"k_api.h"中固定包含顺序:
#include "k_config.h"
#include "k_default_config.h"
所以,单板特定的宏设置优先于默认设置。以信号量功能开关举例:
//"k_config.h"中这么描述:
#ifndef RHINO_CONFIG_SEM
#define RHINO_CONFIG_SEM 1
#endif
//"k_default_config.h"中这么描述
#ifndef RHINO_CONFIG_SEM
#define RHINO_CONFIG_SEM 0
#endif
最终RHINO_CONFIG_SEM生效值为1,即信号量功能打卡。
对于"k_config.h"中未出现的Rhino内核配置项,则"k_default_config.h"
中默认值生效。
常用配置选项说明
RHINO_CONFIG_SEM
信号量模块的开关,"0"表示关闭 / "1"表示打开。主要对应"k_sem.h"中的功能。RHINO_CONFIG_TASK_SEM
任务信号量模块的开关,"0"表示关闭 / "1"表示打开。主要对应"k_task_sem.h"中的功能。
对比信号量用于同步或互斥场景,任务信号量只用于同步,提供更高效方便的方式。RHINO_CONFIG_QUEUE
队列模块的开关,"0"表示关闭 / "1"表示打开。主要对应"k_queue.h"中的功能。RHINO_CONFIG_BUF_QUEUE
缓存队列模块的开关,"0"表示关闭 / "1"表示打开。主要对应"k_buf_queue.h"中的功能。RHINO_CONFIG_PWRMGMT
功耗管理模块的开关,"0"表示关闭 / "1"表示打开。用于开启低功耗功能(该功能需要厂商BSP配合OS一同完成)。RHINO_CONFIG_TIMER
timer模块的开关,"0"表示关闭 / "1"表示打开。主要对应"k_timer.h"中的功能。RHINO_CONFIG_TIMER_TASK_PRI
timer模块打开时,定时器超时回调都在内核创建的定时器任务上下文中执行。该任务优先级通过上述宏配置。
timer任务优先级与用户的回调实际工作有关,通常优先级设定的较高。RHINO_CONFIG_TIMER_TASK_STACK_SIZE
timer模块打开时,定时器超时回调都在内核创建的定时器任务上下文中执行。该任务栈大小通过上述宏配置,单位是4字节(比如宏值define成256,表示任务栈实际为1024字节大小)。
timer任务栈大小与用户的回调实际工作有关,初始可以设定大一点,运行时通过cli的tasklist命令查看,若timer任务(名称为"timer_task")栈最小空闲值较大,则可以减小该宏以节省内存。RHINO_CONFIG_SCHED_RR
任务round robin调度方式开关,"0"表示关闭 / "1"表示打开。
Rhino为实时调度内核,即高优先级任务永远优先于低优先级任务执行。而对于相同优先级的任务,则有两种调度策略:- RR,即相同优先级任务分享时间片,每个任务执行到一定时间后自动让出CPU,供下一个同优先级任务执行;
FIFO,即相同优先级任务先进入ready状态的先执行,只有本任务发生阻塞(比如sleep或者等待信号量等)后,才能轮到相同优先级下一个任务执行;
RHINO_CONFIG_SCHED_RR为0和1分别对应RR与FIFO方式。RHINO_CONFIG_TIME_SLICE_DEFAULT
当任务round robin调度方式打开时(即RHINO_CONFIG_SCHED_RR为1),每个任务的时间片可在创建时指定,若创建时填写0则为该宏的默认值。单位毫秒。RHINO_CONFIG_TICKS_PER_SECOND
配置每秒系统的tick数,比如100表示每10ms到来一个系统tick,1000表示每1ms都有个tick。
系统tick是内核计时的基础单位。超时时间(如sleep,sem_take等)与定时器控制,内部都已tick为计数基础。因此该宏值越高,表示计时精度越高,但系统处理tick中断本身的消耗也就越大。RHINO_CONFIG_SYSTEM_STATS
内核系统统计开关,"0"表示关闭 / "1"表示打开。打开后完成以下统计:- 统计全系统的 最长关中断时间、最长关任务调度时间与任务切换次数;
- 针对每个任务,统计该任务最长关中断时间与最长关任务调度时间;
针对每个任务,统计该任务执行次数、总耗时以及CPU占用率;
RHINO_CONFIG_MM_TLF
堆管理算法开关,"0"表示关闭 / "1"表示打开。打开后Rhino接管malloc, free等C库的内存管理,并提供"k_mm.h"中的功能。RHINO_CONFIG_MM_BLK
小内存块优化算法开关,"0"表示关闭 / "1"表示打开。
RHINO_CONFIG_MM_TLF打开后,Rhino使用TLF算法管理内存,该算法更加健壮但会消耗一定的内存。针对小内存快(比如小于32字节),可以通过RHINO_CONFIG_MM_BLK宏开启BLK算法优化,提高内存利用率。RHINO_CONFIG_MM_TLF_BLK_SIZE
小内存块优化空间大小,单位为字节。
RHINO_CONFIG_MM_BLK打开后,需要配置RHINO_CONFIG_MM_TLF_BLK_SIZE来决定堆中多少内存划分给BLK算法。RHINO_CONFIG_MM_DEBUG
缓存队列模块的开关,"0"表示关闭 / "1"表示打开。主要对应"k_mm_debug.h"中的功能。
打开后,当用户申请内存不足,或者rhino检测到内存越界时,都会有详细的打印。CLI中也有"dumpsys mm_info"命令可以查看详细内容。