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为实时调度内核,即高优先级任务永远优先于低优先级任务执行。而对于相同优先级的任务,则有两种调度策略:

  1. RR,即相同优先级任务分享时间片,每个任务执行到一定时间后自动让出CPU,供下一个同优先级任务执行;
  2. 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"表示打开。打开后完成以下统计:

  1. 统计全系统的 最长关中断时间、最长关任务调度时间与任务切换次数;
  2. 针对每个任务,统计该任务最长关中断时间与最长关任务调度时间;
  3. 针对每个任务,统计该任务执行次数、总耗时以及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"命令可以查看详细内容。