arch/risc-v/litex: Add platform specific tickless implementation.

Adds a platform specific implementation for tickless schedular operation. This includes:
 - Tickless operation for vexriscv cores.
 - Tickless operation for vexriscv-smp cores.
 - Ticked operation for vexriscv-smp cores.

Ticked operation for vexriscv core has been refactored.

Additional default configuration added to demonstrate operation.

Both tickless and ticked options use Litex timer0 for scheduling intervals. This is significantly faster than interfaceing with the risc-v mtimer through opensbi.
This commit is contained in:
Stuart Ianna
2023-08-16 10:05:27 +10:00
committed by Xiang Xiao
parent 074cf51268
commit 34bfa2f7ba
8 changed files with 542 additions and 65 deletions

View File

@@ -44,6 +44,7 @@ config ARCH_CHIP_LITEX
select ARCH_RV_ISA_M
select ARCH_RV_ISA_A
select ARCH_DCACHE
select ARCH_HAVE_TICKLESS
---help---
Enjoy Digital LITEX VEXRISCV softcore processor (RV32IMA).

View File

@@ -32,9 +32,16 @@ endif
CHIP_CSRCS = litex_allocateheap.c litex_clockconfig.c
CHIP_CSRCS += litex_irq.c litex_irq_dispatch.c
CHIP_CSRCS += litex_lowputc.c litex_serial.c
CHIP_CSRCS += litex_start.c litex_timerisr.c
CHIP_CSRCS += litex_start.c
CHIP_ASRCS += litex_cache.S
ifeq ($(CONFIG_SCHED_TICKLESS),y)
CHIP_CSRCS += litex_tickless.c
else
CHIP_CSRCS += litex_ticked.c
endif
ifeq ($(CONFIG_BUILD_KERNEL),y)
CHIP_CSRCS += litex_mm_init.c litex_pgalloc.c
endif

View File

@@ -41,6 +41,9 @@
#define LITEX_TIMER_EV_STATUS_OFFSET 0x0014
#define LITEX_TIMER_EV_PENDING_OFFSET 0x0018
#define LITEX_TIMER_EV_ENABLE_OFFSET 0x001C
#define LITEX_TIMER_UPTIME_LATCH_OFFSET 0x0020
#define LITEX_TIMER_UPTIME_OFFSET_U 0x0024
#define LITEX_TIMER_UPTIME_OFFSET_L 0x0028
/* LITEX_TIMER register addresses *******************************************/
@@ -52,7 +55,13 @@
#define LITEX_TIMER0_EV_STATUS (LITEX_TIMER0_BASE+LITEX_TIMER_EV_STATUS_OFFSET)
#define LITEX_TIMER0_EV_PENDING (LITEX_TIMER0_BASE+LITEX_TIMER_EV_PENDING_OFFSET)
#define LITEX_TIMER0_EV_ENABLE (LITEX_TIMER0_BASE+LITEX_TIMER_EV_ENABLE_OFFSET)
#define LITEX_TIMER0_UPTIME_LATCH (LITEX_TIMER0_BASE+LITEX_TIMER_UPTIME_LATCH_OFFSET)
#define LITEX_TIMER0_UPTIME_U (LITEX_TIMER0_BASE+LITEX_TIMER_UPTIME_OFFSET_U)
#define LITEX_TIMER0_UPTIME_L (LITEX_TIMER0_BASE+LITEX_TIMER_UPTIME_OFFSET_L)
/* LITEX_TIMER register bit definitions *************************************/
#define LITEX_TIMER0_TIMEOUT_EV_OFFSET 0x0
#define LITEX_TIMER0_ENABLE_BIT 0x1
#endif /* __ARCH_RISCV_SRC_LITEX_HARDWARE_LITEX_TIMER_H */

View File

