zephyr/kernel/Kconfig

575 lines
17 KiB
Plaintext

# Kconfig - kernel configuration options
#
# Copyright (c) 2014-2015 Wind River Systems, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
menu "General Kernel Options"
config MULTITHREADING
bool
prompt "Multi-threading"
default y
help
If disabled, only the main thread is available, so a main() function
must be provided. Interrupts are available. Kernel objects will most
probably not behave as expected, especially with regards to pending,
since the main thread cannot pend, it being the only thread in the
system.
Many drivers and subsystems will not work with this option; use only
when you REALLY know what you are doing.
config NUM_COOP_PRIORITIES
int
prompt "Number of coop priorities" if MULTITHREADING
default 16
default 1 if !MULTITHREADING
range 0 128
help
Number of cooperative priorities configured in the system. Gives access
to priorities:
K_PRIO_COOP(0) to K_PRIO_COOP(CONFIG_NUM_COOP_PRIORITIES - 1)
or seen another way, priorities:
-CONFIG_NUM_COOP_PRIORITIES to -1
This can be set to zero to disable cooperative scheduling. Cooperative
threads always preempt preemptible threads.
Each priority requires an extra 8 bytes of RAM. Each set of 32 extra
total priorities require an extra 4 bytes and add one possible
iteration to loops that search for the next thread to run.
The total number of priorities is
NUM_COOP_PRIORITIES + NUM_PREEMPT_PRIORITIES + 1
The extra one is for the idle thread, which must run at the lowest
priority, and be the only thread at that priority.
config NUM_PREEMPT_PRIORITIES
int
prompt "Number of preemptible priorities" if MULTITHREADING
default 15
default 0 if !MULTITHREADING
range 0 128
help
Number of preemptible priorities available in the system. Gives access
to priorities 0 to CONFIG_NUM_PREEMPT_PRIORITIES - 1.
This can be set to 0 to disable preemptible scheduling.
Each priority requires an extra 8 bytes of RAM. Each set of 32 extra
total priorities require an extra 4 bytes and add one possible
iteration to loops that search for the next thread to run.
The total number of priorities is
NUM_COOP_PRIORITIES + NUM_PREEMPT_PRIORITIES + 1
The extra one is for the idle thread, which must run at the lowest
priority, and be the only thread at that priority.
config MAIN_THREAD_PRIORITY
int
prompt "Priority of initialization/main thread"
default 0
default -1 if NUM_PREEMPT_PRIORITIES = 0
help
Priority at which the initialization thread runs, including the start
of the main() function. main() can then change its priority if desired.
config COOP_ENABLED
bool
default y
default n if (NUM_COOP_PRIORITIES = 0)
config PREEMPT_ENABLED
bool
default y
default n if (NUM_PREEMPT_PRIORITIES = 0)
config PRIORITY_CEILING
int
prompt "Priority inheritance ceiling"
default 0
config MAIN_STACK_SIZE
int
prompt "Size of stack for initialization and main thread"
default 1024
help
When the intitialization is complete, the thread executing it then
executes the main() routine, so as to reuse the stack used by the
initialization, which would be wasted RAM otherwise.
After initialization is complete, the thread runs main().
config IDLE_STACK_SIZE
int
prompt "Size of stack for idle thread"
default 256
default 320 if ARC
help
Depending on the work that the idle task must do, most likely due to
power management but possibly to other features like system event
logging (e.g. logging when the system goes to sleep), the idle thread
may need more stack space than the default value.
config ISR_STACK_SIZE
int
prompt "ISR and initialization stack size (in bytes)"
default 2048
help
This option specifies the size of the stack used by interrupt
service routines (ISRs), and during kernel initialization.
config THREAD_CUSTOM_DATA
bool
prompt "Thread custom data"
default n
help
This option allows each thread to store 32 bits of custom data,
which can be accessed using the k_thread_custom_data_xxx() APIs.
config NUM_DYNAMIC_TIMERS
int
prompt "Number of timers available for dynamic allocation"
default 0
depends on NANO_TIMERS
help
Number of timers available for dynamic allocation via the
k_timer_alloc()/k_timer_free() API.
config TICKLESS_IDLE_SUPPORTED
bool
default n
help
To be selected by an architecture if it does support tickless idle.
config ERRNO
bool
prompt "Enable errno support"
default y
help
Enable per-thread errno in the kernel. Application and library code must
include errno.h provided by the C library (libc) to use the errno
symbol. The C library must access the per-thread errno via the
_get_errno() symbol.
menu "Kernel Debugging and Metrics"
config KERNEL_DEBUG
bool
prompt "Kernel debugging"
default n
select INIT_STACKS
help
Enable kernel debugging.
Note that debugging the kernel internals can be very verbose.
config BOOT_BANNER
bool
prompt "Boot banner"
default n
depends on CONSOLE_HAS_DRIVER
select PRINTK
select EARLY_CONSOLE
help
This option outputs a banner to the console device during boot up. It
also embeds a date & time stamp in the kernel and in each USAP image.
config BUILD_TIMESTAMP
bool
prompt "Build Timestamp"
help
Build timestamp and add it to the boot banner.
config INT_LATENCY_BENCHMARK
bool
prompt "Interrupt latency metrics [EXPERIMENTAL]"
default n
depends on ARCH="x86"
help
This option enables the tracking of interrupt latency metrics;
the exact set of metrics being tracked is board-dependent.
Tracking begins when int_latency_init() is invoked by an application.
The metrics are displayed (and a new sampling interval is started)
each time int_latency_show() is called thereafter.
config THREAD_MONITOR
bool
prompt "Thread monitoring [EXPERIMENTAL]"
default n
help
This option instructs the kernel to maintain a list of all threads
(excluding those that have not yet started or have already
terminated).
endmenu
menu "Work Queue Options"
config SYSTEM_WORKQUEUE_STACK_SIZE
int "System workqueue stack size"
default 1024
config SYSTEM_WORKQUEUE_PRIORITY
int "System workqueue priority"
default -1
config OFFLOAD_WORKQUEUE_STACK_SIZE
int "Workqueue stack size for thread offload requests"
default 1024
config OFFLOAD_WORKQUEUE_PRIORITY
int "Offload requests workqueue priority"
default -1
endmenu
menu "Atomic Operations"
config ATOMIC_OPERATIONS_BUILTIN
bool
help
Use the compiler builtin functions for atomic operations. This is
the preferred method. However, support for all arches in GCC is
incomplete.
config ATOMIC_OPERATIONS_CUSTOM
bool
help
Use when there isn't support for compiler built-ins, but you have
written optimized assembly code under arch/ which implements these.
config ATOMIC_OPERATIONS_C
bool
help
Use atomic operations routines that are implemented entirely
in C by locking interrupts. Selected by architectures which either
do not have support for atomic operations in their instruction
set, or haven't been implemented yet during bring-up, and also
the compiler does not have support for the atomic __sync_* builtins.
endmenu
menu "Timer API Options"
config TIMESLICING
bool "Thread time slicing"
default y
depends on SYS_CLOCK_EXISTS && (NUM_PREEMPT_PRIORITIES != 0)
help
This option enables time slicing between preemptible threads of
equal priority.
config TIMESLICE_SIZE
int "Time slice size (in ms)"
default 0
range 0 2147483647
depends on TIMESLICING
help
This option specifies the maximum amount of time a thread can execute
before other threads of equal priority are given an opportunity to run.
A time slice size of zero means "no limit" (i.e. an infinitely large
time slice).
config TIMESLICE_PRIORITY
int "Time slicing thread priority ceiling"
default 0
range 0 NUM_PREEMPT_PRIORITIES
depends on TIMESLICING
help
This option specifies the thread priority level at which time slicing
takes effect; threads having a higher priority than this ceiling are
not subject to time slicing.
endmenu
menu "Other Kernel Object Options"
config SEMAPHORE_GROUPS
bool "Enable semaphore groups"
default y if LEGACY_KERNEL
help
This option enables support for semaphore groups. Threads that use
semaphore groups require more stack space. Disabling this option will
both decrease the footprint as well as improve the performance of
the k_sem_give() routine.
config NUM_MBOX_ASYNC_MSGS
int "Maximum number of in-flight asynchronous mailbox messages"
default 10
help
This option specifies the total number of asynchronous mailbox
messages that can exist simultaneously, across all mailboxes
in the system.
Setting this option to 0 disables support for asynchronous
mailbox messages.
config NUM_PIPE_ASYNC_MSGS
int "Maximum number of in-flight asynchronous pipe messages"
default 10
help
This option specifies the total number of asynchronous pipe
messages that can exist simultaneously, across all pipes in
the system.
Setting this option to 0 disables support for asynchronous
pipe messages.
endmenu
menu "Memory Pool Options"
choice
prompt "Memory pool block allocation policy"
default MEM_POOL_SPLIT_BEFORE_DEFRAG
help
This option specifies how a memory pool reacts if an unused memory
block of the required size is not available.
config MEM_POOL_SPLIT_BEFORE_DEFRAG
bool "Split a larger block before merging smaller blocks"
help
This option instructs a memory pool to try splitting a larger unused
block if an unused block of the required size is not available; only
if no such blocks exist will the memory pool try merging smaller unused
blocks. This policy attempts to limit the cost of performing automatic
partial defragmention of the memory pool, at the cost of fragmenting
the memory pool's larger blocks.
config MEM_POOL_DEFRAG_BEFORE_SPLIT
bool "Merge smaller blocks before splitting a larger block"
help
This option instructs a memory pool to try merging smaller unused
blocks if an unused block of the required size is not available; only
if this does not generate a sufficiently large block will the memory
pool try splitting a larger unused block. This policy attempts to
preserve the memory pool's larger blocks, at the cost of performing
automatic partial defragmentations more frequently.
config MEM_POOL_SPLIT_ONLY
bool "Split a larger block, but never merge smaller blocks"
help
This option instructs a memory pool to try splitting a larger unused
block if an unused block of the required size is not available; if no
such blocks exist the block allocation operation fails. This policy
attempts to limit the cost of defragmenting the memory pool by avoiding
automatic partial defragmentation, at the cost of requiring the
application to explicitly request a full defragmentation of the memory
pool when an allocation fails. Depending on how a memory pool is used,
it may be more efficient for a memory pool to perform an occasional
full defragmentation than to perform frequent partial defragmentations.
endchoice
config HEAP_MEM_POOL_SIZE
int
prompt "Heap memory pool size (in bytes)"
default 0
help
This option specifies the size of the heap memory pool used when
dynamically allocating memory using k_malloc(). Supported values
are: 256, 1024, 4096, and 16384. A size of zero means that no
heap memory pool is defined.
endmenu
config ARCH_HAS_CUSTOM_SWAP_TO_MAIN
bool
# hidden
default n
help
It's possible that an architecture port cannot use _Swap() to swap to
the _main() thread, but instead must do something custom. It must
enable this option in that case.
config SYS_CLOCK_TICKS_PER_SEC
int
prompt "System tick frequency (in ticks/second)"
default 100
help
This option specifies the frequency of the system clock in Hz.
Depending on the choice made, an amount of possibly expensive math must
occur when converting ticks to milliseconds and vice-versa. Some values
are optimized, and yield significantly less math.
The optimal values from a computational point-of-view are 1000, 500,
250 and 125, since in these cases there is either no computation
required, or it is all done via bit-shifting. These also give a
granularity from 1ms to 8ms.
Other good values are 100, 50, 25, 20 and 10. In this case, some math
is required but is minimized. These are also values that necessitate a
reduced number of clock interrupts per second, at the cost of
granularity (10ms to 100ms).
All other values require some extensive 64-bit math, and in some
configurations even require calls to compiler built-in functions, and
can require a non-trivial extra amount of stack space (e.g. around 80
bytes on x86).
Using the legacy API also incurs an extra penalty, since when asking
for a timeout, a translation is made from ticks to milliseconds to call
the native kernel APIs, and then another translation is made back to
ticks, since the kernel is tick-based.
config SYS_CLOCK_HW_CYCLES_PER_SEC
int "System clock's h/w timer frequency"
help
This option specifies the frequency of the hardware timer used for the
system clock (in Hz). This option is set by the board's Kconfig file
and the user should generally avoid modifying it via the menu configuration.
config SYS_CLOCK_EXISTS
bool
# omit prompt to signify a "hidden" option
default y
default n if (SYS_CLOCK_TICKS_PER_SEC = 0)
help
This option specifies that the kernel lacks timer support.
config INIT_STACKS
bool
prompt "Initialize stack areas"
default n
help
This option instructs the kernel to initialize stack areas with a
known value (0xaa) before they are first used, so that the high
water mark can be easily determined. This applies to the stack areas
for threads.
config XIP
bool
prompt "Execute in place"
help
This option allows the kernel to operate with its text and read-only
sections residing in ROM (or similar read-only memory). Not all boards
support this option so it must be used with care; you must also
supply a linker command file when building your image. Enabling this
option increases both the code and data footprint of the image.
config RING_BUFFER
bool
prompt "Enable ring buffers"
default n
help
Enable usage of ring buffers. This is similar to kernel FIFOs but ring
buffers manage their own buffer memory and can store arbitrary data.
For optimal performance, use buffer sizes that are a power of 2.
menu "Initialization Priorities"
config KERNEL_INIT_PRIORITY_OBJECTS
int
prompt "Kernel objects initialization priority"
default 30
help
Kernel objects use this priority for initialization. This
priority needs to be higher than minimal default initialization
priority.
config KERNEL_INIT_PRIORITY_DEFAULT
int
prompt "Default init priority"
default 40
help
Defaut minimal init priority for each init level.
config KERNEL_INIT_PRIORITY_DEVICE
int
prompt "Default init priority for device drivers"
default 50
help
Device driver, that depends on common components, such as
interrupt controller, but does not depend on other devices,
uses this init priority.
config APPLICATION_INIT_PRIORITY
int
prompt "Default init priority for application level drivers"
default 90
help
This priority level is for end-user drivers such as sensors and display
which have no inward dependencies.
endmenu
menu "Security Options"
config STACK_CANARIES
bool
prompt "Compiler stack canaries"
default n
help
This option enables compiler stack canaries support kernel functions.
If stack canaries are supported by the compiler, it will emit
extra code that inserts a canary value into the stack frame when
a function is entered and validates this value upon exit.
Stack corruption (such as that caused by buffer overflow) results
in a fatal error condition for the running entity.
Enabling this option can result in a significant increase
in footprint and an associated decrease in performance.
If stack canaries are not supported by the compiler, enabling this
option has no effect.
endmenu
menu "Legacy Kernel Options"
config LEGACY_KERNEL
bool "Legacy Kernel Options"
default y
help
Enable legacy kernel features.
config MDEF
bool
prompt "Use MDEF files for statically configured kernel objects"
default y if LEGACY_KERNEL
help
Using an MDEF file can help the startup time of the application since
the objects it lists are statically allocated and initialized, and may
also reduce code size if no subsystem uses the initialization routines.
Disabling this option can reduce the compilation time slightly.
In doubt, select 'y'.
config NANO_TIMEOUTS
bool
default y if LEGACY_KERNEL
depends on SYS_CLOCK_EXISTS
help
Only here for common (ie. non-unified kernel) code that rely on this.
Unified kernel uses SYS_CLOCK_EXISTS everywhere instead.
config NANO_TIMERS
bool
default y if LEGACY_KERNEL
depends on SYS_CLOCK_EXISTS
help
Only here for common (ie. non-unified kernel) code that rely on this.
Unified kernel uses SYS_CLOCK_EXISTS everywhere instead.
endmenu
source "kernel/Kconfig.event_logger"
source "kernel/Kconfig.power_mgmt"
endmenu