summaryrefslogtreecommitdiff
path: root/kernel/Kconfig
blob: d987f335d439364f1d0923ab23efb5fb3631a9fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
# 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
	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