@@ -1,5 +1,5 @@
/****************************************************************************
* arch/risc-v/src/litex/litex_timerisr.c
* arch/risc-v/src/litex/litex_ticked.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -23,17 +23,17 @@
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/clock.h>
#include <nuttx/timers/arch_alarm.h>
#include <nuttx/init.h>
#include <debug.h>
#include <stdint.h>
#include <stdbool.h>
#include "chip.h"
#include "riscv_internal.h"
#include "litex.h"
#include "litex_clockconfig.h"
#include "hardware/litex_timer.h"
#include "riscv_mtimer.h"
/****************************************************************************
* Pre-processor Definitions
@@ -41,37 +41,17 @@
#define TICK_COUNT (litex_get_hfclk() / TICK_PER_SEC)
/****************************************************************************
* Private Data
****************************************************************************/
#if !defined(CONFIG_SCHED_TICKLESS)
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: litex_timerisr
****************************************************************************/
#ifdef CONFIG_LITEX_CORE_VEXRISCV_SMP
static void litex_mtimer_initialise(void)
{
struct oneshot_lowerhalf_s *lower = riscv_mtimer_initialize(
LITEX_CLINT_MTIME, LITEX_CLINT_MTIMECMP,
RISCV_IRQ_TIMER, litex_get_hfclk());
DEBUGASSERT(lower);
up_alarm_set_lowerhalf(lower);
}
#else
static int litex_timerisr(int irq, void *context, void *arg)
{
/* Clear timer interrupt */
putreg32(0xffffffff, LITEX_TIMER0_EV_PENDING);
putreg32(1 << LITEX_TIMER0_TIMEOUT_EV_OFFSET, LITEX_TIMER0_EV_PENDING);
/* Process timer interrupt */
@@ -79,39 +59,12 @@ static int litex_timerisr(int irq, void *context, void *arg)
return 0;
}
static void litex_timer0_initialize(void)
{
/* Disable the timer and clear any pending interrupt */
putreg32(0, LITEX_TIMER0_EN);
putreg32(getreg32(LITEX_TIMER0_EV_PENDING), LITEX_TIMER0_EV_PENDING);
/* Set the timer period */
putreg32(TICK_COUNT, LITEX_TIMER0_RELOAD);
putreg32(getreg32(LITEX_TIMER0_RELOAD), LITEX_TIMER0_LOAD);
/* Attach timer interrupt handler */
irq_attach(LITEX_IRQ_TIMER0, litex_timerisr, NULL);
/* Enable the timer */
putreg32(1, LITEX_TIMER0_EN);
/* And enable the timer interrupt */
putreg32(1, LITEX_TIMER0_EV_ENABLE);
up_enable_irq(LITEX_IRQ_TIMER0);
}
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: up_timer_initialize
* Function: up_timer_initialize
*
* Description:
* This function is called during start-up to initialize
@@ -121,9 +74,27 @@ static void litex_timer0_initialize(void)
void up_timer_initialize(void)
{
#ifdef CONFIG_LITEX_CORE_VEXRISCV_SMP
litex_mtimer_initialise();
#else
litex_timer0_initialize();
#endif
/* Disable the timer and clear any pending interrupt */
putreg32(0, LITEX_TIMER0_EN);
putreg32(1 << LITEX_TIMER0_TIMEOUT_EV_OFFSET, LITEX_TIMER0_EV_PENDING);
/* Set the timer period */
putreg32(TICK_COUNT, LITEX_TIMER0_RELOAD);
/* Attach timer interrupt handler */
irq_attach(LITEX_IRQ_TIMER0, litex_timerisr, NULL);
/* Enable the timer */
putreg32(LITEX_TIMER0_ENABLE_BIT, LITEX_TIMER0_EN);
/* And enable the timer interrupt */
putreg32(1 << LITEX_TIMER0_TIMEOUT_EV_OFFSET, LITEX_TIMER0_EV_ENABLE);
up_enable_irq(LITEX_IRQ_TIMER0);
}
#endif /* !defind(CONFIG_SCHED_TICKLESS) */

View File

