From 4cf15b3c25cc4ab423ca624435dbd7a082c307b5 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Wed, 26 Nov 2025 15:03:34 +0100 Subject: [PATCH 1/5] extra: Add debug config fragment. Add debug config fragment to easily build debug images. Usage: ./extra/build.sh --debug The build includes extra/debug.conf which enables: - Debug mode with assertions and verbose output - Debug-level logging (level 4) - Stack overflow detection - Thread monitoring - Debug optimizations (-Og) - Enable shell. Signed-off-by: iabdalkader --- extra/build.sh | 5 +++++ extra/debug.conf | 31 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 extra/debug.conf diff --git a/extra/build.sh b/extra/build.sh index 6ff88b925..2b2bac7d5 100755 --- a/extra/build.sh +++ b/extra/build.sh @@ -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" diff --git a/extra/debug.conf b/extra/debug.conf new file mode 100644 index 000000000..147a34940 --- /dev/null +++ b/extra/debug.conf @@ -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 From 7bc5dc6a93cbe7b2968629823f86db61e223d7ad Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Tue, 25 Nov 2025 16:07:40 +0100 Subject: [PATCH 2/5] loader: Export the correct sketch log symbols. The created sketch log structures depends on the config: CONFIG_LOG (IMMEDIATE/DEFERRED): creates log_const_sketch struct. CONFIG_LOG_RUNTIME_FILTERING (implied by CONFIG_SHELL): creates log_dynamic_sketch struct. CONFIG_LOG_MODE_IMMEDIATE + CONFIG_SHELL: creates both. Signed-off-by: iabdalkader --- loader/llext_exports.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/loader/llext_exports.c b/loader/llext_exports.c index c9bbc142f..30ccc8665 100644 --- a/loader/llext_exports.c +++ b/loader/llext_exports.c @@ -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); From 0249d146ecf81fe0f6c4a7ad789aa412a08572c5 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Mon, 1 Dec 2025 12:27:05 +0100 Subject: [PATCH 3/5] loader: Support relocating sections to different memory regions. Signed-off-by: iabdalkader --- loader/CMakeLists.txt | 14 ++++++++++++++ loader/Kconfig | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 loader/Kconfig diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt index 8688fc866..428885a70 100644 --- a/loader/CMakeLists.txt +++ b/loader/CMakeLists.txt @@ -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 diff --git a/loader/Kconfig b/loader/Kconfig new file mode 100644 index 000000000..f6ee63309 --- /dev/null +++ b/loader/Kconfig @@ -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. From 906dec1fb441d619a32bb14beabef988bd5bdb96 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Mon, 1 Dec 2025 12:24:31 +0100 Subject: [PATCH 4/5] variants: Disable some features for production build. - Disable CPP - Disable shell - Disable any debug log level - Disable init stacks. Signed-off-by: iabdalkader --- loader/fixups.c | 7 +++++++ .../arduino_giga_r1_stm32h747xx_m7.conf | 10 ++++------ .../arduino_portenta_c33_r7fa6m5bh3cfc.conf | 10 ++++------ .../arduino_portenta_h7_stm32h747xx_m7.conf | 13 ++++--------- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/loader/fixups.c b/loader/fixups.c index ba6be7f3d..42afca2d6 100644 --- a/loader/fixups.c +++ b/loader/fixups.c @@ -1,6 +1,13 @@ #include #include +#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 diff --git a/variants/arduino_giga_r1_stm32h747xx_m7/arduino_giga_r1_stm32h747xx_m7.conf b/variants/arduino_giga_r1_stm32h747xx_m7/arduino_giga_r1_stm32h747xx_m7.conf index c1050099d..29d512f84 100644 --- a/variants/arduino_giga_r1_stm32h747xx_m7/arduino_giga_r1_stm32h747xx_m7.conf +++ b/variants/arduino_giga_r1_stm32h747xx_m7/arduino_giga_r1_stm32h747xx_m7.conf @@ -16,8 +16,10 @@ CONFIG_SHELL_STACK_SIZE=32768 CONFIG_MAIN_STACK_SIZE=32768 CONFIG_LLEXT_HEAP_SIZE=128 -CONFIG_FPU=y +CONFIG_CPP=n +CONFIG_SHELL=n +CONFIG_FPU=y CONFIG_ADC=y CONFIG_DAC=y CONFIG_PWM=y @@ -39,13 +41,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 @@ -134,7 +135,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 diff --git a/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf b/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf index 8a7a11786..c79f252c3 100644 --- a/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf +++ b/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf @@ -18,11 +18,12 @@ CONFIG_USBD_LOG_LEVEL_ERR=y CONFIG_LLEXT_STORAGE_WRITABLE=n CONFIG_FPU=y - CONFIG_USERSPACE=n CONFIG_ARM_MPU=n -CONFIG_SHELL_STACK_SIZE=8192 +CONFIG_CPP=n +CONFIG_SHELL=n + CONFIG_MAIN_STACK_SIZE=32768 CONFIG_LLEXT_HEAP_SIZE=128 CONFIG_HEAP_MEM_POOL_SIZE=32768 @@ -34,8 +35,6 @@ CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=8192 CONFIG_ADC=y CONFIG_PWM=y -CONFIG_NET_CORE_LOG_LEVEL_DBG=y - CONFIG_NETWORKING=y CONFIG_NET_IPV6=n CONFIG_NET_IPV4=y @@ -74,7 +73,7 @@ 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 @@ -85,7 +84,6 @@ CONFIG_NANOPB=y CONFIG_NET_CONFIG_AUTO_INIT=n CONFIG_NET_CONNECTION_MANAGER=y CONFIG_WIFI_NM_MAX_MANAGED_INTERFACES=2 -CONFIG_NET_L2_WIFI_SHELL=y CONFIG_NET_MGMT_EVENT_QUEUE_SIZE=32 CONFIG_NET_IF_MAX_IPV4_COUNT=3 diff --git a/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf b/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf index a5cc5a0a3..95374d211 100644 --- a/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf +++ b/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf @@ -10,10 +10,12 @@ 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=65536 +CONFIG_CPP=n +CONFIG_SHELL=n + CONFIG_FPU=y CONFIG_ICACHE=y CONFIG_DCACHE=y @@ -23,7 +25,6 @@ CONFIG_USERSPACE=n CONFIG_ARM_MPU=y CONFIG_MAX_THREAD_BYTES=4 -CONFIG_SHELL_STACK_SIZE=32768 CONFIG_MAIN_STACK_SIZE=32768 CONFIG_LLEXT_HEAP_SIZE=128 @@ -40,13 +41,10 @@ CONFIG_SDHC_INIT_PRIORITY=75 CONFIG_SDIO_STACK=y CONFIG_CYW4343W=y CONFIG_WIFI=y -CONFIG_NET_L2_WIFI_SHELL=y CONFIG_AIROC_WIFI_CUSTOM=y CONFIG_STM32_MEMMAP=y -CONFIG_NET_CORE_LOG_LEVEL_DBG=y - CONFIG_NETWORKING=y CONFIG_NET_IPV6=n CONFIG_NET_IPV4=y @@ -58,8 +56,6 @@ CONFIG_DNS_RESOLVER=y CONFIG_DNS_SERVER_IP_ADDRESSES=y CONFIG_DNS_SERVER1="8.8.8.8" -CONFIG_INIT_STACKS=y - CONFIG_NET_SOCKETS=y CONFIG_NET_SOCKETS_NET_MGMT=y CONFIG_NET_SOCKETS_SOCKOPT_TLS=y @@ -82,13 +78,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 From 41e6e9349db481274339100f4b269c6190ae6865 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Mon, 1 Dec 2025 12:30:12 +0100 Subject: [PATCH 5/5] variants: Relocate llext heap and main stack. Signed-off-by: iabdalkader --- .../arduino_portenta_h7_stm32h747xx_m7.conf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf b/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf index 95374d211..4d5631b26 100644 --- a/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf +++ b/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf @@ -11,7 +11,8 @@ CONFIG_CDC_ACM_DTE_RATE_CALLBACK_SUPPORT=y CONFIG_LLEXT_STORAGE_WRITABLE=n CONFIG_SHARED_MULTI_HEAP=y -CONFIG_HEAP_MEM_POOL_SIZE=65536 +CONFIG_HEAP_MEM_POOL_SIZE=32768 +CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=-1 CONFIG_CPP=n CONFIG_SHELL=n @@ -28,6 +29,10 @@ CONFIG_MAX_THREAD_BYTES=4 CONFIG_MAIN_STACK_SIZE=32768 CONFIG_LLEXT_HEAP_SIZE=128 +CONFIG_CODE_DATA_RELOCATION=y +CONFIG_MAIN_STACK_REGION="DTCM" +CONFIG_LLEXT_HEAP_REGION="SRAM2" + CONFIG_ADC=y CONFIG_PWM=y CONFIG_DMA=y