12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772 |
- #
- # For a description of the syntax of this configuration file,
- # see the file kconfig-language.txt in the NuttX tools repository.
- #
- menuconfig DISABLE_OS_API
- bool "Disable NuttX interfaces"
- default y
- ---help---
- The following can be used to disable categories of
- APIs supported by the OS. If the compiler supports
- weak functions, then it should not be necessary to
- disable functions unless you want to restrict usage
- of those APIs.
- There are certain dependency relationships in these
- features.
- 1) mq_notify logic depends on signals to awaken tasks
- waiting for queues to become full or empty.
- 2) pthread_condtimedwait() depends on signals to wake
- up waiting tasks.
- if DISABLE_OS_API
- config DISABLE_POSIX_TIMERS
- bool "Disable POSIX timers"
- default y if DEFAULT_SMALL
- default n if !DEFAULT_SMALL
- ---help---
- Disable support for the the entire POSIX timer family
- including timer_create(), timer_gettime(), timer_settime(),
- etc.
- NOTE: This option will also disable getitimer() and
- setitimer() which are not, strictly speaking, POSIX timers.
- config DISABLE_PTHREAD
- bool "Disable pthread support"
- default n
- config DISABLE_MQUEUE
- bool "Disable POSIX message queue support"
- default n
- config DISABLE_ENVIRON
- bool "Disable environment variable support"
- default y if DEFAULT_SMALL
- default n if !DEFAULT_SMALL
- endif # DISABLE_OS_API
- menu "Clocks and Timers"
- config ARCH_HAVE_TICKLESS
- bool
- config SCHED_TICKLESS
- bool "Support tick-less OS"
- default n
- depends on ARCH_HAVE_TICKLESS
- ---help---
- By default, system time is driven by a periodic timer interrupt. An
- alternative configurations is a tick-less configuration in which
- there is no periodic timer interrupt. Instead and interval timer is
- used to schedule the next OS time event. This option selects that
- tick-less OS option. If the tick-less OS is selected, then there are
- additional platform specific interfaces that must be provided as
- defined include/nuttx/arch.h
- if SCHED_TICKLESS
- config SCHED_TICKLESS_ALARM
- bool "Tickless alarm"
- default n
- ---help---
- The tickless option can be supported either via a simple interval
- timer (plus elapsed time) or via an alarm. The interval timer allows
- programming events to occur after an interval. With the alarm,
- you can set a time in the future and get an event when that alarm
- goes off. This option selects the use of an alarm.
- The advantage of an alarm is that it avoids some small timing
- errors; the advantage of the use of the interval timer is that
- the hardware requirement may be less.
- config SCHED_TICKLESS_LIMIT_MAX_SLEEP
- bool "Max sleep period (in microseconds)"
- default n
- ---help---
- Enables use of the g_oneshot_maxticks variable. This variable is
- initialized by platform-specific logic at runtime to the maximum
- delay that the timer can wait (in configured clock ticks). The
- RTOS tickless logic will then limit all requested delays to this
- value.
- endif
- config USEC_PER_TICK
- int "System timer tick period (microseconds)"
- default 10000 if !SCHED_TICKLESS
- default 100 if SCHED_TICKLESS
- ---help---
- In the "normal" configuration where system time is provided by a
- periodic timer interrupt, the default system timer is expected to
- run at 100Hz or USEC_PER_TICK=10000. This setting must be defined
- to inform of NuttX the interval that the processor hardware is
- providing system timer interrupts to the OS.
- If SCHED_TICKLESS is selected, then there are no system timer
- interrupts. In this case, USEC_PER_TICK does not control any timer
- rates. Rather, it only determines the resolution of time reported
- by clock_systime_ticks() and the resolution of times that can be set for
- certain delays including watchdog timers and delayed work. In this
- case there is a trade-off: It is better to have the USEC_PER_TICK as
- low as possible for higher timing resolution. However, the time
- is currently held in 'unsigned int' on some systems, this may be
- 16-bits but on most contemporary systems it will be 32-bits. In
- either case, smaller values of USEC_PER_TICK will reduce the range
- of values that delays that can be represented. So the trade-off is
- between range and resolution (you could also modify the code to use
- a 64-bit value if you really want both).
- The default, 100 microseconds, will provide for a range of delays
- up to 120 hours.
- This value should never be less than the underlying resolution of
- the timer. Error may ensue.
- if !SCHED_TICKLESS
- config SYSTEMTICK_EXTCLK
- bool "Use external clock"
- default n
- depends on ARCH_HAVE_EXTCLK
- ---help---
- Use external clock for system tick. When enabled, the platform-specific
- logic must start its own timer interrupt to make periodic calls to the
- nxsched_process_timer() or the functions called within. The purpose is
- to move the scheduling off the processor clock to allow entering low
- power states that would disable that clock.
- config SYSTEMTICK_HOOK
- bool "System timer hook"
- default n
- ---help---
- Enable a call to a user-provided, board-level function on each timer
- tick. This permits custom actions that may be performed on each
- timer tick. The form of the user-provided function is:
- void board_timerhook(void);
- (prototyped in include/nuttx/board.h).
- endif # !SCHED_TICKLESS
- config SYSTEM_TIME64
- bool "64-bit system clock"
- default n
- ---help---
- The system timer is incremented at the rate determined by
- USEC_PER_TICK, typically at 100Hz. The count at any given time is
- then the "uptime" in units of system timer ticks. By default, the
- system time is 32-bits wide. Those defaults provide a range of about
- 497 days which is probably a sufficient range for "uptime".
- However, if the system timer rate is significantly higher than 100Hz
- and/or if a very long "uptime" is required, then this option can be
- selected to support a 64-bit wide timer.
- config CLOCK_MONOTONIC
- bool "Support CLOCK_MONOTONIC"
- default n
- ---help---
- CLOCK_MONOTONIC is an optional standard POSIX clock. Unlike
- CLOCK_REALTIME which can move forward and backward when the
- time-of-day changes, CLOCK_MONOTONIC is the elapsed time since some
- arbitrary point in the post (the system start-up time for NuttX)
- and, hence, is always monotonically increasing. CLOCK_MONOTONIC
- is, hence, the more appropriate clock for determining time
- differences.
- The value of the CLOCK_MONOTONIC clock cannot be set via clock_settime().
- config ARCH_HAVE_TIMEKEEPING
- bool
- default n
- config CLOCK_TIMEKEEPING
- bool "Support timekeeping algorithms"
- default n
- depends on EXPERIMENTAL && ARCH_HAVE_TIMEKEEPING
- ---help---
- CLOCK_TIMEKEEPING enables experimental time management algorithms.
- config JULIAN_TIME
- bool "Enables Julian time conversions"
- default n
- ---help---
- Enables Julian time conversions
- config START_YEAR
- int "Start year"
- default 2018
- range 1970 2106
- ---help---
- NuttX uses an unsigned 32-bit integer for time_t which provides a
- range from 1970 to 2106.
- config START_MONTH
- int "Start month"
- default 1
- range 1 12
- config START_DAY
- int "Start day"
- default 1
- range 1 31
- config PREALLOC_TIMERS
- int "Number of pre-allocated POSIX timers"
- default 8
- ---help---
- The number of pre-allocated POSIX timer structures. The system manages a
- pool of preallocated timer structures to minimize dynamic allocations. Set to
- zero for all dynamic allocations.
- endmenu # Clocks and Timers
- menu "Tasks and Scheduling"
- config SPINLOCK
- bool "Support Spinlocks"
- default n
- depends on ARCH_HAVE_TESTSET
- ---help---
- Enables support for spinlocks. Spinlocks are used primarily for
- synchronization in SMP configurations but are available for general
- synchronization between CPUs. Use in a single CPU configuration would
- most likely be fatal. Note, however, that this does not depend on
- CONFIG_ARCH_HAVE_MULTICPU. This permits the use of spinlocks in
- other novel architectures.
- config SPINLOCK_IRQ
- bool "Support Spinlocks with IRQ control"
- default n
- ---help---
- Enables support for spinlocks with IRQ control. This feature can be
- used to protect data in SMP mode.
- config IRQCHAIN
- bool "Enable multi handler sharing a IRQ"
- default n
- ---help---
- Enable support for IRQCHAIN.
- if IRQCHAIN
- config PREALLOC_IRQCHAIN
- int "Number of pre-allocated irq chains"
- default 8
- ---help---
- The number of pre-allocated irq chain structures. The system manages
- a pool of preallocated irq chain structures to minimize dynamic
- allocations. You will, however, get better performance and memory
- usage if this value is tuned to minimize such allocations.
- endif # IRQCHAIN
- config IRQCOUNT
- bool
- default n
- config SMP
- bool "Symmetric Multi-Processing (SMP)"
- default n
- depends on ARCH_HAVE_MULTICPU
- select SPINLOCK
- select SCHED_RESUMESCHEDULER
- select IRQCOUNT
- ---help---
- Enables support for Symmetric Multi-Processing (SMP) on a multi-CPU
- platform.
- if SMP
- config SMP_NCPUS
- int "Number of CPUs"
- default 4
- range 1 32 if DEBUG_FEATURES
- range 2 32 if !DEBUG_FEATURES
- ---help---
- This value identifies the number of CPUs supported by the processor
- that will be used for SMP.
- If CONFIG_DEBUG_FEATURES is enabled, then the value one is permitted
- for CONFIG_SMP_NCPUS. This is not normally a valid setting for an
- SMP configuration. However, running the SMP logic in a single CPU
- configuration is useful during certain testing.
- config SMP_IDLETHREAD_STACKSIZE
- int "CPU IDLE stack size"
- default DEFAULT_TASK_STACKSIZE
- ---help---
- Each CPU will have its own IDLE task. System initialization occurs
- on CPU0 and uses CONFIG_IDLETHREAD_STACKSIZE which will probably be
- larger than is generally needed. This setting provides the stack
- size for the IDLE task on CPUS 1 through (CONFIG_SMP_NCPUS-1).
- endif # SMP
- choice
- prompt "Initialization Task"
- default INIT_ENTRYPOINT if !BUILD_KERNEL
- default INIT_FILEPATH if !BINFMT_DISABLE
- default INIT_NONE if BINFMT_DISABLE
- config INIT_NONE
- bool "None"
- config INIT_ENTRYPOINT
- bool "Via application entry point"
- depends on !BUILD_KERNEL
- config INIT_FILEPATH
- bool "Via executable file"
- depends on !BINFMT_DISABLE
- endchoice # Initialization task
- config INIT_ARGS
- string "Application argument list"
- depends on !INIT_NONE
- ---help---
- The argument list for user applications. e.g.:
- "\"arg1\",\"arg2\",\"arg3\""
- if INIT_ENTRYPOINT
- config USER_ENTRYPOINT
- string "Application entry point"
- default "main"
- ---help---
- The name of the entry point for user applications. For the example
- applications this is of the form 'app_main' where 'app' is the application
- name. If not defined, USER_ENTRYPOINT defaults to "main".
- config USERMAIN_STACKSIZE
- int "Main thread stack size"
- default DEFAULT_TASK_STACKSIZE
- ---help---
- The size of the stack to allocate for the user initialization thread
- that is started as soon as the OS completes its initialization.
- config USERMAIN_PRIORITY
- int "init thread priority"
- default 100
- ---help---
- The priority of the user initialization thread.
- endif # INIT_ENTRYPOINT
- if INIT_FILEPATH
- config USER_INITPATH
- string "Application initialization path"
- default "/bin/init"
- ---help---
- The name of the entry point for user applications. For the example
- applications this is of the form 'app_main' where 'app' is the application
- name. If not defined, USER_ENTRYPOINT defaults to "main".
- config INIT_SYMTAB
- string "Symbol table"
- default "NULL" if !EXECFUNCS_HAVE_SYMTAB
- default EXECFUNCS_SYMTAB_ARRAY if EXECFUNCS_HAVE_SYMTAB
- depends on BUILD_FLAT
- ---help---
- The name of other global array that holds the exported symbol table.
- The special string "NULL" may be provided if there is no symbol
- table. Quotation marks will be stripped when config.h is generated.
- NOTE: This setting cannot be used in protected or kernel builds.
- Any kernel mode symbols tables would not be usable for resolving
- symbols in user mode executables.
- config INIT_NEXPORTS
- string "Symbol table size"
- default "0" if !EXECFUNCS_HAVE_SYMTAB
- default EXECFUNCS_NSYMBOLS_VAR if EXECFUNCS_HAVE_SYMTAB
- depends on BUILD_FLAT
- ---help---
- The size of the symbol table. NOTE that is is logically a numeric
- value but is represent by a string. That allows you to put
- sizeof(something) or a macro or a global variable name for the
- symbol table size. Quotation marks will be stripped when config.h
- is generated.
- NOTE: This setting cannot be used in protected or kernel builds.
- Any kernel mode symbols tables would not be usable for resolving
- symbols in user mode executables.
- menuconfig INIT_MOUNT
- bool "Auto-mount init file system"
- default n
- depends on !DISABLE_MOUNTPOINT
- ---help---
- In order to use the the initial startup program when CONFIG_INIT_FILEPATH
- is provided, it is necessary to mount the initial file system that
- provides init program. Normally this mount is done in the board-specific
- initialization logic. However, if the mount is very simple, it can be
- performed by the OS bring-up logic itself by selecting this option.
- if INIT_MOUNT
- config INIT_MOUNT_SOURCE
- string "The block device to mount"
- default "/dev/ram0"
- config INIT_MOUNT_TARGET
- string "Path to the mounted file system"
- default "/bin"
- config INIT_MOUNT_FSTYPE
- string "The file system type to mount"
- default "romfs"
- config INIT_MOUNT_FLAGS
- hex "Flags passed to mount"
- default 0
- config INIT_MOUNT_DATA
- string "Additional data passed to mount"
- default ""
- endif # INIT_MOUNT
- endif # INIT_FILEPATH
- config RR_INTERVAL
- int "Round robin timeslice (MSEC)"
- default 0
- ---help---
- The round robin timeslice will be set this number of milliseconds;
- Round robin scheduling (SCHED_RR) is enabled by setting this
- interval to a positive, non-zero value.
- config SCHED_SPORADIC
- bool "Support sporadic scheduling"
- default n
- select SCHED_SUSPENDSCHEDULER
- select SCHED_RESUMESCHEDULER
- ---help---
- Build in additional logic to support sporadic scheduling
- (SCHED_SPORADIC).
- if SCHED_SPORADIC
- config SCHED_SPORADIC_MAXREPL
- int "Maximum number of replenishments"
- default 3
- range 1 255
- ---help---
- Controls the size of allocated replenishment structures and, hence,
- also limits the maximum number of replenishments.
- config SPORADIC_INSTRUMENTATION
- bool "Sporadic scheduler monitor hooks"
- default n
- ---help---
- Enables instrumentation in the sporadic scheduler to monitor
- scheduler behavior. If enabled, then the board-specific logic must
- provide the following functions:
- void arch_sporadic_start(FAR struct tcb_s *tcb);
- void arch_sporadic_lowpriority(FAR struct tcb_s *tcb);
- void arch_sporadic_suspend(FAR struct tcb_s *tcb);
- void arch_sporadic_resume(FAR struct tcb_s *tcb);
- endif # SCHED_SPORADIC
- config TASK_NAME_SIZE
- int "Maximum task name size"
- default 31
- ---help---
- Specifies the maximum size of a task name to save in the TCB.
- Useful if scheduler instrumentation is selected. Set to zero to
- disable. Excludes the NUL terminator; the actual allocated size
- will be TASK_NAME_SIZE + 1. The default of 31 then results in
- a align-able 32-byte allocation.
- config MAX_TASKS
- int "Max number of tasks"
- default 32
- ---help---
- The maximum number of simultaneously active tasks. This value must be
- a power of two.
- config SCHED_HAVE_PARENT
- bool "Support parent/child task relationships"
- default n
- ---help---
- Remember the ID of the parent task when a new child task is
- created. This support enables some additional features (such as
- SIGCHLD) and modifies the behavior of other interfaces. For
- example, it makes waitpid() more standards complete by restricting
- the waited-for tasks to the children of the caller. Default:
- disabled.
- config SCHED_CHILD_STATUS
- bool "Retain child exit status"
- default n
- depends on SCHED_HAVE_PARENT
- ---help---
- If this option is selected, then the exit status of the child task
- will be retained after the child task exits. This option should be
- selected if you require knowledge of a child process's exit status.
- Without this setting, wait(), waitpid() or waitid() may fail. For
- example, if you do:
- 1) Start child task
- 2) Wait for exit status (using wait(), waitpid(), or waitid()).
- This can fail because the child task may run to completion before
- the wait begins. There is a non-standard work-around in this case:
- The above sequence will work if you disable pre-emption using
- sched_lock() prior to starting the child task, then re-enable pre-
- emption with sched_unlock() after the wait completes. This works
- because the child task is not permitted to run until the wait is in
- place.
- The standard solution would be to enable SCHED_CHILD_STATUS. In
- this case the exit status of the child task is retained after the
- child exits and the wait will successful obtain the child task's
- exit status whether it is called before the child task exits or not.
- Warning: If you enable this feature, then your application must
- either (1) take responsibility for reaping the child status with wait(),
- waitpid(), or waitid(), or (2) suppress retention of child status.
- If you do not reap the child status, then you have a memory leak and
- your system will eventually fail.
- Retention of child status can be suppressed on the parent using logic like:
- struct sigaction sa;
- sa.sa_handler = SIG_IGN;
- sa.sa_flags = SA_NOCLDWAIT;
- int ret = sigaction(SIGCHLD, &sa, NULL);
- if SCHED_CHILD_STATUS
- config PREALLOC_CHILDSTATUS
- int "Number of pre-allocated child status"
- default 0
- ---help---
- To prevent runaway child status allocations and to improve
- allocation performance, child task exit status structures are pre-
- allocated when the system boots. This setting determines the number
- of child status structures that will be pre-allocated. If this
- setting is not defined or if it is defined to be zero then a value
- of 2*MAX_TASKS is used.
- Note that there cannot be more than MAX_TASKS tasks in total.
- However, the number of child status structures may need to be
- significantly larger because this number includes the maximum number
- of tasks that are running PLUS the number of tasks that have exit'ed
- without having their exit status reaped (via wait(), waitid(), or
- waitpid()).
- Obviously, if tasks spawn children indefinitely and never have the
- exit status reaped, then you may have a memory leak! If you enable
- the SCHED_CHILD_STATUS feature, then your application must take
- responsibility for either (1) reaping the child status with wait(),
- waitpid(), or waitid() or it must (2) suppress retention of child
- status. Otherwise, your system will eventually fail.
- Retention of child status can be suppressed on the parent using logic like:
- struct sigaction sa;
- sa.sa_handler = SIG_IGN;
- sa.sa_flags = SA_NOCLDWAIT;
- int ret = sigaction(SIGCHLD, &sa, NULL);
- config DEBUG_CHILDSTATUS
- bool "Enable Child Status Debug Output"
- default n
- depends on SCHED_CHILD_STATUS && DEBUG_FEATURES
- ---help---
- Very detailed... I am sure that you do not want this.
- endif # SCHED_CHILD_STATUS
- config SCHED_WAITPID
- bool "Enable waitpid() API"
- default n
- ---help---
- Enables the waitpid() interface in a default, non-standard mode
- (non-standard in the sense that the waited for PID need not be child
- of the caller). If SCHED_HAVE_PARENT is also defined, then this
- setting will modify the behavior or waitpid() (making more spec
- compliant) and will enable the waitid() and wait() interfaces as
- well.
- config SCHED_USER_IDENTITY
- bool "Support per-task User Identity"
- default n
- ---help---
- This selection enables functionality of getuid(), setuid(), getgid(),
- setgid(). If this option is not selected, then stub, root-only
- versions of these interfaces are available. When selected, these
- interfaces will associate a UID and/or GID with each task group.
- Those can then be managed using the interfaces. Child tasks will
- inherit the UID and GID of its parent.
- endmenu # Tasks and Scheduling
- menu "Pthread Options"
- depends on !DISABLE_PTHREAD
- config PTHREAD_MUTEX_TYPES
- bool "Enable mutex types"
- default n
- ---help---
- Set to enable support for recursive and errorcheck mutexes. Enables
- pthread_mutexattr_settype().
- choice
- prompt "pthread mutex robustness"
- default PTHREAD_MUTEX_ROBUST if !DEFAULT_SMALL
- default PTHREAD_MUTEX_UNSAFE if DEFAULT_SMALL
- config PTHREAD_MUTEX_ROBUST
- bool "Robust mutexes"
- ---help---
- Support only the robust form of the NORMAL mutex.
- config PTHREAD_MUTEX_UNSAFE
- bool "Traditional unsafe mutexes"
- ---help---
- Support only the traditional non-robust form of the NORMAL mutex.
- You should select this option only for backward compatibility with
- software you may be porting or, perhaps, if you are trying to minimize
- footprint.
- config PTHREAD_MUTEX_BOTH
- bool "Both robust and unsafe mutexes"
- ---help---
- Support both forms of NORMAL mutexes.
- endchoice # pthread mutex robustness
- choice
- prompt "Default NORMAL mutex robustness"
- default PTHREAD_MUTEX_DEFAULT_ROBUST
- depends on PTHREAD_MUTEX_BOTH
- config PTHREAD_MUTEX_DEFAULT_ROBUST
- bool "Robust default"
- ---help---
- The default is robust NORMAL mutexes (non-standard)
- config PTHREAD_MUTEX_DEFAULT_UNSAFE
- bool "Unsafe default"
- ---help---
- The default is traditional unsafe NORMAL mutexes (standard)
- endchoice # Default NORMAL mutex robustness
- config PTHREAD_CLEANUP
- bool "pthread cleanup stack"
- default n
- ---help---
- Select to enable support for pthread exit cleanup stacks. This
- enables the interfaces pthread_cleanup_push() and
- pthread_cleanup_pop().
- config PTHREAD_CLEANUP_STACKSIZE
- int "pthread cleanup stack size"
- default 1
- range 1 32
- depends on PTHREAD_CLEANUP
- ---help---
- The maximum number of cleanup actions that may be pushed by
- pthread_clean_push(). This setting will increase the size of EVERY
- pthread task control block by about n * CONFIG_PTHREAD_CLEANUP_STACKSIZE
- where n is the size of a pointer, 2* sizeof(uintptr_t), this would be
- 8 for a CPU with 32-bit addressing and 4 for a CPU with 16-bit
- addressing.
- config CANCELLATION_POINTS
- bool "Cancellation points"
- default n
- ---help---
- Enable POSIX cancellation points for pthread_cancel(). If selected,
- cancellation points will also used with the () task_delete() API even if
- pthreads are not enabled.
- endmenu # Pthread Options
- menu "Performance Monitoring"
- config SCHED_SUSPENDSCHEDULER
- bool
- default n
- config SCHED_RESUMESCHEDULER
- bool
- default n
- config SCHED_IRQMONITOR
- bool "Enable IRQ monitoring"
- default n
- depends on FS_PROCFS
- ---help---
- Enabling counting of interrupts from all interrupt sources. These
- counts will be available in the mounted procfs file systems at the
- top-level file, "irqs".
- config SCHED_CRITMONITOR
- bool "Enable Critical Section monitoring"
- default n
- depends on FS_PROCFS
- select SCHED_SUSPENDSCHEDULER
- select SCHED_RESUMESCHEDULER
- select IRQCOUNT
- ---help---
- Enables logic that monitors the duration of time that a thread keeps
- interrupts or pre-emption disabled. These global locks can have
- negative consequences to real timer performance: Disabling interrupts
- adds jitter in the time when a interrupt request is asserted until
- the hardware can responds with the interrupt. Disabling pre-emption
- adds jitter in the timer from when the event is posted in the
- interrupt handler until the task that responds to the event can run.
- If this option is selected, then the following interfaces must be
- provided by platform-specific logic:
- uint32_t up_critmon_gettime(void);
- void up_critmon_convert(uint32_t elapsed, FAR struct timespec *ts);
- The first interface simply provides the current time value in unknown
- units. NOTE: This function may be called early before the timer has
- been initialized. In that event, the function should just return a
- start time of zero.
- Nothing is assumed about the units of this time value. The following
- are assumed, however: (1) The time is an unsigned integer value, (2)
- the time is monotonically increasing, and (3) the elapsed time (also
- in unknown units) can be obtained by subtracting a start time from
- the current time.
- The second interface simple converts an elapsed time into well known
- units for presentation by the ProcFS file system.
- config SCHED_CPULOAD
- bool "Enable CPU load monitoring"
- default n
- select SCHED_CPULOAD_EXTCLK if SCHED_TICKLESS
- ---help---
- If this option is selected, the timer interrupt handler will monitor
- if the system is IDLE or busy at the time of that the timer interrupt
- occurs. This is a very coarse measurement, but over a period of time,
- it can very accurately determined the percentage of the time that the
- CPU is IDLE.
- The statistics collected in this could be used, for example in the
- PROCFS file system to provide CPU load measurements when read.
- Note that in tickless mode of operation (SCHED_TICKLESS) there is
- no system timer interrupt and CPU load measurements will not be
- possible unless you provide an alternative clock to driver the
- sampling and select SCHED_CPULOAD_EXTCLK.
- if SCHED_CPULOAD
- config SCHED_CPULOAD_EXTCLK
- bool "Use external clock"
- default n
- ---help---
- The CPU load measurements are determined by sampling the active
- tasks periodically at the occurrence to a timer expiration. By
- default, the system clock is used to do that sampling.
- There is a serious issue for the accuracy of measurements if the
- system clock is used, however. NuttX threads are often started at
- the time of the system timer expiration. Others may be stopped at
- the time of the system timer expiration (if round-robin time-slicing
- is enabled). Such thread behavior occurs synchronously with the
- system timer and, hence, is not randomly sampled. As a consequence,
- the CPU load attributed to these threads that run synchronously with
- they system timer may be grossly in error.
- The solution is to use some other clock that runs at a different
- rate and has timer expirations that are asynchronous with the
- system timer. Then truly accurate load measurements can be
- achieved. This option enables use of such an "external" clock. The
- implementation of the clock must be provided by platform-specific
- logic; that platform-specific logic must call the system function
- nxsched_process_cpuload() at each timer expiration with interrupts
- disabled.
- if SCHED_CPULOAD_EXTCLK
- config SCHED_CPULOAD_TICKSPERSEC
- int "External clock rate"
- default 100
- ---help---
- If an external clock is used to drive the sampling for the CPU load
- calculations, then this value must be provided. This value provides
- the rate of the external clock interrupts in units of ticks per
- second. The default value of 100 corresponds to a 100Hz clock. NOTE:
- that 100Hz is the default frequency of the system time and, hence,
- the worst possible choice in most cases.
- choice
- prompt "Select CPU load timer"
- default CPULOAD_ONESHOT
- config CPULOAD_ONESHOT
- bool "Use Oneshot timer"
- ---help---
- Use an MCU-specific oneshot timer as the external clock. The
- oneshot timer must be configured by board specific logic which must
- then call:
- void nxsched_oneshot_extclk(FAR struct oneshot_lowerhalf_s *lower);
- To start the CPU load measurement. See include/nuttx/clock.h
- NOTE that in this configuration, CONFIG_SCHED_CPULOAD_TICKSPERSEC is
- the sample rate that will be accomplished by programming the oneshot
- time repeatedly. If CPULOAD_ONESHOT_ENTROPY is also selected, then
- the underly frequency driving the oneshot timer must be
- significantly faster than CONFIG_SCHED_CPULOAD_TICKSPERSE to permit
- precise modulation the sample periods.
- config CPULOAD_PERIOD
- bool "Use Period timer"
- ---help---
- Use an MCU-specific period timer as the external clock. The
- period timer must be configured by board specific logic which must
- then call:
- void nxsched_period_extclk(FAR struct timer_lowerhalf_s *lower);
- To start the CPU load measurement. See include/nuttx/clock.h
- NOTE that in this configuration, CONFIG_SCHED_CPULOAD_TICKSPERSEC is
- the sample rate that will be accomplished by programming the period
- time.
- endchoice
- config CPULOAD_ENTROPY
- int "Bits of entropy"
- default 6
- range 0 30
- depends on CPULOAD_ONESHOT
- ---help---
- This is the number of bits of entropy that will be applied. The
- oneshot will be set to this interval:
- CPULOAD_ONESHOT_NOMINAL - (CPULOAD_ONESHOT_ENTROPY / 2) +
- error + nrand(CPULOAD_ONESHOT_ENTROPY)
- Where
- CPULOAD_ONESHOT_NOMINAL is the nominal sample interval implied
- by CONFIG_SCHED_CPULOAD_TICKSPERSEC in units of microseconds.
- CPULOAD_ONESHOT_ENTROPY is (1 << CONFIG_CPULOAD_ENTROPY),
- and 'error' is an error value that is retained from interval to
- interval so that although individual intervals are randomized,
- the average will still be CONFIG_SCHED_CPULOAD_TICKSPERSEC.
- This special value of zero disables entropy.
- endif # SCHED_CPULOAD_EXTCLK
- config SCHED_CPULOAD_TIMECONSTANT
- int "CPU load time constant"
- default 2
- ---help---
- The accumulated CPU count is divided by two when the accumulated
- tick count exceeds this time constant. This time constant is in
- units of seconds.
- endif # SCHED_CPULOAD
- config SCHED_INSTRUMENTATION
- bool "System performance monitor hooks"
- default n
- select SCHED_SUSPENDSCHEDULER
- select SCHED_RESUMESCHEDULER
- ---help---
- Enables instrumentation in scheduler to monitor system performance.
- If enabled, then the board-specific logic must provide the following
- functions (see include/sched.h):
- void sched_note_start(FAR struct tcb_s *tcb);
- void sched_note_stop(FAR struct tcb_s *tcb);
- void sched_note_suspend(FAR struct tcb_s *tcb);
- void sched_note_resume(FAR struct tcb_s *tcb);
- If CONFIG_SMP is enabled, then these additional interfaces are
- expected:
- void sched_note_cpu_pause(FAR struct tcb_s *tcb, int cpu);
- void sched_note_cpu_paused(FAR struct tcb_s *tcb);
- void sched_note_cpu_resume(FAR struct tcb_s *tcb, int cpu);
- void sched_note_cpu_resumed(FAR struct tcb_s *tcb);
- NOTE: These are internal OS interfaces and are called at at very
- critical locations in the OS. There is very little that can be
- done in these interfaces. For example, normal devices may not be
- used; syslog output cannot be performed.
- if SCHED_INSTRUMENTATION
- config SCHED_INSTRUMENTATION_EXTERNAL
- bool "System performance monitor endpoints are external"
- default n
- ---help---
- When this option is enabled, the board specific logic must implment all
- callbacks listed in SCHED_INSTRUMENTATION, SCHED_INSTRUMENTATION_CSECTION,
- SCHED_INSTRUMENTATION_SPINLOCKS, SCHED_INSTRUMENTATION_SYSCALL and
- SCHED_INSTRUMENTATION_IRQHANDLER. Otherwise the common code will implement
- these callbacks and packet the arguments into note_ struct. Then the board
- -specific logic just need to implement one callback:
- void sched_note_add(FAR const void *note, size_t notelen);
- and send the data to the suitable transport hardware.
- config SCHED_INSTRUMENTATION_CPUSET
- hex "CPU bit set"
- default 0xffff
- depends on SMP && SCHED_INSTRUMENTATION_FILTER
- ---help---
- Monitor only CPUs in the bitset. Bit 0=CPU0, Bit1=CPU1, etc.
- config SCHED_INSTRUMENTATION_PREEMPTION
- bool "Preemption monitor hooks"
- default n
- ---help---
- Enables additional hooks for changes to pre-emption state. Board-
- specific logic must provide this additional logic.
- void sched_note_premption(FAR struct tcb_s *tcb, bool state);
- config SCHED_INSTRUMENTATION_CSECTION
- bool "Critical section monitor hooks"
- default n
- select IRQCOUNT
- ---help---
- Enables additional hooks for entry and exit from critical sections.
- Interrupts are disabled while within a critical section. Board-
- specific logic must provide this additional logic.
- void sched_note_csection(FAR struct tcb_s *tcb, bool state);
- config SCHED_INSTRUMENTATION_SPINLOCKS
- bool "Spinlock monitor hooks"
- default n
- ---help---
- Enables additional hooks for spinlock state. Board-specific logic
- must provide this additional logic.
- void sched_note_spinlock(FAR struct tcb_s *tcb, bool state);
- void sched_note_spinlocked(FAR struct tcb_s *tcb, bool state);
- void sched_note_spinunlock(FAR struct tcb_s *tcb, bool state);
- void sched_note_spinabort(FAR struct tcb_s *tcb, bool state);
- config SCHED_INSTRUMENTATION_SYSCALL
- bool "System call monitor hooks"
- default n
- depends on ARCH_HAVE_SYSCALL_HOOKS
- ---help---
- Enables additional hooks for entry and exit from system call.
- Board-specific logic must provide this additional logic.
- void sched_note_syscall_enter(int nr, int argc, ...);
- void sched_note_syscall_leave(int nr, uintptr_t result);
- config SCHED_INSTRUMENTATION_IRQHANDLER
- bool "Interrupt handler monitor hooks"
- default n
- ---help---
- Enables additional hooks for interrupt handler. Board-specific logic
- must provide this additional logic.
- void sched_note_irqhandler(int irq, FAR void *handler, bool enter);
- config SCHED_INSTRUMENTATION_HIRES
- bool "Use Hi-Res RTC for instrumentation"
- default n
- ---help---
- Use higher resolution system timer for instrumentation.
- config SCHED_INSTRUMENTATION_FILTER
- bool "Instrumenation filter"
- default n
- ---help---
- Enables the filter logic for the instrumentation. If this option
- is enabled, the instrumentation data passed to sched_note_add()
- can be filtered by syscall and IRQ number.
- The filter logic can be configured by sched_note_filter APIs defined in
- include/nuttx/sched_note.h.
- config SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE
- hex "Default instrumentation filter mode"
- depends on SCHED_INSTRUMENTATION_FILTER
- default 0xf
- ---help---
- Default mode of the instrumentation filter logic.
- Bit 0 = Enable instrumentation
- Bit 1 = Enable syscall instrumentation
- Bit 2 = Enable IRQ instrumentation
- Bit 3 = Enable collecting syscall arguments
- endif # SCHED_INSTRUMENTATION
- endmenu # Performance Monitoring
- menu "Files and I/O"
- config DEV_CONSOLE
- bool "Enable /dev/console"
- default y
- ---help---
- Set if architecture-specific logic provides /dev/console at boot-up
- time. Enables stdout, stderr, stdin in the start-up application.
- You need this setting if your console device is ready at boot time.
- For example, if you are using a serial console, then /dev/console
- (aka, /dev/ttyS0) will be available when the application first starts.
- You must not select DEV_CONSOLE if you console device comes up later
- and is not ready until after the application starts. At this time,
- the only console device that behaves this way is a USB serial console.
- When the application first starts, the USB is (probably) not yet
- connected and /dev/console will not be created until later when the
- host connects to the USB console.
- config FDCLONE_DISABLE
- bool "Disable cloning of file descriptors"
- default n
- ---help---
- Disable cloning of all file descriptors by task_create() when a new
- ask is started. If set, all files/drivers will appear to be closed
- in the new task.
- config FDCLONE_STDIO
- bool "Disable clone file descriptors without stdio"
- default n
- ---help---
- Disable cloning of all but the first three file descriptors (stdin,
- stdout, stderr) by task_create() when a new task is started. If set,
- all files/drivers will appear to be closed in the new task except
- for stdin, stdout, and stderr.
- config SDCLONE_DISABLE
- bool "Disable cloning of socket descriptors"
- default n
- ---help---
- Disable cloning of all socket
- descriptors by task_create() when a new task is started. If
- set, all sockets will appear to be closed in the new task.
- config NFILE_DESCRIPTORS
- int "Maximum number of file descriptors per task"
- default 16
- range 3 99999
- ---help---
- The maximum number of file descriptors per task (one for each open)
- config FILE_STREAM
- bool "Enable FILE stream"
- default y
- ---help---
- Enable the standard buffered input/output support
- config NAME_MAX
- int "Maximum size of a file name"
- default 32
- ---help---
- The maximum size of a file name.
- config PATH_MAX
- int "Maximum size of path name"
- default 256
- ---help---
- The maximum size of path name.
- endmenu # Files and I/O
- menuconfig PRIORITY_INHERITANCE
- bool "Enable priority inheritance "
- default n
- ---help---
- Set to enable support for priority inheritance on mutexes and semaphores.
- When this option is enabled, the initial configuration of all seamphores
- and mutexes will be with priority inheritance enabled. That configuration
- may not be appropriate in all cases (such as when the semaphore or mutex
- is used for signaling). In such cases, priority inheritance can be
- disabled for individual semaphores by calling:
- int ret = sem_setprotocol(&sem, SEM_PRIO_NONE);
- From applications, the functionally equivalent OS internal interface,
- nxsem_set_protocol(), should be used within the OS
- And for individual pthread mutexes by setting the protocol attribute
- before initializing the mutex:
- int ret = pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_NONE);
- if PRIORITY_INHERITANCE
- config SEM_PREALLOCHOLDERS
- int "Number of pre-allocated holders"
- default 16
- ---help---
- This setting is only used if priority inheritance is enabled.
- It defines the maximum number of different threads (minus one) that
- can take counts on a semaphore with priority inheritance support.
- This may be set to zero if priority inheritance is disabled OR if you
- are only using semaphores as mutexes (only one holder) OR if no more
- than two threads participate using a counting semaphore.
- config SEM_NNESTPRIO
- int "Maximum number of higher priority threads"
- default 16
- ---help---
- If priority inheritance is enabled, then this setting is the
- maximum number of higher priority threads (minus 1) than can be
- waiting for another thread to release a count on a semaphore.
- This value may be set to zero if no more than one thread is
- expected to wait for a semaphore.
- endif # PRIORITY_INHERITANCE
- menu "RTOS hooks"
- config BOARD_EARLY_INITIALIZE
- bool "Custom board early initialization"
- default n
- ---help---
- There are three points in time where you can insert custom,
- board-specific initialization logic:
- 1) <arch>_board_initialize(): This function is used only for
- initialization of very low-level things like configuration of
- GPIO pins, power setting. The OS has not been initialized
- at this point, so you cannot allocate memory or initialize
- device drivers at this phase.
- 2) The next level of initialization is performed by a call to
- up_initialize() (in arch/<arch>/src/common/up_initialize.c).
- The OS has been initialized at this point and it is okay to
- initialize drivers in this phase.
- At this same point in time, the OS will also call a board-
- specific initialization function named board_early_initialize()
- if CONFIG_BOARD_EARLY_INITIALIZE is selected. The context in
- which board_early_initialize() executes is suitable for early
- initialization of most, simple device drivers and is a logical,
- board-specific extension of up_initialize().
- board_early_initialize() runs on the startup, initialization thread.
- Some initialization operations cannot be performed on the start-up,
- initialization thread. That is because the initialization thread
- cannot wait for event. Waiting may be required, for example, to
- mount a file system or or initialize a device such as an SD card.
- For this reason, such driver initialize must be deferred to
- board_late_initialize().
- 3) And, finally, just before the user application code starts.
- If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional
- initialization call will be performed in the boot-up sequence to a
- function called board_late_initialize(). board_late_initialize()
- will be called after up_initialize() is called and just before the
- main application is started. This additional initialization
- phase may be used, for example, to initialize more complex,
- board-specific device drivers.
- Waiting for events, use of I2C, SPI, etc are permissible in the
- context of board_late_initialize(). That is because
- board_late_initialize() will run on a temporary, internal kernel
- thread.
- config BOARD_LATE_INITIALIZE
- bool "Custom board late initialization"
- default n
- ---help---
- There are three points in time where you can insert custom,
- board-specific initialization logic:
- 1) <arch>_board_initialize(): This function is used only for
- initialization of very low-level things like configuration of
- GPIO pins, power setting. The OS has not been initialized
- at this point, so you cannot allocate memory or initialize
- device drivers at this phase.
- 2) The next level of initialization is performed by a call to
- up_initialize() (in arch/<arch>/src/common/up_initialize.c).
- The OS has been initialized at this point and it is okay to
- initialize drivers in this phase.
- At this same point in time, the OS will also call a board-
- specific initialization function named board_early_initialize()
- if CONFIG_BOARD_EARLY_INITIALIZE is selected. The context in
- which board_early_initialize() executes is suitable for early
- initialization of most, simple device drivers and is a logical,
- board-specific extension of up_initialize().
- board_early_initialize() runs on the startup, initialization thread.
- Some initialization operations cannot be performed on the start-up,
- initialization thread. That is because the initialization thread
- cannot wait for event. Waiting may be required, for example, to
- mount a file system or or initialize a device such as an SD card.
- For this reason, such driver initialize must be deferred to
- board_late_initialize().
- 3) And, finally, just before the user application code starts.
- If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional
- initialization call will be performed in the boot-up sequence to a
- function called board_late_initialize(). board_late_initialize()
- will be called after up_initialize() is called and just before the
- main application is started. This additional initialization
- phase may be used, for example, to initialize more complex,
- board-specific device drivers.
- Waiting for events, use of I2C, SPI, etc are permissible in the
- context of board_late_initialize(). That is because
- board_late_initialize() will run on a temporary, internal kernel
- thread.
- if BOARD_LATE_INITIALIZE
- config BOARD_INITTHREAD_STACKSIZE
- int "Board initialization thread stack size"
- default DEFAULT_TASK_STACKSIZE
- ---help---
- The size of the stack to allocate when starting the board
- initialization thread.
- config BOARD_INITTHREAD_PRIORITY
- int "Board initialization thread priority"
- default 240
- ---help---
- The priority of the board initialization thread. This priority is
- not a critical setting. No other application threads will be
- started until the board initialization is completed. Hence, there
- is very little competition for the CPU.
- endif # BOARD_LATE_INITIALIZE
- config SCHED_STARTHOOK
- bool "Enable startup hook"
- default n
- ---help---
- Enable a non-standard, internal OS API call nxtask_starthook().
- nxtask_starthook() registers a function that will be called on task
- startup before that actual task entry point is called. The
- starthook is useful, for example, for setting up automatic
- configuration of C++ constructors.
- config SCHED_ATEXIT
- bool "Enable atexit() API"
- default n
- ---help---
- Enables the atexit() API
- config SCHED_ATEXIT_MAX
- int "Max number of atexit() functions"
- default 1
- depends on SCHED_ATEXIT && !SCHED_ONEXIT
- ---help---
- By default if SCHED_ATEXIT is selected, only a single atexit() function
- is supported. That number can be increased by defined this setting to
- the number that you require.
- If both SCHED_ONEXIT and SCHED_ATEXIT are selected, then atexit() is built
- on top of the on_exit() implementation. In that case, SCHED_ONEXIT_MAX
- determines the size of the combined number of atexit(0) and on_exit calls
- and SCHED_ATEXIT_MAX is not used.
- config SCHED_ONEXIT
- bool "Enable on_exit() API"
- default n
- ---help---
- Enables the on_exit() API
- config SCHED_ONEXIT_MAX
- int "Max number of on_exit() functions"
- default 1
- depends on SCHED_ONEXIT
- ---help---
- By default if SCHED_ONEXIT is selected, only a single on_exit() function
- is supported. That number can be increased by defined this setting to the
- number that you require.
- If both SCHED_ONEXIT and SCHED_ATEXIT are selected, then atexit() is built
- on top of the on_exit() implementation. In that case, SCHED_ONEXIT_MAX
- determines the size of the combined number of atexit(0) and on_exit calls.
- endmenu # RTOS hooks
- menu "Signal Configuration"
- config SIG_EVTHREAD
- bool "Support SIGEV_THHREAD"
- default n
- depends on BUILD_FLAT && SCHED_WORKQUEUE
- ---help---
- Built in support for the SIGEV_THREAD signal deliver method.
- NOTE: The current implementation uses a work queue to notify the
- client. This, however, would only work in the FLAT build. A
- different mechanism would need to be development to support this
- feature on the PROTECTED or KERNEL build.
- config SIG_EVTHREAD_HPWORK
- bool "SIGEV_EVTHREAD use HPWORK"
- default n
- depends on SIG_EVTHREAD && CONFIG_SCHED_HPWORK
- ---help---
- if selected, SIGEV_THHREAD will use the high priority work queue.
- If not, it will use the low priority work queue (if available).
- REVISIT: This solution is non-optimal. Some notifications should
- be high priority and others should be lower priority. Ideally, you
- should be able to determine which work queue is used on a
- notification-by-notification basis.
- menuconfig SIG_DEFAULT
- bool "Default signal actions"
- default n
- ---help---
- Enable to support default signal actions.
- if SIG_DEFAULT
- comment "Per-signal Default Actions"
- config SIG_SIGUSR1_ACTION
- bool "SIGUSR1"
- default n
- ---help---
- Enable the default action for SIGUSR1 (terminate the task)
- Make sure that your applications are expecting this POSIX behavior.
- Backward compatible behavior would require that the application use
- sigaction() to ignore SIGUSR1.
- config SIG_SIGUSR2_ACTION
- bool "SIGUSR2"
- default n
- ---help---
- Enable the default action for SIGUSR2 (terminate the task)
- Make sure that your applications are expecting this POSIX behavior.
- Backward compatible behavior would require that the application use
- sigaction() to ignore SIGUSR2.
- config SIG_SIGALRM_ACTION
- bool "SIGALRM"
- default n
- ---help---
- Enable the default action for SIGALRM (terminate the task)
- Make sure that your applications are expecting this POSIX behavior.
- Backward compatible behavior would require that the application use
- sigaction() to ignore SIGALRM.
- config SIG_SIGPOLL_ACTION
- bool "SIGPOLL"
- default n
- depends on FS_AIO
- ---help---
- Enable the default action for SIGPOLL (terminate the task)
- Make sure that your applications are expecting this POSIX behavior.
- Backward compatible behavior would require that the application use
- sigaction() to ignore SIGPOLL.
- config SIG_SIGSTOP_ACTION
- bool "SIGSTOP SIGSTP, and SIGCONT"
- default y
- ---help---
- Enable the default action for SIGSTOP and SIGSTP (suspend the
- task) and SIGCONT (resume the task).
- config SIG_SIGKILL_ACTION
- bool "SIGINT SIGKILL SIGQUIT and SIGTERM"
- default y
- ---help---
- Enable the default action for SIGINT and SIGKILL (terminate the
- task).
- config SIG_SIGPIPE_ACTION
- bool "SIGPIPE"
- default y
- ---help---
- Enable the default action for SIGPIPE (terminate the task).
- endif # SIG_DEFAULT
- menu "Signal Numbers"
- comment "Standard Signal Numbers"
- config SIG_SIGUSR1
- int "SIGUSR1"
- default 1
- ---help---
- Value of standard user signal 1 (SIGUSR1). Default: 1
- config SIG_SIGUSR2
- int "SIGUSR2"
- default 2
- ---help---
- Value of standard user signal 2 (SIGUSR2). Default: 2
- config SIG_SIGALRM
- int "SIGALRM"
- default 3
- ---help---
- Default the signal number used with POSIX timers (SIGALRM).
- Default: 3
- config SIG_SIGCHLD
- int "SIGCHLD"
- default 4
- depends on SCHED_HAVE_PARENT
- ---help---
- The SIGCHLD signal is sent to the parent of a child process when it
- exits, is interrupted (stopped), or resumes after being interrupted.
- Default: 4
- config SIG_POLL
- int "SIGPOLL"
- default 5
- depends on FS_AIO
- ---help---
- The SIGPOLL signal is sent to a process when an asynchronous I/O
- event occurs (meaning it has been polled). Default: 5
- if SIG_DEFAULT
- config SIG_STOP
- int "SIGSTOP"
- default 6
- depends on SIG_SIGSTOP_ACTION
- ---help---
- Suspend/pause a task. SIGSTOP may not be caught or ignored.
- config SIG_STP
- int "SIGSTP"
- default 7
- depends on SIG_SIGSTOP_ACTION
- ---help---
- Suspend/pause a task. Unlike SIGSTOP, this signal can be caught or
- ignored.
- config SIG_CONT
- int "SIGCONT"
- default 8
- depends on SIG_SIGSTOP_ACTION
- ---help---
- Resume a suspended/paused task. SIGSTOP only has an action when
- send to a stopped task. SIGCONT is ignored by other task. SIGCONT
- may not be caught or ignored by a stopped task.
- config SIG_KILL
- int "SIGKILL"
- default 9
- depends on SIG_SIGKILL_ACTION
- ---help---
- The SIGKILL signal is sent to cause a task termination event.
- SIGKILL may not be caught or ignored.
- config SIG_INT
- int "SIGINT"
- default 10
- depends on SIG_SIGKILL_ACTION
- ---help---
- The SIGINT signal is sent to cause a task termination event.
- SIGINT may be ignored or caught by the receiving task.
- config SIG_QUIT
- int "SIGQUIT"
- default 11
- depends on SIG_SIGKILL_ACTION
- ---help---
- The SIGINT signal is sent to cause a task termination event.
- SIGQUIT may be ignored or caught by the receiving task.
- config SIG_TERM
- int "SIGTERM"
- default 12
- depends on SIG_SIGKILL_ACTION
- ---help---
- The SIGINT signal is sent to cause a task termination event.
- SIGTERM may be ignored or caught by the receiving task.
- endif # SIG_DEFAULT
- config SIG_PIPE
- int "SIGPIPE"
- default 13
- ---help---
- The SIGPIPE signal is sent to a task termination event.
- This signal is generated when write on a pipe with no one to read it.
- SIGPIPE may be ignored.
- comment "Non-standard Signal Numbers"
- config SIG_SIGCONDTIMEDOUT
- int "SIGCONDTIMEDOUT"
- default 16
- depends on !DISABLE_PTHREAD
- ---help---
- This non-standard signal number is used the implementation of
- pthread_cond_timedwait(). Default 16.
- config SIG_SIGWORK
- int "SIGWORK"
- default 17
- depends on SCHED_WORKQUEUE || LIB_USRWORK
- ---help---
- SIGWORK is a non-standard signal used to wake up the internal NuttX
- worker thread. This setting specifies the signal number that will be
- used for SIGWORK. Default: 17
- endmenu # Signal Numbers
- endmenu # Signal Configuration
- menu "POSIX Message Queue Options"
- depends on !DISABLE_MQUEUE
- config PREALLOC_MQ_MSGS
- int "Number of pre-allocated messages"
- default 4
- ---help---
- The number of pre-allocated message structures. The system manages
- a pool of preallocated message structures to minimize dynamic allocations
- config MQ_MAXMSGSIZE
- int "Maximum message size"
- default 32
- ---help---
- Message structures are allocated with a fixed payload size given by this
- setting (does not include other message structure overhead.
- endmenu # POSIX Message Queue Options
- config MODULE
- bool "Enable loadable OS modules"
- default n
- select LIBC_MODLIB
- select ARCH_USE_MODULE_TEXT if ARCH_HAVE_MODULE_TEXT
- ---help---
- Enable support for loadable OS modules. Default: n
- menu "Work queue support"
- config SCHED_WORKQUEUE
- # bool "Enable worker thread"
- bool
- default n
- ---help---
- Create dedicated "worker" threads to handle delayed or asynchronous
- processing.
- config WQUEUE_NOTIFIER
- bool "Generic work notifier"
- default n
- depends on SCHED_WORKQUEUE
- ---help---
- Enable building of work queue notifier logic that will execute a
- worker function an event occurs. This is is a general purpose
- notifier, but was developed specifically to support poll() logic
- where the poll must wait for an resources to become available.
- config SCHED_HPWORK
- bool "High priority (kernel) worker thread"
- default n
- select SCHED_WORKQUEUE
- ---help---
- Create a dedicated high-priority "worker" thread to handle delayed
- processing from interrupt handlers. This feature is required for
- some drivers but, if there are no complaints, can be safely
- disabled. The high priority worker thread also performs garbage
- collection -- completing any delayed memory deallocations from
- interrupt handlers. If the high-priority worker thread is disabled,
- then that clean up will be performed either by (1) the low-priority
- worker thread, if enabled, and if not (2) the IDLE thread instead
- (which runs at the lowest of priority and may not be appropriate if
- memory reclamation is of high priority)
- For other, less-critical asynchronous or delayed process, the
- low-priority worker thread is recommended.
- if SCHED_HPWORK
- config SCHED_HPNTHREADS
- int "Number of high-priority worker threads"
- default 1
- ---help---
- This options selects multiple, high-priority threads. This is
- essentially a "thread pool" that provides multi-threaded servicing
- of the high-priority work queue. This breaks the serialization
- of the "queue" (hence, it is no longer a queue at all).
- CAUTION: Some drivers may use the work queue to serialize
- operations. They may also use the high-priority work queue if it is
- available. If there are multiple high-priority worker threads, then
- this can result in the loss of that serialization. There may be
- concurrent driver operations running on different HP threads and
- this could lead to a failure. You may need to visit the use of the
- HP work queue on your configuration is you select
- CONFIG_SCHED_HPNTHREADS > 1
- config SCHED_HPWORKPRIORITY
- int "High priority worker thread priority"
- default 224
- ---help---
- The execution priority of the higher priority worker thread.
- The higher priority worker thread is intended to serve as the
- "bottom" half for device drivers. As a consequence it must run at
- a very high, fixed priority. Typically, it should be the highest
- priority thread in your system. Default: 224
- For lower priority, application oriented worker thread support,
- please consider enabling the lower priority work queue. The lower
- priority work queue runs at a lower priority, of course, but has
- the added advantage that it supports "priority inheritance" (if
- PRIORITY_INHERITANCE is also selected): The priority of the lower
- priority worker thread can then be adjusted to match the highest
- priority client.
- config SCHED_HPWORKSTACKSIZE
- int "High priority worker thread stack size"
- default DEFAULT_TASK_STACKSIZE
- ---help---
- The stack size allocated for the worker thread. Default: 2K.
- endif # SCHED_HPWORK
- config SCHED_LPWORK
- bool "Low priority (kernel) worker thread"
- default n
- select SCHED_WORKQUEUE
- ---help---
- If SCHED_LPWORK is defined then a lower-priority work queue will
- be created. This lower priority work queue is better suited for
- more extended, application oriented processing (such as file system
- clean-up operations or asynchronous I/O)
- if SCHED_LPWORK
- config SCHED_LPNTHREADS
- int "Number of low-priority worker threads"
- default 1 if !FS_AIO
- default 4 if FS_AIO
- ---help---
- This options selects multiple, low-priority threads. This is
- essentially a "thread pool" that provides multi-threaded servicing
- of the low-priority work queue. This breaks the serialization
- of the "queue" (hence, it is no longer a queue at all).
- This options is required to support, for example, I/O operations
- that stall waiting for input. If there is only a single thread,
- then the entire low-priority queue processing stalls in such cases.
- Such behavior is necessary to support asynchronous I/O, AIO (for
- example).
- CAUTION: Some drivers may use the work queue to serialize
- operations. They may also use the low-priority work queue if it is
- available. If there are multiple low-priority worker threads, then
- this can result in the loss of that serialization. There may be
- concurrent driver operations running on different LP threads and
- this could lead to a failure. You may need to visit the use of the
- LP work queue on your configuration is you select
- CONFIG_SCHED_LPNTHREADS > 1
- config SCHED_LPWORKPRIORITY
- int "Low priority worker thread priority"
- default 100
- ---help---
- The minimum execution priority of the lower priority worker thread.
- The lower priority worker thread is intended support application-
- oriented functions. The lower priority work queue runs at a lower
- priority, of course, but has the added advantage that it supports
- "priority inheritance" (if PRIORITY_INHERITANCE is also selected):
- The priority of the lower priority worker thread can then be
- adjusted to match the highest priority client. Default: 100
- NOTE: This priority inheritance feature is not automatic. The
- lower priority worker thread will always a fixed priority unless
- you implement logic that calls lpwork_boostpriority() to raise the
- priority of the lower priority worker thread (typically called
- before scheduling the work) and then call the matching
- lpwork_restorepriority() when the work is completed (typically
- called within the work handler at the completion of the work).
- Currently, only the NuttX asynchronous I/O logic uses this dynamic
- prioritization feature.
- The higher priority worker thread, on the other hand, is intended
- to serve as the "bottom" half for device drivers. As a consequence
- it must run at a very high, fixed priority. Typically, it should
- be the highest priority thread in your system.
- config SCHED_LPWORKPRIOMAX
- int "Low priority worker thread maximum priority"
- default 176
- depends on PRIORITY_INHERITANCE
- ---help---
- The maximum execution priority of the lower priority worker thread.
- The lower priority worker thread is intended support application-
- oriented functions. The lower priority work queue runs at a lower
- priority, of course, but has the added advantage that it supports
- "priority inheritance" (if PRIORITY_INHERITANCE is also selected):
- The priority of the lower priority worker thread can then be
- adjusted to match the highest priority client.
- The higher priority worker thread, on the other hand, is intended
- to serve as the "bottom" half for device drivers. As a consequence
- it must run at a very high, fixed priority. Typically, it should
- be the highest priority thread in your system.
- This value provides an upper limit on the priority of the lower
- priority worker thread. This would be necessary, for example, if
- the higher priority worker thread were to defer work to the lower
- priority thread. Clearly, in such a case, you would want to limit
- the maximum priority of the lower priority work thread. Default:
- 176
- config SCHED_LPWORKSTACKSIZE
- int "Low priority worker thread stack size"
- default DEFAULT_TASK_STACKSIZE
- ---help---
- The stack size allocated for the lower priority worker thread. Default: 2K.
- endif # SCHED_LPWORK
- endmenu # Work Queue Support
- menu "Stack and heap information"
- config IDLETHREAD_STACKSIZE
- int "Idle thread stack size"
- default 1024
- ---help---
- The size of the initial stack used by the IDLE thread. The IDLE thread
- is the thread that (1) performs the initial boot of the system up to the
- point where start-up application is spawned, and (2) there after is the
- IDLE thread that executes only when there is no other thread ready to run.
- config PTHREAD_STACK_MIN
- int "Minimum pthread stack size"
- default 256
- ---help---
- Minimum pthread stack size
- config PTHREAD_STACK_DEFAULT
- int "Default pthread stack size"
- default DEFAULT_TASK_STACKSIZE
- ---help---
- Default pthread stack size
- endmenu # Stack and heap information
|