Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
62478c7
extra: Add debug config fragment.
iabdalkader Nov 26, 2025
2278b10
loader: Export the correct sketch log symbols.
iabdalkader Nov 25, 2025
5d17b27
loader: Support relocating sections to different memory regions.
iabdalkader Dec 1, 2025
bc16aae
variants: Disable some features for production build.
iabdalkader Dec 1, 2025
500f3f0
variants: Relocate llext heap and main stack.
iabdalkader Dec 1, 2025
1b88f0b
loader: redirect logs to uart
pennam Dec 2, 2025
7736d7e
giga: relocate llext heap and main stack
pennam Dec 2, 2025
e02c0a0
giga: add log uart
pennam Dec 2, 2025
14b5152
portentah7: add log uart
pennam Dec 2, 2025
b907d47
portentac33: add log uart
pennam Dec 2, 2025
968f739
opta: disable shell and cpp
pennam Dec 2, 2025
c6a11ec
opta: relocate llext heap and main stack
pennam Dec 2, 2025
0f7d90e
opta: add log uart
pennam Dec 2, 2025
1336fa9
nano33ble: disable shell and cpp
pennam Dec 15, 2025
3874927
nano33ble: add log uart
pennam Dec 15, 2025
a426474
nano33ble: autosize malloc arena
pennam Dec 15, 2025
7eeac8a
nicla sense: disable shell and cpp
pennam Dec 16, 2025
972d692
unoq: disable shell and cpp
pennam Dec 16, 2025
b42c4cb
unoq: restore immediate log mode
pennam Dec 16, 2025
83f3ae8
unoq: remove unused config
pennam Dec 16, 2025
0665c15
prj: make sure DYNAMIC_THREAD is enabled also with SHELL disabled
pennam Dec 16, 2025
58a0b9a
prj: disable SHELL and CPP for alla variants
pennam Dec 16, 2025
654f55f
nano matter: disable CONFIG_DYNAMIC_THREAD and CONFIG_DYNAMIC_THREAD_…
pennam Dec 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions extra/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ else
args="$*"
fi

# Check for debug flag and append
if [ x$2 == x"--debug" ]; then
args="$args -- -DEXTRA_CONF_FILE=../extra/debug.conf"
fi

echo
echo "Build target: $target $args"

Expand Down
31 changes: 31 additions & 0 deletions extra/debug.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# SPDX-License-Identifier: Apache-2.0
# Debug configuration for Arduino Core Zephyr

# Enable debug mode
CONFIG_DEBUG=y

# Enable assertions
CONFIG_ASSERT=y
#CONFIG_ASSERT_VERBOSE=y

# Enable stack overflow detection
CONFIG_STACK_SENTINEL=y
CONFIG_STACK_CANARIES=y

# Enable thread monitoring and debugging
CONFIG_THREAD_MONITOR=y
CONFIG_THREAD_NAME=y
CONFIG_DEBUG_THREAD_INFO=y

# Disable compiler optimizations
#CONFIG_DEBUG_OPTIMIZATIONS=y

# Enable and configure the shell
CONFIG_SHELL=y
#CONFIG_NET_SHELL=y
#CONFIG_NET_L2_WIFI_SHELL=y
CONFIG_SHELL_STACK_SIZE=8192

# Enable runtime statistics
CONFIG_SYS_HEAP_RUNTIME_STATS=y
CONFIG_THREAD_RUNTIME_STATS=y
14 changes: 14 additions & 0 deletions loader/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,20 @@ project(app LANGUAGES C CXX)

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/blobs)

# Memory region relocation based on Kconfig
# Relocate LLEXT heap if region specified
if(NOT "${CONFIG_LLEXT_HEAP_REGION}" STREQUAL "")
zephyr_code_relocate(FILES ${ZEPHYR_BASE}/subsys/llext/llext_mem.c
LOCATION ${CONFIG_LLEXT_HEAP_REGION}_BSS_NOINIT)
endif()

# Relocate main stack if region specified
if(NOT "${CONFIG_MAIN_STACK_REGION}" STREQUAL "")
zephyr_code_relocate(FILES ${ZEPHYR_BASE}/kernel/init.c
LOCATION ${CONFIG_MAIN_STACK_REGION}_BSS_NOINIT)
endif()


