每一个AliOS-Things支持的单板,都配套有一个”k_config.h“,用于设定本单板环境下特定的内核Rhino配置。

config体系概述

AliOS-Things的内核(Rhino)可以通过宏进行功能配置。完整的配置宏可以在k_default_config.h文件中看到,里面的宏可分为两类——开关类与数值设置类。开关类负责打开或关闭一个内核模块,数值设置用于设定一些参数。k_default_config.h文件位于Rhino内核代码中(文件路径:./kernel/rhino/include/k_default_config.h),其对每个可配置宏都进行了默认值的设置。

k_config.h文件中的宏配置值通常与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"
因此,单板特定的宏设置优先于默认设置,以信号量功能开关为例,可以在以下代码中看出最终RHINO_CONFIG_SEM生效值为1,即信号量功能打开。
//"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
说明 对于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字节(例如宏值默认设定为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_RR01分别对应RR与FIFO方式。

RHINO_CONFIG_TIME_SLICE_DEFAULT 当任务round robin调度方式打开时(即RHINO_CONFIG_SCHED_RR1),每个任务的时间片可在创建时指定,若创建时填写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命令可以查看详细内容。