You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
LiteOS-Reading/src/kernel/include/los_config.h

369 lines
17 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/* ----------------------------------------------------------------------------
* Copyright (c) Huawei Technologies Co., Ltd. 2013-2021. All rights reserved.
* Description: System Config HeadFile
* Author: Huawei LiteOS Team
* Create: 2013-01-01
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */
/**
* @defgroup los_config System configuration items
* @ingroup kernel
*/
/*具体而言los_config.h 文件通常包含以下内容:
任务Task配置可以定义任务的数量、优先级范围、堆栈大小等参数以满足不同应用场景的需求。
中断Interrupt配置可以定义中断服务例程的数量、优先级范围以及中断处理的策略等。
内存管理Memory Management配置可以定义动态内存分配算法、内存池的大小和数量等相关参数。
定时器Timer配置可以定义定时器的数量、精度、触发方式等。
任务调度Task Scheduling配置可以配置任务调度算法、时间片轮转的时间等。
系统时钟System Clock配置可以定义系统时钟的频率、定时器的输入时钟源等。
通过修改 los_config.h 文件中的宏定义和全局变量,开发人员可以根据应用需求对操作系统进行定制和优化。
然后,将修改后的 los_config.h 文件编译进入 LiteOS 内核,即可实现对操作系统行为和功能的定制化配置。*/
#ifndef _LOS_CONFIG_H
#define _LOS_CONFIG_H
#include "los_typedef.h"
#include "asm/memmap_config.h"
#include "hisoc/clock.h"
#include "asm/platform.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
#ifdef LOSCFG_LIB_CONFIGURABLE//判断宏定义 LOSCFG_LIB_CONFIGURABLE 是否被定义。如果该宏被定义,那么以下变量声明将会被编译进程序中。
extern UINT32 g_osSysClock;//系统时钟频率
extern UINT32 g_tickPerSecond;//系统时钟滴答数
extern UINT32 g_taskLimit;//最大任务数量
extern UINT32 g_taskMinStkSize;//任务最小堆栈大小
extern UINT32 g_taskIdleStkSize;//空闲任务堆栈大小
extern UINT32 g_taskDfltStkSize;//默认任务堆栈大小
extern UINT32 g_taskSwtmrStkSize;//软件定时器任务堆栈大小
extern UINT32 g_swtmrLimit;//最大软件定时器数量
extern UINT32 g_semLimit;//最大信号量数量
extern UINT32 g_muxLimit;//最大互斥量数量
extern UINT32 g_queueLimit;//最大队列数量
extern UINT32 g_timeSliceTimeOut;//时间片轮转的时间
extern BOOL g_nxEnabled;//是否启用内存保护机制
extern UINTPTR g_dlNxHeapBase;//内存保护机制的起始地址
extern UINT32 g_dlNxHeapSize;//内存保护机制的大小
#define LOS_GET_NX_CFG() (g_nxEnabled)//宏用于获取一个名为g_nxEnabled的变量的值。
#define LOS_SET_NX_CFG(value) (g_nxEnabled = (value))//宏用于设置一个名为g_nxEnabled的变量的值。
#define LOS_GET_DL_NX_HEAP_BASE() (g_dlNxHeapBase)//宏用于获取一个名为g_dlNxHeapBase的变量的值。
#define LOS_SET_DL_NX_HEAP_BASE(addr) (g_dlNxHeapBase = (addr))//宏用于设置一个名为g_dlNxHeapBase的变量的值。
#define LOS_GET_DL_NX_HEAP_SIZE() (g_dlNxHeapSize)//宏用于获取一个名为g_dlNxHeapSize的变量的值。
#define LOS_SET_DL_NX_HEAP_SIZE(size) (g_dlNxHeapSize = (size))//宏用于设置一个名为g_dlNxHeapSize的变量的值。
#define OS_SYS_CLOCK g_osSysClock//定义系统时间频率
#define KERNEL_TICK_PER_SECOND g_tickPerSecond//定义系统时针滴答数
#define KERNEL_TSK_LIMIT g_taskLimit//定义最大任务数量
#define KERNEL_TSK_MIN_STACK_SIZE g_taskMinStkSize//定义任务最小堆栈大小
#define KERNEL_TSK_DEFAULT_STACK_SIZE g_taskDfltStkSize//定义默认任务堆栈大小
#define KERNEL_TSK_IDLE_STACK_SIZE g_taskIdleStkSize//定义默认任务堆栈大小
#define KERNEL_TSK_SWTMR_STACK_SIZE g_taskSwtmrStkSize//定义软件定时器任务堆栈大小
#define KERNEL_SWTMR_LIMIT g_swtmrLimit//定义最大软件定时器数量
#define KERNEL_SEM_LIMIT g_semLimit//定义最大信号量数量
#define KERNEL_MUX_LIMIT g_muxLimit//定义最大互斥量数量
#define KERNEL_QUEUE_LIMIT g_queueLimit//定义最大对列数量
#define KERNEL_TIMESLICE_TIMEOUT g_timeSliceTimeOut//定义时间片轮转的时间
#else /* LOSCFG_LIB_CONFIGURABLE */
#ifdef LOSCFG_KERNEL_NX
#define LOS_GET_NX_CFG() true//获取内存保护机制是否开启的配置值,当 LOSCFG_KERNEL_NX 宏被定义时,返回 true否则返回 false。
#define LOS_SET_NX_CFG(value)//设置内存保护机制的配置值,该宏定义为空白,没有实际操作。
#define LOS_GET_DL_NX_HEAP_BASE() LOS_DL_HEAP_BASE//获取内存保护机制的起始地址,当 LOSCFG_KERNEL_NX 宏被定义时,返回 LOS_DL_HEAP_BASE否则返回 NULL。
#define LOS_SET_DL_NX_HEAP_BASE(addr)//设置内存保护机制的起始地址,该宏定义为空白,没有实际操作。
#define LOS_GET_DL_NX_HEAP_SIZE() LOS_DL_HEAP_SIZE//获取内存保护机制的大小,当 LOSCFG_KERNEL_NX 宏被定义时,返回 LOS_DL_HEAP_SIZE否则返回 0。
#define LOS_SET_DL_NX_HEAP_SIZE(size)//设置内存保护机制的大小,该宏定义为空白,没有实际操作。
#else /* LOSCFG_KERNEL_NX */
#define LOS_GET_NX_CFG() false
#define LOS_SET_NX_CFG(value)
#define LOS_GET_DL_NX_HEAP_BASE() NULL
#define LOS_SET_DL_NX_HEAP_BASE(addr)
#define LOS_GET_DL_NX_HEAP_SIZE() 0
#define LOS_SET_DL_NX_HEAP_SIZE(size)
#endif /* LOSCFG_KERNEL_NX */
//这段代码是一系列宏定义,用于将一些配置参数映射到对应的宏定义。
//这样做的目的是将配置参数与代码解耦,使得修改配置参数时只需要修改相应的宏定义,而无需修改引用该参数的代码。这样可以提高代码的可维护性和可移植性。
#define KERNEL_TICK_PER_SECOND LOSCFG_BASE_CORE_TICK_PER_SECOND//如KERNEL_TICK_PER_SECOND宏定义为LOSCFG_BASE_CORE_TICK_PER_SECOND意味着在代码中使用KERNEL_TICK_PER_SECOND时实际上是使用了配置参数
#define KERNEL_TSK_LIMIT LOSCFG_BASE_CORE_TSK_LIMIT
#define KERNEL_TSK_MIN_STACK_SIZE LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE
#define KERNEL_TSK_DEFAULT_STACK_SIZE LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE
#define KERNEL_TSK_IDLE_STACK_SIZE LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE
#define KERNEL_TSK_SWTMR_STACK_SIZE LOSCFG_BASE_CORE_TSK_SWTMR_STACK_SIZE
#define KERNEL_SWTMR_LIMIT LOSCFG_BASE_CORE_SWTMR_LIMIT
#define KERNEL_SEM_LIMIT LOSCFG_BASE_IPC_SEM_LIMIT
#define KERNEL_MUX_LIMIT LOSCFG_BASE_IPC_MUX_LIMIT
#define KERNEL_QUEUE_LIMIT LOSCFG_BASE_IPC_QUEUE_LIMIT
#define KERNEL_TIMESLICE_TIMEOUT LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT
//最后的#endif /* LOSCFG_LIB_CONFIGURABLE */表示这组宏定义的结束在条件LOSCFG_LIB_CONFIGURABLE不成立时这组宏定义不起作用因为它们是在这个条件下定义的。
#endif /* LOSCFG_LIB_CONFIGURABLE */
/**
* system sections start and end address
*/
extern CHAR __int_stack_start;//内部栈的起始地址
extern CHAR __int_stack_end;//内部栈的结束地址
extern CHAR __rodata_start;//只读数据段的起始地址。
extern CHAR __rodata_end;//只读数据段的结束地址。
extern CHAR __bss_start;//未初始化的全局变量段BSS Segment的起始地址。
extern CHAR __bss_end;//未初始化的全局变量段BSS Segment的结束地址。
extern CHAR __text_start;//可执行代码段Text Segment的起始地址。
extern CHAR __text_end;//可执行代码段Text Segment的结束地址。
extern CHAR __ram_data_start;//RAM 数据段的起始地址。
extern CHAR __ram_data_end;//RAM 数据段的结束地址。
extern CHAR __exc_heap_start;//异常堆Exception Heap的起始地址。
extern CHAR __exc_heap_end;//异常堆Exception Heap的结束地址。
extern CHAR __heap_start;//堆Heap的起始地址。
extern CHAR __init_array_start__;//初始化数组的起始地址。
extern CHAR __init_array_end__; //初始化数组的结束地址。
/****************************** System clock module configuration ****************************/
/**
* @ingroup los_config
* System clock (unit: HZ)
*/
#ifndef OS_SYS_CLOCK
#define OS_SYS_CLOCK (get_bus_clk())//定义系统时钟频率默认值为get_bus_clk()
#endif
/**
* @ingroup los_config
* time timer clock (unit: HZ)
*/
#ifndef OS_TIME_TIMER_CLOCK
#define OS_TIME_TIMER_CLOCK OS_SYS_CLOCK//定义定时器时钟频率,默认值为 OS_SYS_CLOCK
#endif
/**
* limit addr range when search for 'func local(frame pointer)' or 'func name'
*/
#ifndef OS_SYS_FUNC_ADDR_START
#define OS_SYS_FUNC_ADDR_START ((UINTPTR)&__int_stack_start)//定义函数起始地址,默认值为&__int_stack_start
#endif
#ifndef OS_SYS_FUNC_ADDR_END
#define OS_SYS_FUNC_ADDR_END g_sys_mem_addr_end//定义函数终止地址默认值为g_sys_mem_addr_end
#endif
/**
* @ingroup los_config
* Microseconds of adjtime in one second
*/
#ifndef LOSCFG_BASE_CORE_ADJ_PER_SECOND
#define LOSCFG_BASE_CORE_ADJ_PER_SECOND 500//每秒钟的微调时间。如果没有定义过LOSCFG_BASE_CORE_ADJ_PER_SECOND则将其定义为500。这意味着系统在进行时间微调时每秒钟可以微调500微秒。
#endif
/**
* @ingroup los_config
* Sched clck interval
*/
#define SCHED_CLOCK_INTETRVAL_TICKS 100//表示调度时钟的间隔。这个宏定义的值为100表示调度时钟的间隔为100个时钟节拍。
/****************************** Interrupt module configuration ****************************/
/**
* @ingroup los_hwi
* The macro is the binary point value that decides the maximum preemption level
* when LOSCFG_ARCH_INTERRUPT_PREEMPTION is defined. If preemption supported, the
* config value is [0, 1, 2, 3, 4, 5, 6], to the corresponding preemption level value
* is [128, 64, 32, 16, 8, 4, 2].
*/
#ifdef LOSCFG_ARCH_INTERRUPT_PREEMPTION
#ifndef MAX_BINARY_POINT_VALUE
#define MAX_BINARY_POINT_VALUE 4//使用条件编译来检查是否已经定义了MAX_BINARY_POINT_VALUE宏。如果没有定义则将其定义为4。
#endif
#endif
/****************************** Swtmr module configuration ********************************/
#ifdef LOSCFG_BASE_IPC_QUEUE
/**
* @ingroup los_swtmr
* Max number of software timers ID
*
* 0xFFFF: max number of all software timers
*/
#ifndef OS_SWTMR_MAX_TIMERID
/*表示软件定时器ID的最大数量。
默认值为((0xFFFF / KERNEL_SWTMR_LIMIT) * KERNEL_SWTMR_LIMIT)
其中KERNEL_SWTMR_LIMIT表示系统中每个任务可以创建的最大软件定时器数。
这个宏定义的作用是将可用的ID数量限制在一个整数倍的软件定时器数范围内
这样可以更好地利用ID资源。*/
#define OS_SWTMR_MAX_TIMERID ((0xFFFF / KERNEL_SWTMR_LIMIT) * KERNEL_SWTMR_LIMIT)
#endif
/**
* @ingroup los_swtmr
* Maximum size of a software timer queue. The default value of LOSCFG_BASE_CORE_SWTMR_LIMIT is 16.
*/
#ifndef OS_SWTMR_HANDLE_QUEUE_SIZE
/*示软件定时器队列的最大大小。
默认值为KERNEL_SWTMR_LIMIT
也就是系统中每个任务可以同时管理的软件定时器数。
这个宏定义的作用是限制任务能够管理的软件定时器数量,
以避免资源浪费和性能问题。*/
#define OS_SWTMR_HANDLE_QUEUE_SIZE KERNEL_SWTMR_LIMIT
#endif
#endif
/****************************** Memory module configuration **************************/
/**
* @ingroup los_memory
* Starting address of the system memory
*/
#ifndef OS_SYS_MEM_ADDR
/*__heap_start是在链接脚本中定义的符号
表示内存池的起始地址。
因此OS_SYS_MEM_ADDR的值就是内存池的起始地址的指针
可以通过该宏来访问系统内存池。*/
#define OS_SYS_MEM_ADDR (&__heap_start)
#endif
/**
* @ingroup los_dynload
* Size of Dynload heap in bytes (1MB = 0x100000 Bytes)
* Starting address of dynload heap
*/
#if defined (LOSCFG_KERNEL_NX) && defined (LOSCFG_KERNEL_DYNLOAD)
//如果这两个宏都被定义了,那么将动态加载模块堆的大小定义为
#define LOS_DL_HEAP_SIZE (LOSCFG_KERNLE_DYN_HEAPSIZE * 0x100000)//(LOSCFG_KERNLE_DYN_HEAPSIZE * 0x100000)
#define LOS_DL_HEAP_BASE (SYS_MEM_END - LOS_DL_HEAP_SIZE)//SYS_MEM_END - LOS_DL_HEAP_SIZE其中SYS_MEM_END表示系统内存池的结束地址
#else
//如果没有定义LOSCFG_KERNEL_NX和LOSCFG_KERNEL_DYNLOAD宏则将动态加载模块堆的大小和起始地址都定义为0。
#define LOS_DL_HEAP_SIZE 0
#define LOS_DL_HEAP_BASE 0
#endif
/**
* @ingroup los_memory
* Memory size
*/
#ifndef OS_SYS_MEM_SIZE
#define OS_SYS_MEM_SIZE ((g_sys_mem_addr_end) - \
((LOS_DL_HEAP_SIZE + ((UINTPTR)&__heap_start) + (64 - 1)) & ~(64 - 1)))//定义内存池的大小
#endif
/****************************** fw Interface configuration **************************/
/**
* @ingroup los_config
* The core number is one in non-SMP architecture.
*/
#ifdef LOSCFG_KERNEL_SMP
//LOSCFG_KERNEL_CORE_NUM 将被设置为 LOSCFG_KERNEL_SMP_CORE_NUM 的值否则LOSCFG_KERNEL_CORE_NUM 将被设置为 1。
#define LOSCFG_KERNEL_CORE_NUM LOSCFG_KERNEL_SMP_CORE_NUM
#else
#define LOSCFG_KERNEL_CORE_NUM 1
#endif
//LOSCFG_KERNEL_CPU_MASK 被定义为用于表示 CPU 核心掩码的表达式。它使用了位运算,通过将 1 左移 LOSCFG_KERNEL_CORE_NUM 位,然后减去 1来生成一个包含 LOSCFG_KERNEL_CORE_NUM 个 1 的二进制数。这个数字通常用于设置 CPU 亲和性,以确定线程可以运行在哪些 CPU 核心上。
#define LOSCFG_KERNEL_CPU_MASK ((1 << LOSCFG_KERNEL_CORE_NUM) - 1)
/****************************** trace module configuration **************************/
/**
* @ingroup los_trace
* It's the total size of trace buffer. Its unit is char.
*/
#ifdef LOSCFG_KERNEL_TRACE
#ifdef LOSCFG_RECORDER_MODE_OFFLINE
/*LOSCFG_KERNEL_TRACE 被定义的情况下,该代码块会被编译。
如果同时定义了 LOSCFG_RECORDER_MODE_OFFLINE
则 LOSTRACE_BUFFER_SIZE 会被设置为 LOSCFG_TRACE_BUFFER_SIZE 的值;
否则LOSTRACE_BUFFER_SIZE 会被设置为 0。*/
#define LOS_TRACE_BUFFER_SIZE LOSCFG_TRACE_BUFFER_SIZE
#else
#define LOS_TRACE_BUFFER_SIZE 0
#endif
#endif
/****************************** perf module configuration **************************/
/**
* @ingroup los_perf
* It's the total size of perf buffer. It's in the unit of char
*/
#ifdef LOSCFG_KERNEL_PERF
#define LOS_PERF_BUFFER_SIZE 2048
#endif
/**
* Version number
*/
//这段代码是一组宏定义,用于定义操作系统的版本号和系统名称。
#define _T(x) x//宏定义将传入的参数 x 原样返回,用于在宏定义中表示字符串。
#define HW_LITEOS_SYSNAME "Huawei LiteOS"//宏定义为字符串 "Huawei LiteOS",表示操作系统的名称。
#define HW_LITEOS_SEP " "//宏定义为字符串 " ",表示名称和版本号之间的分隔符。
#define _V(v) _T(HW_LITEOS_SYSNAME)_T(HW_LITEOS_SEP)_T(v)//宏定义通过将操作系统名称和版本号连接起来,生成一个完整的版本字符串。
#define HW_LITEOS_VERSION "V200R005C20B053"//宏定义为字符串 "V200R005C20B053",表示操作系统的具体版本号。
#define HW_LITEOS_VER _V(HW_LITEOS_VERSION"-SMP")//宏定义使用了 _V 宏,将操作系统名称和版本号连接起来,形成类似 "Huawei LiteOS V200R005C20B053-SMP" 的完整版本号字符串。
/**
* The Version number of Public
*/
#define MAJ_V 5//宏定义为整数 5表示操作系统的主要版本号。
#define MIN_V 1//宏定义为整数 1表示操作系统的次要版本号。
#define REL_V 0//宏定义为整数 0表示操作系统的发布版本号。
/**
* The release candidate version number
*/
//这些宏定义和函数声明用于管理操作系统的版本号,并提供了一种将版本号转换为字符串格式的机制。
#define EXTRA_V 0//宏定义为整数 0表示操作系统的额外版本号或候选版本号。
#define VERSION_NUM(a, b, c) (((a) << 16) | ((b) << 8) | (c))//宏定义将主版本号 a、次版本号 b 和发布版本号 c 组合成一个无符号整数,通过位运算实现。
#define HW_LITEOS_OPEN_VERSION_NUM VERSION_NUM(MAJ_V, MIN_V, REL_V)// 宏定义使用了 VERSION_NUM 宏,将主版本号、次版本号和发布版本号组成一个表示版本号的无符号整数。
#define STRINGIFY_1(x) #x//宏定义将参数 x 转换为字符串。
#define STRINGIFY(x) STRINGIFY_1(x)//宏定义调用 STRINGIFY_1 宏,将参数转换为字符串。
#define HW_LITEOS_OPEN_VERSION_STRING STRINGIFY(MAJ_V) "." STRINGIFY(MIN_V) "." STRINGIFY(REL_V)//宏定义使用了 STRINGIFY 宏,将主版本号、次版本号和发布版本号转换为形如 "5.1.0" 的字符串格式。
#if (EXTRA_V != 0)
/*不等于 0则 HW_LITEOS_KERNEL_VERSION_STRING 宏定义为带有候选版本号的版本字符串;
否则,它被定义为不带候选版本号的版本字符串。*/
#define HW_LITEOS_KERNEL_VERSION_STRING HW_LITEOS_OPEN_VERSION_STRING "-rc" STRINGIFY(EXTRA_V)
#else
#define HW_LITEOS_KERNEL_VERSION_STRING HW_LITEOS_OPEN_VERSION_STRING
#endif
//不等于 0则 HW_LITEOS_KERNEL_VERSION_STRING 宏定义为带有候选版本号的版本字符串;否则,它被定义为不带候选版本号的版本字符串。
extern VOID OsStart(VOID);
extern UINT32 OsMain(VOID);
extern VOID *OsGetMainTask(VOID);
extern VOID OsSetMainTask(VOID);
#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */
#endif /* _LOS_CONFIG_H */