# for USB device stack NEXT
target_sources_ifdef(CONFIG_USB_DEVICE_STACK_NEXT app PRIVATE
${CMAKE_CURRENT_LIST_DIR}/../cores/arduino/usb_device_descriptor.c
Expand Down
19 changes: 19 additions & 0 deletions loader/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#
# Copyright (c) 2025 Arduino
#
# SPDX-License-Identifier: Apache-2.0
#

source "Kconfig.zephyr"

config LLEXT_HEAP_REGION
string "LLEXT heap memory region"
depends on CODE_DATA_RELOCATION
help
Specify the memory region for LLEXT heap.

config MAIN_STACK_REGION
string "Main stack memory region"
depends on CODE_DATA_RELOCATION
help
Specify the memory region for main stack.
7 changes: 7 additions & 0 deletions loader/fixups.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
#include <cmsis_core.h>
#include <zephyr/init.h>

#ifndef CONFIG_CPP
void __cxa_pure_virtual() {
while (1)
;
}
#endif

int disable_mpu_rasr_xn(void) {
uint32_t index;
/* Kept the max index as 8(irrespective of soc) because the sram
Expand Down
5 changes: 5 additions & 0 deletions loader/llext_exports.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,14 @@ EXPORT_SYMBOL(usb_enable);
EXPORT_SYMBOL(usb_disable);
#endif

#if CONFIG_LOG
EXPORT_SYMBOL(z_log_msg_runtime_vcreate);
FORCE_EXPORT_SYM(log_const_sketch)
#endif

#if defined(CONFIG_LOG_RUNTIME_FILTERING)
FORCE_EXPORT_SYM(log_dynamic_sketch)
#endif

#if defined(CONFIG_NETWORKING)
FORCE_EXPORT_SYM(net_if_foreach);
Expand Down
26 changes: 22 additions & 4 deletions loader/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ LOG_MODULE_REGISTER(sketch);
#include <zephyr/llext/buf_loader.h>
#include <zephyr/shell/shell.h>
#include <zephyr/shell/shell_uart.h>
#include <zephyr/logging/log_ctrl.h>

#include <stdlib.h>
#include <zephyr/drivers/gpio.h>
Expand All @@ -35,11 +36,11 @@ struct sketch_header_v1 {
#define SKETCH_FLAG_LINKED 0x02
#define SKETCH_FLAG_IMMEDIATE 0x04

#define TARGET_HAS_USB_CDC_SHELL \
DT_NODE_HAS_PROP(DT_PATH(zephyr_user), cdc_acm) && CONFIG_SHELL && \
#define TARGET_HAS_USB_CDC \
DT_NODE_HAS_PROP(DT_PATH(zephyr_user), cdc_acm) && \
(CONFIG_USB_DEVICE_STACK || CONFIG_USB_DEVICE_STACK_NEXT)

#if TARGET_HAS_USB_CDC_SHELL
#if TARGET_HAS_USB_CDC
const struct device *const usb_dev =
DEVICE_DT_GET(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), cdc_acm, 0));

Expand All @@ -63,6 +64,7 @@ int usb_enable(usb_dc_status_callback status_cb) {
}
#endif

#if CONFIG_SHELL
static int enable_shell_usb(void) {
bool log_backend = CONFIG_SHELL_BACKEND_SERIAL_LOG_LEVEL > 0;
uint32_t level = (CONFIG_SHELL_BACKEND_SERIAL_LOG_LEVEL > LOG_LEVEL_DBG) ?
Expand All @@ -75,6 +77,7 @@ static int enable_shell_usb(void) {
return 0;
}
#endif
#endif

#ifdef CONFIG_USERSPACE
K_THREAD_STACK_DEFINE(llext_stack, CONFIG_MAIN_STACK_SIZE);
Expand Down Expand Up @@ -198,8 +201,9 @@ static int loader(const struct shell *sh) {

size_t sketch_buf_len = sketch_hdr->len;

#if TARGET_HAS_USB_CDC_SHELL
#if TARGET_HAS_USB_CDC
int debug = (!sketch_valid) || (sketch_hdr->flags & SKETCH_FLAG_DEBUG);
#if CONFIG_SHELL
if (debug && strcmp(k_thread_name_get(k_current_get()), "main") == 0) {
// disables default shell on UART
shell_uninit(shell_backend_uart_get_ptr(), NULL);
Expand All @@ -214,6 +218,20 @@ static int loader(const struct shell *sh) {
enable_shell_usb();
return 0;
}
#elif CONFIG_LOG
#if !CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT
usb_enable(NULL);
#endif
for (int i = 0; i < log_backend_count_get(); i++) {
const struct log_backend *backend;
backend = log_backend_get(i);
log_backend_init(backend);
log_backend_enable(backend, backend->cb->ctx, CONFIG_LOG_DEFAULT_LEVEL);
if (!debug) {
break;
}
}
#endif
#endif

if (sketch_hdr->flags & SKETCH_FLAG_LINKED) {
Expand Down
12 changes: 3 additions & 9 deletions loader/prj.conf
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,9 @@ CONFIG_MAIN_STACK_SIZE=32768

CONFIG_ARDUINO_API=y

CONFIG_SHELL=y
CONFIG_SHELL_STACK_SIZE=2048
CONFIG_SHELL_CMD_BUFF_SIZE=2048
CONFIG_SHELL_LOG_LEVEL_DBG=n

CONFIG_LLEXT=y
CONFIG_LLEXT_LOG_LEVEL_ERR=y
CONFIG_LLEXT_HEAP_SIZE=32
CONFIG_LLEXT_SHELL=y
CONFIG_LLEXT_STORAGE_WRITABLE=y
CONFIG_LLEXT_EXPORT_DEVICES=y

Expand All @@ -41,9 +35,6 @@ CONFIG_UART_CONSOLE=y
CONFIG_FLASH=y
CONFIG_FLASH_MAP=y

CONFIG_CPP=y
CONFIG_STD_CPP17=y
CONFIG_GLIBCXX_LIBCPP=y
CONFIG_REQUIRES_FULL_LIBC=y
CONFIG_CBPRINTF_FP_SUPPORT=y

Expand All @@ -52,3 +43,6 @@ CONFIG_INPUT_THREAD_PRIORITY_OVERRIDE=y
CONFIG_INPUT_THREAD_PRIORITY=0

CONFIG_EVENTS=y
CONFIG_THREAD_STACK_INFO=y
CONFIG_DYNAMIC_THREAD=y
CONFIG_DYNAMIC_THREAD_ALLOC=y
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,29 @@ CONFIG_USB_DEVICE_PRODUCT="Arduino GIGA R1"
CONFIG_USB_DEVICE_MANUFACTURER="Arduino"
CONFIG_USB_DEVICE_VID=0x2341
CONFIG_USB_DEVICE_PID=0x0066
CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n

CONFIG_USB_CDC_ACM=y
CONFIG_USB_CDC_ACM_RINGBUF_SIZE=512
CONFIG_USB_CDC_ACM_RINGBUF_SIZE=1024
CONFIG_UART_LINE_CTRL=y
CONFIG_CDC_ACM_DTE_RATE_CALLBACK_SUPPORT=y

CONFIG_LLEXT_STORAGE_WRITABLE=n
CONFIG_SHARED_MULTI_HEAP=y
CONFIG_HEAP_MEM_POOL_SIZE=24576
CONFIG_SHELL_STACK_SIZE=32768
CONFIG_HEAP_MEM_POOL_SIZE=32768
CONFIG_MAIN_STACK_SIZE=32768
CONFIG_LLEXT_HEAP_SIZE=128
CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=-1

CONFIG_FPU=y
CONFIG_CODE_DATA_RELOCATION=y
CONFIG_MAIN_STACK_REGION="DTCM"
CONFIG_LLEXT_HEAP_REGION="SRAM2"

CONFIG_LOG_BACKEND_UART=y
CONFIG_LOG_BACKEND_UART_AUTOSTART=n
CONFIG_LOG_DEFAULT_LEVEL=2

CONFIG_FPU=y
CONFIG_ADC=y
CONFIG_DAC=y
CONFIG_PWM=y
Expand All @@ -39,13 +47,12 @@ CONFIG_MBEDTLS=y
CONFIG_MBEDTLS_BUILTIN=y
CONFIG_MBEDTLS_PEM_CERTIFICATE_FORMAT=y
CONFIG_MBEDTLS_ENABLE_HEAP=y
CONFIG_MBEDTLS_HEAP_SIZE=60000
CONFIG_MBEDTLS_HEAP_SIZE=80000
CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=7168
CONFIG_MBEDTLS_HASH_ALL_ENABLED=y
CONFIG_MBEDTLS_CMAC=y

CONFIG_VIDEO=y
CONFIG_VIDEO_LOG_LEVEL_DBG=y
CONFIG_VIDEO_STM32_DCMI=y
CONFIG_VIDEO_BUFFER_POOL_NUM_MAX=3
CONFIG_VIDEO_BUFFER_POOL_SZ_MAX=614400
Expand Down Expand Up @@ -134,7 +141,4 @@ CONFIG_DNS_SERVER1="8.8.8.8"
CONFIG_NET_CONFIG_AUTO_INIT=n
CONFIG_NET_CONNECTION_MANAGER=y
#CONFIG_WIFI_NM_MAX_MANAGED_INTERFACES=2

CONFIG_NET_SHELL=y
CONFIG_NET_L2_ETHERNET_MGMT=y
CONFIG_NET_L2_WIFI_SHELL=y
Original file line number Diff line number Diff line change
Expand Up @@ -320,9 +320,15 @@
/{
chosen {
zephyr,camera = &dcmi;
zephyr,log-uart = &log_uarts;
/* zephyr,console = &board_cdc_acm_uart; */
};

log_uarts: log_uarts {
compatible = "zephyr,log-uart";
uarts = <&usart1 &board_cdc_acm_uart>;
};

/* used to overcome problems with _C analog pins */
gpioz: gpio@deadbeef {
compatible = "vnd,gpio";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,22 @@ CONFIG_USB_DEVICE_VID=0x2341
CONFIG_USB_DEVICE_PID=0x035A

CONFIG_USB_CDC_ACM=y
CONFIG_USB_CDC_ACM_RINGBUF_SIZE=512
CONFIG_USB_CDC_ACM_RINGBUF_SIZE=1024
CONFIG_UART_LINE_CTRL=y
CONFIG_CDC_ACM_DTE_RATE_CALLBACK_SUPPORT=y

CONFIG_LOG_BACKEND_UART=y
CONFIG_LOG_BACKEND_UART_AUTOSTART=n
CONFIG_LOG_DEFAULT_LEVEL=2

CONFIG_ADC=y
CONFIG_PWM=y

CONFIG_LLEXT_STORAGE_WRITABLE=n
CONFIG_SHELL_STACK_SIZE=2048
CONFIG_HEAP_MEM_POOL_SIZE=16384
CONFIG_LLEXT_HEAP_SIZE=128
CONFIG_MAIN_STACK_SIZE=16384
CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=-1

CONFIG_FPU=y

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,17 @@
};
};