@@ -0,0 +1,339 @@
/****************************************************************************
* arch/risc-v/src/litex/litex_tickless.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
#include <stdbool.h>
#include <assert.h>
#include "chip.h"
#include "riscv_internal.h"
#include "litex.h"
#include "litex_clockconfig.h"
#include "hardware/litex_timer.h"
#if defined(CONFIG_SCHED_TICKLESS)
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#define LITEX_TICK_PER_SEC (CONFIG_LITEX_SYS_CORE_FREQ_HZ)
#define LITEX_TICK_PER_USEC (LITEX_TICK_PER_SEC / USEC_PER_SEC)
#define SEC_2_LITEX_TICK(s) ((s) * LITEX_TICK_PER_SEC)
#define USEC_2_LITEX_TICK(us) ((us) * LITEX_TICK_PER_USEC)
#define NSEC_2_LITEX_TICK(nsec) (((nsec) * LITEX_TICK_PER_USEC) / NSEC_PER_USEC)
#define LITEX_TICK_2_SEC(tick) ((tick) / LITEX_TICK_PER_SEC)
#define LITEX_TICK_2_USEC(tick) ((tick) / LITEX_TICK_PER_USEC)
#define LITEX_TICK_2_NSEC(tick) ((tick) * 1000 / LITEX_TICK_PER_USEC)
static bool g_timer_started; /* Whether an interval timer is being started */
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: up_timer_expire
*
* Description:
* Called as the IRQ handler for timer expiration.
*
* Input Parameters:
* None
*
* Returned Value:
* None
*
****************************************************************************/
static int up_timer_expire(int irq, void *regs, void *arg)
{
g_timer_started = false;
putreg32(1 << LITEX_TIMER0_TIMEOUT_EV_OFFSET, LITEX_TIMER0_EV_PENDING);
nxsched_timer_expiration();
return OK;
}
/****************************************************************************
* Name: litex_get_uptime
*
* Description:
* Get the number of ticks remaining on the counter.
*
* Input Parameters:
* None
*
****************************************************************************/
void litex_get_uptime(uint64_t * value)
{
putreg32(1, LITEX_TIMER0_UPTIME_LATCH);
*value = (uint64_t)getreg32(LITEX_TIMER0_UPTIME_U) << 32;
*value |= getreg32(LITEX_TIMER0_UPTIME_L);
}
/****************************************************************************
* Name: litex_get_remaining
*
* Description:
* Get the number of ticks remaining on the counter.
*
* Input Parameters:
* None
*
* Returned Value:
* The count remaining on the timer.
*
****************************************************************************/
uint32_t litex_get_remaining()
{
putreg32(1, LITEX_TIMER0_UPDATE_VALUE);
return getreg32(LITEX_TIMER0_VALUE);
}
/****************************************************************************
* Name: litex_timer_cancel
*
* Input Parameters:
* None
*
* Description:
* Cancel any running one-shot timer.
*
****************************************************************************/
void litex_timer_cancel()
{
g_timer_started = false;
putreg32(0, LITEX_TIMER0_EN);
putreg32(1 << LITEX_TIMER0_TIMEOUT_EV_OFFSET, LITEX_TIMER0_EV_PENDING);
}
/****************************************************************************
* Name: litex_timer_oneshot
*
* Description:
* Start timer0 in one-shot countdown mode.
*
* Input Parameters:
* ticks - The tick count to use for the one-shot timer.
*
****************************************************************************/
void litex_timer_oneshot(const uint32_t ticks)
{
g_timer_started = true;
putreg32(ticks, LITEX_TIMER0_LOAD);
putreg32(LITEX_TIMER0_ENABLE_BIT, LITEX_TIMER0_EN);
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: up_timer_gettime
*
* Description:
* Return the elapsed time since power-up (or, more correctly, since
* up_timer_initialize() was called). This function is functionally
* equivalent to:
*
* int clock_gettime(clockid_t clockid, struct timespec *ts);
*
* when clockid is CLOCK_MONOTONIC.
*
* This function provides the basis for reporting the current time and
* also is used to eliminate error build-up from small errors in interval
* time calculations.
*
* Provided by platform-specific code and called from the RTOS base code.
*
* Input Parameters:
* ts - Provides the location in which to return the up-time.
*
* Returned Value:
* Zero (OK) is returned on success; a negated errno value is returned on
* any failure.
*
* Assumptions:
* Called from the normal tasking context. The implementation must
* provide whatever mutual exclusion is necessary for correct operation.
* This can include disabling interrupts in order to assure atomic register
* operations.
*
****************************************************************************/
int up_timer_gettime(struct timespec *ts)
{
uint64_t ticks;
litex_get_uptime(&ticks);
ts->tv_sec = LITEX_TICK_2_SEC(ticks);
ts->tv_nsec = LITEX_TICK_2_NSEC(ticks % LITEX_TICK_PER_SEC);
return OK;
}
/****************************************************************************
* Name: up_timer_cancel
*
* Description:
* Cancel the interval timer and return the time remaining on the timer.
* These two steps need to be as nearly atomic as possible.
* nxsched_timer_expiration() will not be called unless the timer is
* restarted with up_timer_start().
*
* If, as a race condition, the timer has already expired when this
* function is called, then that pending interrupt must be cleared so
* that up_timer_start() and the remaining time of zero should be
* returned.
*
* NOTE: This function may execute at a high rate with no timer running (as
* when pre-emption is enabled and disabled).
*
* Provided by platform-specific code and called from the RTOS base code.
*
* Input Parameters:
* ts - Location to return the remaining time. Zero should be returned
* if the timer is not active. ts may be zero in which case the
* time remaining is not returned.
*
* Returned Value:
* Zero (OK) is returned on success. A call to up_timer_cancel() when
* the timer is not active should also return success; a negated errno
* value is returned on any failure.
*
* Assumptions:
* May be called from interrupt level handling or from the normal tasking
* level. Interrupts may need to be disabled internally to assure
* non-reentrancy.
*
****************************************************************************/
int up_timer_cancel(struct timespec *ts)
{
uint64_t alarm_value;
irqstate_t flags;
flags = enter_critical_section();
if (ts != NULL)
{
if (g_timer_started == false)
{
ts->tv_sec = 0;
ts->tv_nsec = 0;
}
else
{
litex_timer_cancel();
alarm_value = litex_get_remaining();
ts->tv_sec = LITEX_TICK_2_SEC(alarm_value);
ts->tv_nsec = LITEX_TICK_2_NSEC(alarm_value % LITEX_TICK_PER_SEC);
}
}
leave_critical_section(flags);
return OK;
}
/****************************************************************************
* Name: up_timer_start
*
* Description:
* Start the interval timer. nxsched_timer_expiration() will be
* called at the completion of the timeout (unless up_timer_cancel
* is called to stop the timing.
*
* Provided by platform-specific code and called from the RTOS base code.
*
* Input Parameters:
* ts - Provides the time interval until nxsched_timer_expiration() is
* called.
*
* Returned Value:
* Zero (OK) is returned on success; a negated errno value is returned on
* any failure.
*
* Assumptions:
* May be called from interrupt level handling or from the normal tasking
* level. Interrupts may need to be disabled internally to assure
* non-reentrancy.
*
****************************************************************************/
int up_timer_start(const struct timespec *ts)
{
uint64_t cpu_ticks;
irqstate_t flags;
flags = enter_critical_section();
litex_timer_cancel();
cpu_ticks = SEC_2_LITEX_TICK((uint64_t)ts->tv_sec) +
NSEC_2_LITEX_TICK((uint64_t)ts->tv_nsec);
DEBUGASSERT(cpu_ticks <= UINT32_MAX);
litex_timer_oneshot(cpu_ticks);
leave_critical_section(flags);
return OK;
}
/****************************************************************************
* Function: up_timer_initialize
*
* Description:
* This function is called during start-up to initialize
* the timer interrupt.
*
****************************************************************************/
void up_timer_initialize(void)
{
/* Cancel any configuration that has been done in the bios or openSBI */
litex_timer_cancel();
/* Write zero to reload to ensure one-shot mode */
putreg32(0, LITEX_TIMER0_RELOAD);
putreg32(1 << LITEX_TIMER0_TIMEOUT_EV_OFFSET, LITEX_TIMER0_EV_ENABLE);
irq_attach(LITEX_IRQ_TIMER0, up_timer_expire, NULL);
up_enable_irq(LITEX_IRQ_TIMER0);
}
#endif /* CONFIG_SCHED_TICKLESS */

View File

@@ -0,0 +1,84 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_DEBUG_OPT_UNUSED_SECTIONS is not set
# CONFIG_NSH_DISABLE_LOSMART is not set
# CONFIG_STANDARD_SERIAL is not set
CONFIG_ARCH="risc-v"
CONFIG_ARCH_ADDRENV=y
CONFIG_ARCH_BOARD="arty_a7"
CONFIG_ARCH_BOARD_ARTY_A7=y
CONFIG_ARCH_CHIP="litex"
CONFIG_ARCH_CHIP_LITEX=y
CONFIG_ARCH_DATA_NPAGES=128
CONFIG_ARCH_DATA_VBASE=0x10400000
CONFIG_ARCH_HEAP_NPAGES=128
CONFIG_ARCH_HEAP_VBASE=0x10800000
CONFIG_ARCH_INTERRUPTSTACK=8192
CONFIG_ARCH_KERNEL_STACKSIZE=3072
CONFIG_ARCH_PGPOOL_MAPPING=y
CONFIG_ARCH_PGPOOL_PBASE=0x40800000
CONFIG_ARCH_PGPOOL_SIZE=4194304
CONFIG_ARCH_PGPOOL_VBASE=0x40800000
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARCH_TEXT_NPAGES=128
CONFIG_ARCH_TEXT_VBASE=0x10000000
CONFIG_ARCH_USE_MMU=y
CONFIG_ARCH_USE_MPU=y
CONFIG_ARCH_USE_S_MODE=y
CONFIG_BINFMT_ELF_EXECUTABLE=y
CONFIG_BOARDCTL_ROMDISK=y
CONFIG_BOARD_LATE_INITIALIZE=y
CONFIG_BOARD_LOOPSPERMSEC=10000
CONFIG_BUILD_KERNEL=y
CONFIG_DEV_ZERO=y
CONFIG_ELF=y
CONFIG_EXAMPLES_HELLO=y
CONFIG_FS_PROCFS=y
CONFIG_FS_PROCFS_EXCLUDE_ENVIRON=y
CONFIG_FS_ROMFS=y
CONFIG_IDLETHREAD_STACKSIZE=2048
CONFIG_INIT_FILEPATH="/system/bin/init"
CONFIG_INIT_MOUNT=y
CONFIG_INIT_MOUNT_FLAGS=0x1
CONFIG_INIT_MOUNT_TARGET="/system/bin"
CONFIG_INIT_STACKSIZE=3072
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBC_ENVPATH=y
CONFIG_LIBC_EXECFUNCS=y
CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_LITEX_APPLICATION_RAMDISK=y
CONFIG_LITEX_CORE_VEXRISCV_SMP=y
CONFIG_MM_PGALLOC=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_FILE_APPS=y
CONFIG_NSH_READLINE=y
CONFIG_PATH_INITIAL="/system/bin"
CONFIG_RAM_SIZE=4194304
CONFIG_RAM_START=0x40400000
CONFIG_RAW_BINARY=y
CONFIG_READLINE_CMD_HISTORY=y
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_LPWORK=y
CONFIG_SCHED_TICKLESS=y
CONFIG_SCHED_WAITPID=y
CONFIG_START_MONTH=12
CONFIG_START_YEAR=2021
CONFIG_SYMTAB_ORDEREDBYNAME=y
CONFIG_SYSLOG_PROCESS_NAME=y
CONFIG_SYSLOG_TIMESTAMP=y
CONFIG_SYSTEM_CLE=y
CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_NSH_PROGNAME="init"
CONFIG_TESTING_GETPRIME=y
CONFIG_UART0_RXBUFSIZE=128
CONFIG_UART0_SERIAL_CONSOLE=y
CONFIG_UART0_TXBUFSIZE=128
CONFIG_USEC_PER_TICK=1

View File

@@ -8,7 +8,6 @@
# CONFIG_DEBUG_OPT_UNUSED_SECTIONS is not set
# CONFIG_NSH_DISABLE_LOSMART is not set
# CONFIG_STANDARD_SERIAL is not set
CONFIG_ALARM_ARCH=y
CONFIG_ARCH="risc-v"
CONFIG_ARCH_ADDRENV=y
CONFIG_ARCH_BOARD="arty_a7"
@@ -56,13 +55,11 @@ CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_LITEX_APPLICATION_RAMDISK=y
CONFIG_LITEX_CORE_VEXRISCV_SMP=y
CONFIG_LITEX_SYS_CORE_FREQ_HZ=300000000
CONFIG_MM_PGALLOC=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_FILE_APPS=y
CONFIG_NSH_READLINE=y
CONFIG_ONESHOT=y
CONFIG_PATH_INITIAL="/system/bin"
CONFIG_RAM_SIZE=4194304
CONFIG_RAM_START=0x40400000

View File

@@ -0,0 +1,69 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_DISABLE_PTHREAD is not set
# CONFIG_FS_PROCFS_EXCLUDE_BLOCKS is not set
# CONFIG_FS_PROCFS_EXCLUDE_ENVIRON is not set
# CONFIG_FS_PROCFS_EXCLUDE_MEMDUMP is not set
# CONFIG_FS_PROCFS_EXCLUDE_MEMINFO is not set
# CONFIG_FS_PROCFS_EXCLUDE_MOUNT is not set
# CONFIG_FS_PROCFS_EXCLUDE_MOUNTS is not set
# CONFIG_FS_PROCFS_EXCLUDE_PROCESS is not set
# CONFIG_FS_PROCFS_EXCLUDE_UPTIME is not set
# CONFIG_FS_PROCFS_EXCLUDE_USAGE is not set
# CONFIG_FS_PROCFS_EXCLUDE_VERSION is not set
# CONFIG_NSH_DISABLEBG is not set
# CONFIG_NSH_DISABLE_LOSMART is not set
# CONFIG_NSH_DISABLE_UNAME is not set
# CONFIG_STANDARD_SERIAL is not set
CONFIG_ARCH="risc-v"
CONFIG_ARCH_BOARD="arty_a7"
CONFIG_ARCH_BOARD_ARTY_A7=y
CONFIG_ARCH_CHIP="litex"
CONFIG_ARCH_CHIP_LITEX=y
CONFIG_ARCH_INTERRUPTSTACK=8192
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_BOARD_LOOPSPERMSEC=10000
CONFIG_BUILTIN=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEFAULT_SMALL=y
CONFIG_DEV_ZERO=y
CONFIG_EXAMPLES_HELLO=y
CONFIG_EXAMPLES_HELLO_STACKSIZE=8192
CONFIG_FS_PROCFS=y
CONFIG_IDLETHREAD_STACKSIZE=8192
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INIT_STACKSIZE=8192
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=64
CONFIG_NSH_STRERROR=y
CONFIG_POSIX_SPAWN_DEFAULT_STACKSIZE=8192
CONFIG_PTHREAD_STACK_DEFAULT=8192
CONFIG_RAM_SIZE=268435456
CONFIG_RAM_START=0x40000000
CONFIG_RAW_BINARY=y
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_TICKLESS=y
CONFIG_SCHED_WAITPID=y
CONFIG_STACK_COLORATION=y
CONFIG_START_DAY=20
CONFIG_START_MONTH=3
CONFIG_START_YEAR=2020
CONFIG_SYSTEM_NSH=y
CONFIG_TASK_NAME_SIZE=12
CONFIG_TESTING_GETPRIME=y
CONFIG_UART0_RXBUFSIZE=128
CONFIG_UART0_SERIAL_CONSOLE=y
CONFIG_UART0_TXBUFSIZE=128
CONFIG_USEC_PER_TICK=1