3b0e2be058
The feature depends on ARCH_USE_SEPARATED_SECTION the different memory area has different access speed and cache capability, so the arch can custom allocate them based on section names to achieve performance optimization test: sim:elf sim:sotest Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
1433 lines
39 KiB
Plaintext
1433 lines
39 KiB
Plaintext
#
|
|
# For a description of the syntax of this configuration file,
|
|
# see the file kconfig-language.txt in the NuttX tools repository.
|
|
#
|
|
|
|
choice
|
|
prompt "CPU Architecture"
|
|
default ARCH_ARM
|
|
|
|
config ARCH_ARM
|
|
bool "ARM"
|
|
select ARCH_HAVE_BACKTRACE
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
select ARCH_HAVE_FORK
|
|
select ARCH_HAVE_STACKCHECK
|
|
select ARCH_HAVE_CUSTOMOPT
|
|
select ARCH_HAVE_STDARG_H
|
|
select ARCH_HAVE_SETJMP if !ARCH_TOOLCHAIN_IAR
|
|
select ARCH_HAVE_SYSCALL_HOOKS
|
|
select ARCH_HAVE_RDWR_MEM_CPU_RUN
|
|
select ARCH_HAVE_TCBINFO
|
|
select ARCH_HAVE_THREAD_LOCAL
|
|
---help---
|
|
The ARM architectures
|
|
|
|
config ARCH_ARM64
|
|
bool "ARM64"
|
|
select ALARM_ARCH
|
|
select ARCH_HAVE_BACKTRACE
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
select ARCH_HAVE_STACKCHECK
|
|
select ARCH_HAVE_CUSTOMOPT
|
|
select ARCH_HAVE_STDARG_H
|
|
select ARCH_HAVE_SETJMP
|
|
select ARCH_HAVE_SYSCALL_HOOKS
|
|
select ARCH_HAVE_RDWR_MEM_CPU_RUN
|
|
select ARCH_HAVE_TCBINFO
|
|
select ARCH_HAVE_THREAD_LOCAL
|
|
select ARCH_HAVE_PERF_EVENTS
|
|
select ONESHOT
|
|
select LIBC_ARCH_ELF_64BIT if LIBC_ARCH_ELF
|
|
---help---
|
|
The ARM64 architectures
|
|
|
|
config ARCH_AVR
|
|
bool "AVR"
|
|
select ARCH_NOINTC
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
select ARCH_HAVE_CUSTOMOPT
|
|
---help---
|
|
Atmel 8-bit bit AVR and 32-bit AVR32 architectures
|
|
|
|
config ARCH_HC
|
|
bool "Freescale HC"
|
|
select ARCH_NOINTC
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
---help---
|
|
Freescale HC architectures (M9S12)
|
|
|
|
config ARCH_MIPS
|
|
bool "MIPS"
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
select ARCH_HAVE_CUSTOMOPT
|
|
---help---
|
|
MIPS architectures (PIC32)
|
|
|
|
config ARCH_MISOC
|
|
bool "MISOC"
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
select ARCH_HAVE_CUSTOMOPT
|
|
select ARCH_HAVE_STDARG_H
|
|
---help---
|
|
MISOC
|
|
|
|
config ARCH_RENESAS
|
|
bool "Renesas"
|
|
select ARCH_NOINTC
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
---help---
|
|
Renesas architectures (SH and M16C).
|
|
|
|
config ARCH_RISCV
|
|
bool "RISC-V"
|
|
select ARCH_HAVE_BACKTRACE
|
|
select ARCH_HAVE_CPUINFO
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
select ARCH_HAVE_STACKCHECK
|
|
select ARCH_HAVE_FORK
|
|
select ARCH_HAVE_CUSTOMOPT
|
|
select ARCH_HAVE_SETJMP
|
|
select ARCH_HAVE_STDARG_H
|
|
select ARCH_HAVE_SYSCALL_HOOKS
|
|
select ARCH_HAVE_RDWR_MEM_CPU_RUN
|
|
select ARCH_HAVE_TCBINFO
|
|
select ARCH_HAVE_THREAD_LOCAL
|
|
select ARCH_HAVE_POWEROFF
|
|
select ARCH_HAVE_LAZYFPU if ARCH_HAVE_FPU
|
|
---help---
|
|
RISC-V 32 and 64-bit RV32 / RV64 architectures.
|
|
|
|
config ARCH_SIM
|
|
bool "Simulation"
|
|
select ARCH_HAVE_BACKTRACE
|
|
select ARCH_HAVE_MULTICPU
|
|
select ARCH_HAVE_RTC_SUBSECONDS
|
|
select ARCH_HAVE_SERIAL_TERMIOS
|
|
select ARCH_HAVE_SYSCALL_HOOKS
|
|
select ARCH_HAVE_TICKLESS
|
|
select ARCH_HAVE_POWEROFF
|
|
select ARCH_HAVE_TESTSET
|
|
select ARCH_HAVE_FORK if !HOST_WINDOWS
|
|
select ARCH_HAVE_SETJMP
|
|
select ARCH_HAVE_CUSTOMOPT
|
|
select ARCH_HAVE_TCBINFO
|
|
select ARCH_HAVE_TEXT_HEAP
|
|
select ARCH_SETJMP_H
|
|
select ALARM_ARCH
|
|
select ONESHOT
|
|
select SERIAL_CONSOLE
|
|
select SERIAL_IFLOWCONTROL
|
|
select SCHED_HPWORK
|
|
select ARCH_HAVE_CPUINFO
|
|
---help---
|
|
Linux/Cygwin user-mode simulation.
|
|
|
|
config ARCH_X86
|
|
bool "x86"
|
|
select ARCH_HAVE_TCBINFO
|
|
---help---
|
|
Intel x86 architectures.
|
|
|
|
config ARCH_X86_64
|
|
bool "x86_64"
|
|
select ARCH_HAVE_TCBINFO
|
|
select ARCH_HAVE_FPU
|
|
select ARCH_HAVE_DPFPU
|
|
select ARCH_HAVE_MULTICPU
|
|
select ARCH_HAVE_TESTSET
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
select ARCH_HAVE_CUSTOMOPT
|
|
select PCI_LATE_DRIVERS_REGISTER if PCI
|
|
select LIBC_ARCH_ELF_64BIT if LIBC_ARCH_ELF
|
|
select ARCH_TOOLCHAIN_GNU
|
|
---help---
|
|
x86-64 architectures.
|
|
|
|
config ARCH_XTENSA
|
|
bool "Xtensa"
|
|
select ARCH_HAVE_BACKTRACE
|
|
select ARCH_HAVE_CPUINFO
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
select ARCH_HAVE_STACKCHECK
|
|
select ARCH_HAVE_CUSTOMOPT
|
|
select ARCH_HAVE_TCBINFO
|
|
select ARCH_HAVE_STDARG_H
|
|
select ARCH_HAVE_SETJMP if ARCH_TOOLCHAIN_GNU
|
|
select ARCH_HAVE_SYSCALL_HOOKS
|
|
select ARCH_HAVE_PERF_EVENTS
|
|
---help---
|
|
Cadence® Tensilica® Xtensa® actictures.
|
|
|
|
config ARCH_Z16
|
|
bool "ZNEO"
|
|
select ARCH_HAVE_HEAP2
|
|
---help---
|
|
ZiLOG ZNEO 16-bit architectures (z16f).
|
|
|
|
config ARCH_Z80
|
|
bool "z80"
|
|
select ARCH_HAVE_HEAP2
|
|
---help---
|
|
ZiLOG 8-bit architectures (z80, ez80, z8).
|
|
|
|
config ARCH_OR1K
|
|
bool "OpenRISC"
|
|
---help---
|
|
OpenRISC architectures.
|
|
|
|
config ARCH_SPARC
|
|
bool "SPARC"
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
select ARCH_HAVE_CUSTOMOPT
|
|
select ARCH_HAVE_TCBINFO
|
|
---help---
|
|
SPARC architectures (SPARC V8)
|
|
|
|
config ARCH_TRICORE
|
|
bool "Infineon TriCore"
|
|
select ARCH_HAVE_INTERRUPTSTACK
|
|
select ARCH_HAVE_STACKCHECK
|
|
select ARCH_HAVE_CUSTOMOPT
|
|
select ARCH_HAVE_TCBINFO
|
|
---help---
|
|
Infineon 32-bit AURIX TriCore architectures
|
|
|
|
endchoice
|
|
|
|
config ARCH
|
|
string
|
|
default "arm" if ARCH_ARM
|
|
default "arm64" if ARCH_ARM64
|
|
default "avr" if ARCH_AVR
|
|
default "hc" if ARCH_HC
|
|
default "mips" if ARCH_MIPS
|
|
default "misoc" if ARCH_MISOC
|
|
default "renesas" if ARCH_RENESAS
|
|
default "risc-v" if ARCH_RISCV
|
|
default "sim" if ARCH_SIM
|
|
default "x86" if ARCH_X86
|
|
default "x86_64" if ARCH_X86_64
|
|
default "xtensa" if ARCH_XTENSA
|
|
default "z16" if ARCH_Z16
|
|
default "z80" if ARCH_Z80
|
|
default "or1k" if ARCH_OR1K
|
|
default "sparc" if ARCH_SPARC
|
|
default "tricore" if ARCH_TRICORE
|
|
|
|
source "arch/arm/Kconfig"
|
|
source "arch/arm64/Kconfig"
|
|
source "arch/avr/Kconfig"
|
|
source "arch/hc/Kconfig"
|
|
source "arch/mips/Kconfig"
|
|
source "arch/misoc/Kconfig"
|
|
source "arch/renesas/Kconfig"
|
|
source "arch/risc-v/Kconfig"
|
|
source "arch/sim/Kconfig"
|
|
source "arch/x86/Kconfig"
|
|
source "arch/x86_64/Kconfig"
|
|
source "arch/xtensa/Kconfig"
|
|
source "arch/z16/Kconfig"
|
|
source "arch/z80/Kconfig"
|
|
source "arch/or1k/Kconfig"
|
|
source "arch/sparc/Kconfig"
|
|
source "arch/tricore/Kconfig"
|
|
|
|
config ARCH_CHIP_CUSTOM
|
|
bool "Custom Chip Support"
|
|
default n
|
|
|
|
if ARCH_CHIP_CUSTOM
|
|
menu "Custom Chip Configuration"
|
|
|
|
config ARCH_CHIP_CUSTOM_NAME
|
|
string "Custom chip name"
|
|
default ""
|
|
---help---
|
|
This is a name for the chip. It is not used except to return the
|
|
information via the NSH uname command.
|
|
|
|
config ARCH_CHIP_CUSTOM_DIR
|
|
string "Custom chip directory"
|
|
default ""
|
|
---help---
|
|
If the custom chip configuration is selected, then it is necessary
|
|
to also tell the build system where it can find the chip directory
|
|
for the custom chip.
|
|
|
|
In this case, the chip directory is assumed to lie outside the
|
|
NuttX directory. The provided path must then be a full, absolute
|
|
path to some location outside of the NuttX source tree (like
|
|
"~/projects/mychip").
|
|
|
|
config ARCH_CHIP_CUSTOM_DIR_RELPATH
|
|
bool "Relative custom chip directory"
|
|
default y
|
|
---help---
|
|
Specifies that the chip directory is relative to the NuttX directory.
|
|
|
|
endmenu # Custom Chip Configuration
|
|
endif #ARCH_CHIP_CUSTOM
|
|
|
|
source "$BINDIR/arch/dummy/Kconfig"
|
|
|
|
config ARCH_TOOLCHAIN_IAR
|
|
bool
|
|
default n
|
|
|
|
config ARCH_TOOLCHAIN_GNU
|
|
bool
|
|
default n
|
|
|
|
config ARCH_TOOLCHAIN_CLANG
|
|
bool
|
|
select ARCH_TOOLCHAIN_GNU
|
|
default n
|
|
|
|
config ARCH_TOOLCHAIN_TASKING
|
|
bool
|
|
default n
|
|
|
|
config ARCH_TOOLCHAIN_GHS
|
|
bool
|
|
select ARCH_TOOLCHAIN_GNU
|
|
default n
|
|
|
|
config ARCH_GNU_NO_WEAKFUNCTIONS
|
|
bool
|
|
depends on ARCH_TOOLCHAIN_GNU
|
|
default n
|
|
---help---
|
|
Disable support for weak functions.
|
|
|
|
config ARCH_SIZET_LONG
|
|
bool "size_t is type long"
|
|
default n
|
|
---help---
|
|
size_t may be type long or type int. This matters for some
|
|
C++ library routines because the NuttX size_t might not have
|
|
the same underlying type as your toolchain's size_t.
|
|
|
|
config ARCH_COVERAGE
|
|
bool "Enable code coverage analysis"
|
|
select HAVE_CXXINITIALIZE
|
|
default n
|
|
---help---
|
|
Generate code coverage
|
|
|
|
config ARCH_COVERAGE_ALL
|
|
bool "Enable code coverage for the entire image"
|
|
depends on ARCH_COVERAGE
|
|
default n
|
|
---help---
|
|
This option activates code coverage instrumentation for the
|
|
entire image. If you don't enable this option, you have to
|
|
explicitly specify "-fprofile-generate -ftest-coverage" for
|
|
the files/directories you want to check. Enabling this option
|
|
will get image size increased and performance decreased
|
|
significantly.
|
|
|
|
config ARCH_INSTRUMENT_ALL
|
|
bool "Instrument All"
|
|
default n
|
|
---help---
|
|
Add instrument to all source files. we can use instrument_register
|
|
to register the instrument function.
|
|
|
|
comment "Architecture Options"
|
|
|
|
config ARCH_NOINTC
|
|
bool
|
|
default n
|
|
|
|
config ARCH_VECNOTIRQ
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_IRQTRIGGER
|
|
bool
|
|
default n
|
|
depends on !ARCH_NOINTC
|
|
|
|
config ARCH_DMA
|
|
bool
|
|
default n
|
|
|
|
config ARCH_DMA_NO_FLASH_TRANSFER
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_IRQPRIO
|
|
bool
|
|
default n
|
|
|
|
config ARCH_ICACHE
|
|
bool
|
|
default n
|
|
|
|
config ARCH_ICACHE_LOCK
|
|
bool
|
|
depends on ARCH_ICACHE
|
|
default n
|
|
|
|
config ARCH_DCACHE
|
|
bool
|
|
default n
|
|
|
|
config ARCH_DCACHE_LOCK
|
|
bool
|
|
depends on ARCH_DCACHE
|
|
default n
|
|
|
|
config ARCH_L2CACHE
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_ADDRENV
|
|
bool
|
|
default n
|
|
|
|
config ARCH_NEED_ADDRENV_MAPPING
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_EXTRA_HEAPS
|
|
bool
|
|
default n
|
|
---help---
|
|
Special memory regions used as separate heaps
|
|
|
|
config ARCH_HAVE_TEXT_HEAP
|
|
bool
|
|
default n
|
|
---help---
|
|
Special memory region for dynamic code loading
|
|
|
|
config ARCH_HAVE_TEXT_HEAP_SEPARATE_DATA_ADDRESS
|
|
bool
|
|
default n
|
|
---help---
|
|
Textheap might have separate instruction/data mappings
|
|
|
|
config ARCH_HAVE_TEXT_HEAP_WORD_ALIGNED_READ
|
|
bool
|
|
default n
|
|
---help---
|
|
Loads from the instruction mapping of textheap need to be word-aligned
|
|
|
|
config ARCH_HAVE_DATA_HEAP
|
|
bool
|
|
default n
|
|
---help---
|
|
Special memory region for dynamic data loading
|
|
|
|
config ARCH_HAVE_COPY_SECTION
|
|
bool
|
|
default n
|
|
---help---
|
|
Section copying for dynamic code loading
|
|
|
|
config ARCH_HAVE_MULTICPU
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_FORK
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_FPU
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_DPFPU
|
|
bool
|
|
default n
|
|
select ARCH_HAVE_FPU
|
|
|
|
config ARCH_HAVE_QPFPU
|
|
bool
|
|
default n
|
|
select ARCH_HAVE_DPFPU
|
|
|
|
config ARCH_HAVE_LAZYFPU
|
|
bool
|
|
default n
|
|
depends on ARCH_HAVE_FPU
|
|
|
|
config ARCH_HAVE_MMU
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_MPU
|
|
bool
|
|
default n
|
|
|
|
config ARCH_NAND_HWECC
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_EXTCLK
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_POWEROFF
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_PROGMEM
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_PROGMEM_READ
|
|
bool
|
|
default n
|
|
depends on ARCH_HAVE_PROGMEM
|
|
|
|
config ARCH_HAVE_RESET
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_TESTSET
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_THREAD_LOCAL
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_FETCHADD
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_RTC_SUBSECONDS
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_SYSCALL_HOOKS
|
|
bool
|
|
default n
|
|
---help---
|
|
Indicates that the architecture supports the system call hooks as
|
|
required if CONFIG_SCHED_INSTRUMENTATION_SYSCALL is enabled. Refer
|
|
to sched/Kconfig for additional information.
|
|
|
|
config ARCH_HAVE_BACKTRACE
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_DEBUG
|
|
bool "Architecture have debug support"
|
|
default n
|
|
|
|
config ARCH_HAVE_PERF_EVENTS
|
|
bool
|
|
default n
|
|
---help---
|
|
The architecture supports hardware performance counting.
|
|
|
|
config ARCH_PERF_EVENTS
|
|
bool "Configure hardware performance counting"
|
|
default y if SCHED_CRITMONITOR || SCHED_IRQMONITOR || RPMSG_PING || SEGGER_SYSVIEW
|
|
default n
|
|
depends on ARCH_HAVE_PERF_EVENTS
|
|
---help---
|
|
Enable hardware performance counter support for perf events. If
|
|
disabled, perf events will use software events only.
|
|
|
|
config ARCH_HAVE_BOOTLOADER
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_CPUINFO
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_TCBINFO
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_ELF_EXECUTABLE
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAVE_TRUSTZONE
|
|
bool
|
|
default n
|
|
---help---
|
|
Automatically selected to indicate that the ARM CPU supports
|
|
TrustZone.
|
|
|
|
choice
|
|
prompt "TrustZone Configuration"
|
|
default ARCH_TRUSTZONE_DISABLED
|
|
depends on ARCH_HAVE_TRUSTZONE
|
|
|
|
config ARCH_TRUSTZONE_DISABLED
|
|
bool "TrustZone disabled, all CPUs operate in secure state"
|
|
|
|
config ARCH_TRUSTZONE_SECURE
|
|
bool "TrustZone enabled, all CPUs operate secure state"
|
|
|
|
config ARCH_TRUSTZONE_NONSECURE
|
|
bool "TrustZone enabled, all CPUs operate non-secure state"
|
|
|
|
endchoice # TrustZone Configuration
|
|
|
|
config ARCH_FPU
|
|
bool "FPU support"
|
|
default y
|
|
depends on ARCH_HAVE_FPU
|
|
---help---
|
|
Build in support for the Floating Point Unit (FPU).
|
|
Check your chip specifications first; not all chips support the FPU.
|
|
|
|
config ARCH_DPFPU
|
|
bool "Double precision FPU support"
|
|
default y
|
|
depends on ARCH_FPU && ARCH_HAVE_DPFPU
|
|
---help---
|
|
Enable toolchain support for double precision (64-bit) floating
|
|
point if both the toolchain and the hardware support it.
|
|
|
|
config ARCH_QPFPU
|
|
bool "Quad-Precision FPU support"
|
|
default y
|
|
depends on ARCH_FPU && ARCH_HAVE_DPFPU && ARCH_HAVE_QPFPU
|
|
---help---
|
|
Enable toolchain support for quadruple precision (128 bits or 16 bytes) floating
|
|
point if both the toolchain and the hardware support it.
|
|
|
|
config ARCH_LAZYFPU
|
|
bool "Enable lazy FPU state save / restore"
|
|
default n
|
|
depends on ARCH_FPU && ARCH_HAVE_LAZYFPU
|
|
---help---
|
|
Enable lazy FPU state save and restore. Normally FPU state is saved
|
|
and restored with the integer context registers, if the task is using
|
|
FPU. The state is typically saved into the task's user stack upon
|
|
exception entry or context switch out, and restored when the
|
|
exception returns or context switches back in.
|
|
|
|
As the kernel does not use FPU, this can be optimized with the help
|
|
of the FPU hardware status and a bit of code logic inside the kernel.
|
|
The logic keeps track of the FPU state, which can be "unused",
|
|
"dirty" or "clean". A clean state means the FPU has not been used
|
|
since the last state save, while the dirty state indicates that the
|
|
FPU has been used.
|
|
|
|
The optimization saves / restores FPU registers only if:
|
|
- A context change has happened, save and restore does not happen
|
|
during exception entry / return to the same task
|
|
- FPU is in use (state is not unused) and
|
|
- FPU status is dirty, i.e. FPU has been used after the last
|
|
- FPU restore happens when status is in dirty or clean
|
|
|
|
This saves CPU time as the FPU registers do not have to be moved in
|
|
and out when handling an exception that does not result in a context
|
|
switch.
|
|
|
|
The tradeoff with the lazy FPU feature is that it requires a static
|
|
memory allocation from the task's TCB to store the FPU registers,
|
|
while the non-lazy style can use stack memory for storing the FPU
|
|
registers, saving memory as the stack frame for the FPU registers can
|
|
be skipped if the FPU is not in use.
|
|
|
|
config ARCH_USE_MMU
|
|
bool "Enable MMU"
|
|
default n
|
|
depends on ARCH_HAVE_MMU
|
|
---help---
|
|
The architecture supports supports an MMU. Enable this option in
|
|
order to enable use of the MMU. For most architectures, this is
|
|
not really an option: It is required to use the MMU. In those
|
|
cases, this selection will always be forced.
|
|
|
|
config ARCH_USE_MPU
|
|
bool "Enable MPU"
|
|
default n
|
|
depends on ARCH_HAVE_MPU
|
|
---help---
|
|
The architecture supports supports an MPU. Enable this option in
|
|
order to enable use of the MPU. For most architectures, this option
|
|
is enabled by other, platform-specific logic. In those cases, this
|
|
selection will always be forced.
|
|
|
|
config ARCH_USE_TEXT_HEAP
|
|
bool "Enable separate text allocation for dynamic code loading"
|
|
default n
|
|
depends on ARCH_HAVE_TEXT_HEAP
|
|
---help---
|
|
This option enables architecture-specific memory allocator
|
|
for dynamic code loading. For example, ESP32 has separate memory
|
|
regions for instruction and data and the memory region used for
|
|
usual malloc doesn't work for instruction.
|
|
|
|
config ARCH_USE_DATA_HEAP
|
|
bool "Enable separate data allocation for dynamic data loading"
|
|
default n
|
|
depends on ARCH_HAVE_DATA_HEAP
|
|
---help---
|
|
This option enables architecture-specific memory allocator
|
|
for dynamic data loading.
|
|
|
|
config ARCH_USE_SEPARATED_SECTION
|
|
bool "Enable separate section allocation for dynamic loading"
|
|
default n
|
|
depends on ARCH_USE_TEXT_HEAP || ARCH_USE_DATA_HEAP
|
|
---help---
|
|
This option enables loading different sections into different
|
|
memory areas, allowing for different speeds.
|
|
|
|
menuconfig ARCH_ADDRENV
|
|
bool "Address environments"
|
|
default n
|
|
depends on ARCH_HAVE_ADDRENV && SCHED_LPWORK
|
|
---help---
|
|
Support per-task address environments using the MMU... i.e., support
|
|
"processes"
|
|
|
|
config ARCH_USE_COPY_SECTION
|
|
bool "Enable arch copy section by self for dynamic code loading"
|
|
default n
|
|
depends on ARCH_HAVE_COPY_SECTION
|
|
---help---
|
|
This option enables architecture-specific memory copy for
|
|
dynamic code loading. For example, Ambiq has MRAM regions
|
|
for instruction which can't load by the memcpy directly.
|
|
|
|
if ARCH_ADDRENV && ARCH_NEED_ADDRENV_MAPPING
|
|
|
|
config ARCH_TEXT_VBASE
|
|
hex "Virtual .text base"
|
|
---help---
|
|
The virtual address of the beginning the .text region
|
|
|
|
config ARCH_DATA_VBASE
|
|
hex "Virtual .bss/.data base"
|
|
---help---
|
|
The virtual address of the beginning of the .bss/.data region.
|
|
|
|
config ARCH_HEAP_VBASE
|
|
hex "Virtual heap base"
|
|
---help---
|
|
The virtual address of the beginning of the heap region.
|
|
|
|
config ARCH_VMA_MAPPING
|
|
bool "Support runtime memory mapping into SHM area"
|
|
default n
|
|
|
|
config ARCH_KVMA_MAPPING
|
|
bool
|
|
default n
|
|
|
|
config ARCH_SHM_VBASE
|
|
hex "Shared memory base"
|
|
depends on ARCH_VMA_MAPPING
|
|
---help---
|
|
The virtual address of the beginning of the shared memory region.
|
|
|
|
config ARCH_KMAP_VBASE
|
|
hex "Kernel dynamic virtual mappings base"
|
|
depends on ARCH_KVMA_MAPPING
|
|
---help---
|
|
The virtual address of the beginning of the kernel dynamic mapping
|
|
region.
|
|
|
|
config ARCH_TEXT_NPAGES
|
|
int "Max .text pages"
|
|
default 1
|
|
---help---
|
|
The maximum number of pages that can allocated for the .text region.
|
|
This, along with knowledge of the page size, determines the size of
|
|
the .text virtual address space. Default is 1.
|
|
|
|
config ARCH_DATA_NPAGES
|
|
int "Max .bss/.data pages"
|
|
default 1
|
|
---help---
|
|
The maximum number of pages that can allocated for the .bss/.data
|
|
region. This, along with knowledge of the page size, determines the
|
|
size of the .bss/.data virtual address space. Default is 1.
|
|
|
|
config ARCH_HEAP_NPAGES
|
|
int "Max heap pages"
|
|
default 1
|
|
---help---
|
|
The maximum number of pages that can allocated for the heap region.
|
|
This, along with knowledge of the page size, determines the size of
|
|
the heap virtual address space. Default is 1.
|
|
|
|
if ARCH_VMA_MAPPING
|
|
|
|
config ARCH_SHM_MAXREGIONS
|
|
int "Max shared memory regions"
|
|
default 1
|
|
---help---
|
|
The maximum number of regions that can be used with SysV shared
|
|
memory interface. This hard-coded value permits static allocation of
|
|
the shared memory data structures and serves no other purpose.
|
|
Default is 1.
|
|
|
|
config ARCH_SHM_NPAGES
|
|
int "Max size of userspace VM mapping in pages"
|
|
default 1
|
|
---help---
|
|
The max size of the virtual memory region for shared memory,
|
|
userspace device mappings etc.
|
|
|
|
endif # ARCH_VMA_MAPPING
|
|
|
|
config ARCH_KMAP_NPAGES
|
|
int "Max kernel dynamic mapping pages"
|
|
default 1
|
|
depends on ARCH_KVMA_MAPPING
|
|
---help---
|
|
The maximum amount of pages that a kernel can use for dynamically
|
|
mapping physical pages to itself.
|
|
|
|
config ARCH_STACK_DYNAMIC
|
|
bool "Dynamic user stack"
|
|
default n
|
|
depends on BUILD_KERNEL && EXPERIMENTAL
|
|
---help---
|
|
Select this option if the user process stack resides in its own
|
|
address space. The naming of this selection implies that dynamic
|
|
stack allocation is supported. Certainly this option must be set if
|
|
dynamic stack allocation is supported by a platform. But the more
|
|
general meaning of this configuration environment is simply that the
|
|
stack has its own address space.
|
|
|
|
NOTE: This option not yet fully implemented in the code base.
|
|
Hence, it is marked EXPERIMENTAL: Do not enable it unless you plan
|
|
finish the implementation.
|
|
|
|
if ARCH_STACK_DYNAMIC
|
|
|
|
config ARCH_STACK_VBASE
|
|
hex "Virtual stack base"
|
|
---help---
|
|
The virtual address of the beginning the stack region
|
|
|
|
config ARCH_STACK_NPAGES
|
|
int "Max. stack pages"
|
|
default 1
|
|
---help---
|
|
The maximum number of pages that can allocated for the stack region.
|
|
This, along with knowledge of the page size, determines the size of
|
|
the stack virtual address space. Default is 1.
|
|
|
|
endif # ARCH_STACK_DYNAMIC
|
|
|
|
config ARCH_KERNEL_STACK
|
|
bool "Kernel process stack"
|
|
default LIBC_EXECFUNCS
|
|
depends on BUILD_KERNEL
|
|
---help---
|
|
It this option is selected, then every user process will have two
|
|
stacks: A large, potentially dynamically sized user stack and small
|
|
kernel stack that is used during system call process.
|
|
|
|
If this option is not selected, then kernel system calls will simply
|
|
use the caller's user stack. So, in most cases, this option is not
|
|
required. However, this option is *required* if both BUILD_KERNEL
|
|
and LIBC_EXECFUNCS are selected. Why? Because when we instantiate
|
|
and initialize the address environment of the new user process, we
|
|
will temporarily lose the address environment of the old user
|
|
process, including its stack contents. The kernel C logic will
|
|
crash immediately with no valid stack in place.
|
|
|
|
When this option is selected, the smaller kernel stack stays in
|
|
place during system call processing event though the original user
|
|
stack may or may not be accessible.
|
|
|
|
if ARCH_KERNEL_STACK
|
|
|
|
config ARCH_KERNEL_STACKSIZE
|
|
int "Kernel stack size"
|
|
default 1568
|
|
---help---
|
|
The common size of each process's kernel stack
|
|
|
|
endif # ARCH_KERNEL_STACK
|
|
|
|
config ARCH_PGPOOL_MAPPING
|
|
bool "Have page pool mapping"
|
|
default n
|
|
---help---
|
|
If there is a MMU mapping in place for the page pool memory, then
|
|
this mapping can be utilized to simplify some page table operations.
|
|
Otherwise, a temporary mapping will have to be established each time
|
|
it is necessary to modify the contents of a page.
|
|
|
|
if ARCH_PGPOOL_MAPPING
|
|
|
|
config ARCH_PGPOOL_PBASE
|
|
hex "Page pool physical address"
|
|
default 0x0
|
|
---help---
|
|
The physical address of the start of the page pool memory. This
|
|
setting is probably equivalent to other platform specific definitions
|
|
but is required again in order to modularize the common address
|
|
environment logic.
|
|
|
|
config ARCH_PGPOOL_VBASE
|
|
hex "Page pool virtual address"
|
|
default 0x0
|
|
---help---
|
|
The virtual address of the start of the page pool memory. This
|
|
setting is probably equivalent to other platform specific definitions
|
|
but is required again in order to modularize the common address
|
|
environment logic.
|
|
|
|
config ARCH_PGPOOL_SIZE
|
|
int "Page pool size (bytes)"
|
|
default 0
|
|
---help---
|
|
The size of the page pool memory in bytes. This setting is probably
|
|
equivalent to other platform specific definitions but is required again
|
|
in order to modularize the common address environment logic.
|
|
|
|
endif # ARCH_PGPOOL_MAPPING
|
|
endif # ARCH_ADDRENV && ARCH_NEED_ADDRENV_MAPPING
|
|
|
|
config PAGING
|
|
bool "On-demand paging"
|
|
default n
|
|
depends on BUILD_KERNEL && ARCH_USE_MMU && !ARCH_ROMPGTABLE && !LEGACY_PAGING
|
|
---help---
|
|
If set =y in your configation file, this setting will enable on-demand
|
|
paging, which relies on a MMU to enable larger virtual memory spaces
|
|
and map it to physical memory on-demand (usually during a page-fault
|
|
exception).
|
|
|
|
menuconfig LEGACY_PAGING
|
|
bool "Legacy On-demand paging"
|
|
default n
|
|
depends on EXPERIMENTAL && ARCH_USE_MMU && !ARCH_ROMPGTABLE
|
|
---help---
|
|
If set =y in your configation file, this setting will enable lazy loading
|
|
backed up by the experimental on-demand paging feature as described in
|
|
https://nuttx.apache.org/docs/latest/components/paging.html.
|
|
|
|
if LEGACY_PAGING
|
|
|
|
config PAGING_PAGESIZE
|
|
int "Page size (bytes)"
|
|
default 4096
|
|
---help---
|
|
The size of one managed page. This must be a value supported by the
|
|
processor's memory management unit
|
|
|
|
config PAGING_NLOCKED
|
|
int "Number of locked pages"
|
|
default 48
|
|
---help---
|
|
This is the number of locked pages in the memory map.
|
|
|
|
config PAGING_CUSTOM_BASE
|
|
bool "Custom paging base address"
|
|
default n
|
|
---help---
|
|
By default, the page begins at RAM_START/VSTART. That base address
|
|
can be changed if this value is selected.
|
|
|
|
if PAGING_CUSTOM_BASE
|
|
|
|
config PAGING_LOCKED_PBASE
|
|
hex "Physical base address"
|
|
|
|
config PAGING_LOCKED_VBASE
|
|
hex "Virtual base address"
|
|
|
|
endif # PAGING_CUSTOM_BASE
|
|
|
|
config PAGING_NPPAGED
|
|
int "Number of physical pages"
|
|
default 256
|
|
---help---
|
|
This is the number of physical pages available to support the paged
|
|
text region.
|
|
|
|
config PAGING_NVPAGED
|
|
int "Number of virtual pages"
|
|
default 1024
|
|
---help---
|
|
This actual size of the virtual paged text region (in pages). This
|
|
is also the number of virtual pages required to span the entire
|
|
paged region. The on-demand paging feature is intended to support
|
|
only the case where the virtual paged text area is much larger the
|
|
available physical pages. Otherwise, why would you enable on-demand paging?
|
|
|
|
config PAGING_NDATA
|
|
int "Number of data pages"
|
|
default 256
|
|
---help---
|
|
This is the number of data pages in the memory map. The data region
|
|
will extend to the end of RAM unless overridden by a setting in the
|
|
configuration file.
|
|
|
|
NOTE: In some architectures, it may be necessary to take some memory
|
|
from the end of RAM for page tables or other system usage. The
|
|
configuration settings and linker directives must be cognizant of
|
|
that: PAGING_NDATA should be defined to prevent the data region from
|
|
extending all the way to the end of memory.
|
|
|
|
config PAGING_DEFPRIO
|
|
int "Page fill worker thread priority"
|
|
default 100
|
|
---help---
|
|
The default, minimum priority of the page fill worker thread. The
|
|
priority of the page fill work thread will be boosted boosted
|
|
dynamically so that it matches the priority of the task on behalf
|
|
of which it performs the fill. This defines the minimum priority
|
|
that will be used. Default: 100.
|
|
|
|
config PAGING_STACKSIZE
|
|
int "Page fill worker thread stack size"
|
|
default 1024
|
|
---help---
|
|
Defines the size of the allocated stack for the page fill worker
|
|
thread. Default: 1024.
|
|
|
|
config PAGING_BLOCKINGFILL
|
|
bool "Blocking fill"
|
|
default n
|
|
---help---
|
|
The architecture specific up_fillpage() function may be blocking
|
|
or non-blocking. If defined, this setting indicates that the
|
|
up_fillpage() implementation will block until the transfer is
|
|
completed. Default: Undefined (non-blocking).
|
|
|
|
config PAGING_WORKPERIOD
|
|
int "Work period (usec)"
|
|
default 500000
|
|
---help---
|
|
The page fill worker thread will wake periodically even if there
|
|
is no mapping to do. This selection controls that wake-up period
|
|
(in microseconds). This wake-up a failsafe that will handle any
|
|
cases where a single is lost (that would really be a bug and
|
|
shouldn't happen!) and also supports timeouts for case of non-
|
|
blocking, asynchronous fills (see CONFIG_PAGING_TIMEOUT_TICKS).
|
|
|
|
config PAGING_TIMEOUT
|
|
bool "Paging timeout"
|
|
default n
|
|
---help---
|
|
If defined, the implementation will monitor the (asynchronous) page
|
|
fill logic. If the fill takes longer than than a timeout value,
|
|
then a fatal error will be declared. Default: No timeouts monitored
|
|
|
|
config PAGING_TIMEOUT_TICKS
|
|
int "Paging timeout ticks"
|
|
default 10
|
|
depends on PAGING_TIMEOUT
|
|
---help---
|
|
If PAGING_TIMEOUT is defined, then implementation will monitor the
|
|
(asynchronous) page fill logic. If the fill takes longer than this
|
|
number if microseconds, then a fatal error will be declared.
|
|
Default: No timeouts monitored
|
|
|
|
endif # LEGACY_PAGING
|
|
|
|
config ARCH_IRQPRIO
|
|
bool "Prioritized interrupt support"
|
|
default n
|
|
depends on ARCH_HAVE_IRQPRIO
|
|
---help---
|
|
Enable support for prioritized interrupts.
|
|
|
|
NOTE: The use of interrupt priorities implies that you also have
|
|
support for nested interrupts. Most architectures do not support
|
|
nesting of interrupts or, if they do, they only supported nested
|
|
interrupts with certain configuration options. So this selection
|
|
should be used with caution.
|
|
|
|
config ARCH_STACKDUMP
|
|
bool "Dump stack on assertions"
|
|
default n
|
|
select DEBUG_ALERT
|
|
---help---
|
|
Enable to do stack dumps after assertions
|
|
|
|
config ARCH_STACKDUMP_MAX_LENGTH
|
|
int "The maximum length for dump stack on assertions"
|
|
depends on ARCH_STACKDUMP
|
|
default 0
|
|
|
|
config ARCH_USBDUMP
|
|
bool "Dump USB trace data"
|
|
default n
|
|
depends on USBDEV_TRACE
|
|
---help---
|
|
Enable to do USB trace after assertions
|
|
|
|
config ARCH_DEADLOCKDUMP
|
|
bool "Dump dead lock thread"
|
|
default "n"
|
|
---help---
|
|
This option will dump the dead lock thread when assert happen..
|
|
|
|
config ENDIAN_BIG
|
|
bool "Big Endian Architecture"
|
|
default n
|
|
depends on !ARCH_RISCV
|
|
---help---
|
|
Select if architecture operates using big-endian byte ordering.
|
|
|
|
config ARCH_IDLE_CUSTOM
|
|
bool "Custom IDLE loop"
|
|
default n
|
|
---help---
|
|
Each architecture provides a "default" IDLE loop that exits when the
|
|
MCU has nothing else to do. This default IDLE loop can be replaced
|
|
by a custom, board-specific IDLE loop by setting this option. Such
|
|
a custom IDLE loop may do things like a continuous built-in test or
|
|
perhaps or IDLE low power operations.
|
|
|
|
NOTE: As of this writing, this capability is only supported by ARM
|
|
and MIPS architectures. However, the implementation is trivial: If
|
|
CONFIG_ARCH_IDLE_CUSTOM is defined, then the default IDLE loop file
|
|
is not included in the MCU-specific Make.defs file.
|
|
|
|
config ARCH_CUSTOM_PMINIT
|
|
bool "Custom PM initialization"
|
|
default n
|
|
depends on PM
|
|
---help---
|
|
Each architecture provides default power management (PM)
|
|
initialization that is called automatically when the system is
|
|
started. This default PM initialization can be replaced by custom,
|
|
board-specific PM initialization by setting this option. Such a
|
|
custom initialization may do additional PM-related initialization
|
|
that is unique to the board power management requirements.
|
|
|
|
NOTE: As of this writing, this capability is only supported by the
|
|
STM32. However, the implementation is trivial: If CONFIG_ARCH_CUSTOM_PMINIT,
|
|
then the default PM initialization is not included in the MCU-specific
|
|
Make.defs file.
|
|
|
|
config ARCH_HAVE_RAMFUNCS
|
|
bool
|
|
default n
|
|
|
|
config ARCH_RAMFUNCS
|
|
bool "Copy functions to RAM on startup"
|
|
default y
|
|
depends on ARCH_HAVE_RAMFUNCS
|
|
---help---
|
|
Copy some functions to RAM at boot time. This is done in some
|
|
architectures to improve performance. In other cases, it is done
|
|
so that FLASH can be reconfigured while the MCU executes out of
|
|
SRAM.
|
|
|
|
config ARCH_HAVE_RAMVECTORS
|
|
bool
|
|
default n
|
|
|
|
config ARCH_RAMVECTORS
|
|
bool "Support RAM interrupt vectors"
|
|
default n
|
|
depends on ARCH_HAVE_RAMVECTORS
|
|
---help---
|
|
If ARCH_RAMVECTORS is defined, then the architecture will support
|
|
modifiable vectors in a RAM-based vector table.
|
|
|
|
config ARCH_MINIMAL_VECTORTABLE
|
|
bool "Minimal RAM usage for vector table"
|
|
default n
|
|
---help---
|
|
Use a minimum amount of RAM for the vector table.
|
|
|
|
Instead of allowing irq_attach() to work for all interrupt vectors,
|
|
restrict to only working for a select few (defined in your board
|
|
configuration). This can dramatically reduce the amount of RAM used
|
|
be your vector table.
|
|
|
|
To use this setting, you must have a file in your board config that
|
|
provides:
|
|
|
|
#include <nuttx/arch.h>
|
|
const irq_mapped_t g_irqmap[NR_IRQS] =
|
|
{
|
|
... IRQ to index mapping values ...
|
|
};
|
|
|
|
This table is index by the hardware IRQ number and provides a value
|
|
in the range of 0 to CONFIG_ARCH_NUSER_INTERRUPTS that is the new,
|
|
mapped index into the vector table. Unused, unmapped interrupts
|
|
should be set to IRQMAPPED_MAX. So, for example, if g_irqmap[37]
|
|
== 24, then the hardware interrupt vector 37 will be mapped to the
|
|
interrupt vector table at index 24. if g_irqmap[42] ==
|
|
IRQMAPPED_MAX, then hardware interrupt vector 42 is not used and
|
|
if it occurs will result in an unexpected interrupt crash.
|
|
|
|
config ARCH_MINIMAL_VECTORTABLE_DYNAMIC
|
|
bool "Dynaminc Minimal RAM usage for vector table"
|
|
default n
|
|
depends on ARCH_MINIMAL_VECTORTABLE
|
|
---help---
|
|
Use a minimum amount of RAM for the vector table.
|
|
|
|
config ARCH_NUSER_INTERRUPTS
|
|
int "Number of interrupts"
|
|
default 0
|
|
depends on ARCH_MINIMAL_VECTORTABLE
|
|
---help---
|
|
If CONFIG_ARCH_MINIMAL_VECTORTABLE is defined, then this setting
|
|
defines the actual number of valid, mapped interrupts in g_irqmap.
|
|
This number will be the new size of the OS vector table
|
|
|
|
# Bring-up debug configuration options. These are only intended for low level
|
|
# bring-up and not part of normal platform configuration. They should never be
|
|
# selected in a "normal" configuration and, hence, depend on both EXPERIMENTAL
|
|
# and DEBUG_FEATURES.
|
|
|
|
menu "Bring-Up Options"
|
|
depends on DEBUG_FEATURES
|
|
|
|
config SUPPRESS_CLOCK_CONFIG
|
|
bool "Suppress clock configuration"
|
|
default n
|
|
---help---
|
|
Do not configure clocking. Instead relies on the reset clock
|
|
configuration (or clock configuration provided by a bootloader).
|
|
|
|
config SUPPRESS_INTERRUPTS
|
|
bool "Suppress all interrupts"
|
|
default n
|
|
---help---
|
|
Do not enable interrupts
|
|
|
|
config SUPPRESS_TIMER_INTS
|
|
bool "No timer"
|
|
default n
|
|
---help---
|
|
Do not initialize or enable the system timer
|
|
|
|
config SUPPRESS_SERIAL_INTS
|
|
bool "Suppress serial interrupts"
|
|
default n
|
|
---help---
|
|
Console will poll
|
|
|
|
config SUPPRESS_UART_CONFIG
|
|
bool "Do no re-configure UART"
|
|
default n
|
|
---help---
|
|
Do not re-configure the serial console UART from its start-up state.
|
|
This is useful when a boot loader has already initialized the serial
|
|
port.
|
|
|
|
endmenu # Bring-Up Options
|
|
|
|
comment "Board Settings"
|
|
|
|
config BOARD_LOOPSPERMSEC
|
|
int "Delay loops per millisecond"
|
|
default 5000
|
|
---help---
|
|
Simple delay loops are used by some logic, especially during boot-up,
|
|
driver initialization. These delay loops must be calibrated for each
|
|
board in order to assure accurate timing by the delay loops.
|
|
|
|
comment "Interrupt options"
|
|
|
|
config ARCH_HAVE_INTERRUPTSTACK
|
|
bool
|
|
default n
|
|
|
|
config ARCH_INTERRUPTSTACK
|
|
int "Interrupt Stack Size"
|
|
depends on ARCH_HAVE_INTERRUPTSTACK
|
|
default 0
|
|
---help---
|
|
This architecture supports an interrupt stack. If defined, this symbol
|
|
will be the size of the interrupt stack in bytes. If not defined (or
|
|
defined to be zero), the user task stacks will be used during interrupt
|
|
handling.
|
|
|
|
config ARCH_HAVE_HIPRI_INTERRUPT
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HIPRI_INTERRUPT
|
|
bool "High priority interrupts"
|
|
default n
|
|
depends on ARCH_HAVE_HIPRI_INTERRUPT && ARCH_HAVE_IRQPRIO
|
|
select ARCH_IRQPRIO
|
|
---help---
|
|
NOTE: This description is currently unique to the Cortex-M family
|
|
which is the only family that currently supports this feature. The
|
|
general feature is not conceptually unique to the Cortex-M but if it
|
|
is extended to any other family, then this discussion will have to
|
|
be generalized.
|
|
|
|
If ARMV7M_USEBASEPRI is selected, then interrupts will be disabled
|
|
by setting the BASEPRI register to NVIC_SYSH_DISABLE_PRIORITY so
|
|
that most interrupts will not have execution priority. SVCall must
|
|
have execution priority in all cases.
|
|
|
|
In the normal cases, interrupts are not nest-able and all interrupts
|
|
run at an execution priority between NVIC_SYSH_PRIORITY_MIN and
|
|
NVIC_SYSH_PRIORITY_MAX (with NVIC_SYSH_PRIORITY_MAX reserved for
|
|
SVCall).
|
|
|
|
If, in addition, ARCH_HIPRI_INTERRUPT is defined, then special high
|
|
priority interrupts are supported. These are not "nested" in the
|
|
normal sense of the word. These high priority interrupts can
|
|
interrupt normal processing but execute outside of OS (although they
|
|
can "get back into the game" via a PendSV interrupt).
|
|
|
|
How do you specify a high priority interrupt? You need to do two
|
|
things:
|
|
|
|
1) You need to change the address in the vector table so that
|
|
the high priority interrupt vectors to your special C
|
|
interrupt handler. There are two ways to do this:
|
|
|
|
a) If you select CONFIG_ARCH_RAMVECTORS, then vectors will
|
|
be kept in RAM and the system will support the interface:
|
|
|
|
int up_ramvec_attach(int irq, up_vector_t vector)
|
|
|
|
that can be used to attach your C interrupt handler to the
|
|
vector at run time.
|
|
|
|
b) Alternatively, you could keep your vectors in FLASH but in
|
|
order to this, you would have to develop your own custom
|
|
vector table.
|
|
|
|
2) Then set the priority of your interrupt to NVIC to
|
|
NVIC_SYSH_HIGH_PRIORITY using the standard interface:
|
|
|
|
int up_prioritize_irq(int irq, int priority)
|
|
|
|
NOTE: ARCH_INTERRUPTSTACK must be set in kernel mode (BUILD_KERNEL).
|
|
In kernel mode without an interrupt stack, the interrupt handler
|
|
will set the MSP to the stack pointer of the interrupted thread. If
|
|
the interrupted thread was a privileged thread, that will be the MSP
|
|
otherwise it will be the PSP. If the PSP is used, then the value of
|
|
the MSP will be invalid when the interrupt handler returns because
|
|
it will be a pointer to an old position in the unprivileged stack.
|
|
Then when the high priority interrupt occurs and uses this stale MSP,
|
|
there will most likely be a system failure.
|
|
|
|
If the interrupt stack is selected, on the other hand, then the
|
|
interrupt handler will always set the MSP to the interrupt
|
|
stack. So when the high priority interrupt occurs, it will either
|
|
use the MSP of the last privileged thread to run or, in the case of
|
|
the nested interrupt, the interrupt stack if no privileged task has
|
|
run
|
|
|
|
comment "Boot options"
|
|
|
|
choice
|
|
prompt "Boot Mode"
|
|
default BOOT_RUNFROMFLASH
|
|
|
|
config BOOT_RUNFROMEXTSRAM
|
|
bool "Run from external SRAM"
|
|
---help---
|
|
Some configuration support booting and running from external SRAM.
|
|
|
|
config BOOT_RUNFROMFLASH
|
|
bool "Boot and run from flash"
|
|
---help---
|
|
Most configurations support XIP operation from FLASH but must copy
|
|
initialized .data sections to RAM. (This is the default).
|
|
|
|
config BOOT_RUNFROMISRAM
|
|
bool "Boot and run from internal SRAM"
|
|
---help---
|
|
Some configuration support booting and running from internal SRAM.
|
|
|
|
config BOOT_RUNFROMSDRAM
|
|
bool "Boot and run from external SDRAM"
|
|
---help---
|
|
Some configuration support booting and running from external SDRAM.
|
|
|
|
config BOOT_COPYTORAM
|
|
bool "Boot from FLASH but copy to ram"
|
|
---help---
|
|
Some configurations boot in FLASH but copy themselves entirely into
|
|
RAM for better performance.
|
|
|
|
endchoice
|
|
|
|
menu "Boot Memory Configuration"
|
|
|
|
config RAM_START
|
|
hex "Primary RAM start address (physical)"
|
|
default 0x0
|
|
---help---
|
|
The physical start address of primary installed RAM. "Primary" RAM
|
|
refers to the RAM that you link program code into. If program code
|
|
does not execute out of RAM but from FLASH, then you may designate
|
|
any block of RAM as "primary."
|
|
|
|
config RAM_VSTART
|
|
hex "Primary RAM start address (virtual)"
|
|
default 0x0
|
|
depends on ARCH_USE_MMU
|
|
---help---
|
|
The virtual start address of installed primary RAM. "Primary" RAM
|
|
refers to the RAM that you link program code into. If program code
|
|
does not execute out of RAM but from FLASH, then you may designate
|
|
any block of RAM as "primary."
|
|
|
|
config RAM_SIZE
|
|
int "Primary RAM size"
|
|
default 0
|
|
---help---
|
|
The size in bytes of the installed primary RAM. "Primary" RAM
|
|
refers to the RAM that you link program code into. If program code
|
|
does not execute out of RAM but from FLASH, then you may designate
|
|
any block of RAM as "primary."
|
|
|
|
if BOOT_RUNFROMFLASH && ARCH_USE_MMU
|
|
|
|
config FLASH_START
|
|
hex "Boot FLASH start address (physical)"
|
|
default 0x0
|
|
---help---
|
|
The physical start address of installed boot FLASH. "Boot" FLASH
|
|
refers to the FLASH that you link program code into.
|
|
|
|
config FLASH_VSTART
|
|
hex "Boot FLASH start address (virtual)"
|
|
default 0x0
|
|
---help---
|
|
The virtual start address of installed boot FLASH. "Boot" FLASH
|
|
refers to the FLASH that you link program code into.
|
|
|
|
config FLASH_SIZE
|
|
int "Boot FLASH size"
|
|
default 0
|
|
---help---
|
|
The size in bytes of the installed boot FLASH. "Boot" FLASH
|
|
refers to the FLASH that you link program code into.
|
|
|
|
endif # BOOT_RUNFROMFLASH && ARCH_USE_MMU
|
|
|
|
config ARCH_HAVE_SDRAM
|
|
bool
|
|
default n
|
|
|
|
config BOOT_SDRAM_DATA
|
|
bool "Data in SDRAM"
|
|
default n
|
|
depends on ARCH_HAVE_SDRAM && !BOOT_RUNFROMSDRAM
|
|
---help---
|
|
This selection should be set if data lies in SDRAM (vs. SRAM) and if
|
|
SDRAM was not previously initialized by a loader. Obviously, this
|
|
does not apply if we booting from SDRAM because SDRAM must have been
|
|
initialized priority to loading NuttX into SDRAM.
|
|
|
|
In the case where SDRAM must be initialized by NuttX, the
|
|
initialization sequence is a little different: Normally, .data and
|
|
.bss must be initialized before starting the system. But in this
|
|
case SDRAM must be configured by board-specific logic before the
|
|
.data and .bss sections can be initialized.
|
|
|
|
endmenu # Boot Memory Configuration
|