/{
chosen {
zephyr,log-uart = &log_uarts;
};

log_uarts: log_uarts {
compatible = "zephyr,log-uart";
uarts = <&uart0 &board_cdc_acm_uart>;
};
};


/ {
zephyr,user {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ CONFIG_STACK_SENTINEL=n
CONFIG_INIT_STACKS=n
CONFIG_THREAD_NAME=n
CONFIG_THREAD_STACK_INFO=n
CONFIG_DYNAMIC_THREAD=n
CONFIG_DYNAMIC_THREAD_ALLOC=n
CONFIG_STACK_CANARIES=n
CONFIG_THREAD_ANALYZER=n
CONFIG_SYS_HEAP_RUNTIME_STATS=n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,20 @@ CONFIG_BT_BUF_EVT_DISCARDABLE_SIZE=255
CONFIG_BT_MAX_CONN=4
CONFIG_BT_CTLR_ADV_EXT=y
CONFIG_BT_CTLR_ADV_PERIODIC=y

CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=512
CONFIG_BT_RX_STACK_SIZE=1024
CONFIG_BT_HCI_TX_STACK_SIZE=1024

# Workaround: Unable to allocate command buffer when using K_NO_WAIT since
# Host number of completed commands does not follow normal flow control.
CONFIG_BT_BUF_CMD_TX_COUNT=10

CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=512

CONFIG_ADC=y
#CONFIG_PWM=y

CONFIG_LLEXT_STORAGE_WRITABLE=n
CONFIG_SHELL_STACK_SIZE=1024
CONFIG_HEAP_MEM_POOL_SIZE=1024
CONFIG_LLEXT_HEAP_SIZE=15
CONFIG_MAIN_STACK_SIZE=2048

CONFIG_BT_RX_STACK_SIZE=1024
CONFIG_BT_HCI_TX_STACK_SIZE=1024
CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=-1
Loading