diff --git a/CMakeLists.txt b/CMakeLists.txt index 47fd59e7e..3f5d8142d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,7 @@ if (CONFIG_ARDUINO_API) endif() endif() -if (CONFIG_ARDUINO_API AND NOT CONFIG_LLEXT) +if (CONFIG_ARDUINO_API AND NOT CONFIG_LLEXT_EDK) add_subdirectory(cores) add_subdirectory(libraries) zephyr_include_directories(${variant_dir}) diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp index bab3b4100..0b3905cfd 100644 --- a/cores/arduino/main.cpp +++ b/cores/arduino/main.cpp @@ -89,14 +89,14 @@ extern "C" __attribute__((section(".entry_point"), used)) void entry_point(struc extern uintptr_t _ebss; extern uintptr_t __heap_start; extern uintptr_t __heap_end; - extern uintptr_t kheap_llext_heap; - extern uintptr_t kheap_llext_heap_size; + extern uintptr_t kheap__sketch_heap; + extern uintptr_t kheap__sketch_heap_size; //__asm volatile ("cpsie i"); printk("System Heap end: %p\n", &__heap_end); printk("System Heap start: %p\n", &__heap_start); - printk("Sketch Heap start: %p, size %p\n", &kheap_llext_heap, &kheap_llext_heap_size); + printk("Sketch Heap start: %p, size %p\n", &kheap__sketch_heap, &kheap__sketch_heap_size); memcpy(&_sdata, &_sidata, (&_edata - &_sdata) * sizeof(uint32_t)); memset(&_sbss, 0, (&_ebss - &_sbss) * sizeof(uint32_t)); diff --git a/extra/build.sh b/extra/build.sh index e490e1c3f..4227265eb 100755 --- a/extra/build.sh +++ b/extra/build.sh @@ -101,11 +101,18 @@ cp ${BUILD_DIR}/zephyr/zephyr.dts firmwares/zephyr-$variant.dts cp ${BUILD_DIR}/zephyr/.config firmwares/zephyr-$variant.config # Generate the provides.ld file for linked builds -echo "Generating exported symbol scripts" -extra/gen_provides.py "${BUILD_DIR}/zephyr/zephyr.elf" -L > ${VARIANT_DIR}/syms-dynamic.ld +echo "Generating exported symbol scripts for dynamic builds" +extra/gen_provides.py "${BUILD_DIR}/zephyr/zephyr.elf" -L \ + "kheap_llext_heap=kheap__sketch_heap" \ + "kheap_llext_heap_size=kheap__sketch_heap_size" > ${VARIANT_DIR}/syms-dynamic.ld + +echo "Generating exported symbol scripts for static builds" extra/gen_provides.py "${BUILD_DIR}/zephyr/zephyr.elf" -LF \ - "+kheap_llext_heap" \ + -R '__device_dts_ord_\d+' \ + "+kheap__sketch_heap" \ "+kheap__system_heap" \ + "kheap_llext_heap=kheap__sketch_heap" \ + "kheap_llext_heap_size=kheap__sketch_heap_size" \ "*sketch_base_addr=_sketch_start" \ "*sketch_max_size=_sketch_max_size" \ "*loader_max_size=_loader_max_size" \ diff --git a/extra/gen_provides.py b/extra/gen_provides.py index 39bfa8efd..6f612d112 100755 --- a/extra/gen_provides.py +++ b/extra/gen_provides.py @@ -122,6 +122,10 @@ def main(): argparser.add_argument('-F', '--funcs', action='store_true', help='Extract all public functions') + argparser.add_argument('-R', '--regexp', + action='append', + default=[], + help='Extract all public symbols matching regexp') argparser.add_argument('file', help='ELF file to parse') argparser.add_argument('syms', nargs='*', @@ -198,6 +202,9 @@ def main(): llext_sym_addr = sym['st_value'] name = get_str_at(elf, get_ptr_at(elf, llext_sym_addr)) value = get_ptr_at(elf, llext_sym_addr + NativePtr.length) + elif args.regexp and any(map(lambda x: re.match(x, name), args.regexp)): + comment = "regexp_sym" + value = sym['st_value'] if name in deref_syms: value = get_ptr_at(elf, value) @@ -221,8 +228,7 @@ def main(): out_syms[name + "_size"] = (sym['st_size'], [f"size of {name}"]) if not out_syms: - sys.stderr.write("No symbols found matching the criteria.\n") - fail = True + sys.stderr.write("Warning: No symbols found matching the criteria.\n") if fail: sys.exit(1) diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt index 428885a70..78d83984a 100644 --- a/loader/CMakeLists.txt +++ b/loader/CMakeLists.txt @@ -40,3 +40,4 @@ target_sources(app PRIVATE ${app_sources}) target_compile_definitions(app PUBLIC _XOPEN_SOURCE=700) target_link_libraries(app PUBLIC blobs) + diff --git a/loader/Kconfig b/loader/Kconfig index c7d6c4069..7b87232e9 100644 --- a/loader/Kconfig +++ b/loader/Kconfig @@ -4,6 +4,10 @@ # SPDX-License-Identifier: Apache-2.0 # +config LLEXT_HEAP_SIZE + int + default SKETCH_HEAP_SIZE + source "Kconfig.zephyr" config LLEXT_HEAP_REGION @@ -17,3 +21,9 @@ config MAIN_STACK_REGION depends on CODE_DATA_RELOCATION help Specify the memory region for main stack. + +config SKETCH_HEAP_SIZE + int "Sketch heap size in KB" + default 32 + help + Specify the size in KB for the sketch heap diff --git a/loader/main.c b/loader/main.c index 7be8a34fd..b1b141489 100644 --- a/loader/main.c +++ b/loader/main.c @@ -110,6 +110,14 @@ __attribute__((retain)) const uintptr_t sketch_max_size = DT_REG_SIZE(DT_NODELAB #endif __attribute__((retain)) const uintptr_t loader_max_size = LOADER_MAX_SIZE; +#ifdef CONFIG_LLEXT +extern struct k_heap llext_heap; +#define SKETCH_HEAP llext_heap +#else +K_HEAP_DEFINE(_sketch_heap, CONFIG_SKETCH_HEAP_SIZE << 10); +#define SKETCH_HEAP _sketch_heap +#endif + static int loader(const struct shell *sh) { const struct flash_area *fa; int rc; @@ -266,16 +274,15 @@ static int loader(const struct shell *sh) { #endif #endif - extern struct k_heap llext_heap; typedef void (*entry_point_t)(struct k_heap *heap, size_t heap_size); entry_point_t entry_point = (entry_point_t)(base_addr + HEADER_LEN + 1); - entry_point(&llext_heap, llext_heap.heap.init_bytes); + entry_point(&SKETCH_HEAP, CONFIG_SKETCH_HEAP_SIZE << 10); // should never reach here for (;;) { k_sleep(K_FOREVER); } } - +#ifdef CONFIG_LLEXT #if defined(CONFIG_LLEXT_STORAGE_WRITABLE) uint8_t *sketch_buf = k_aligned_alloc(4096, sketch_buf_len); @@ -294,7 +301,6 @@ static int loader(const struct shell *sh) { uint8_t *sketch_buf = (uint8_t *)base_addr; #endif -#ifdef CONFIG_LLEXT struct llext_buf_loader buf_loader = LLEXT_BUF_LOADER(sketch_buf, sketch_buf_len); struct llext_loader *ldr = &buf_loader.loader; @@ -315,7 +321,6 @@ static int loader(const struct shell *sh) { printk("Failed to find main function\n"); return -ENOENT; } -#endif #ifdef CONFIG_USERSPACE /* @@ -350,12 +355,10 @@ static int loader(const struct shell *sh) { k_thread_join(&llext_thread, K_FOREVER); #else -#ifdef CONFIG_LLEXT llext_bootstrap(ext, main_fn, NULL); #endif -#endif - +#endif // CONFIG_LLEXT return 0; } diff --git a/loader/prj.conf b/loader/prj.conf index 023da8fd3..3c0fbbf13 100644 --- a/loader/prj.conf +++ b/loader/prj.conf @@ -22,6 +22,7 @@ CONFIG_LLEXT_EXPORT_DEVICES=y CONFIG_LLEXT_RODATA_NO_RELOC=y CONFIG_LLEXT_EDK=y +CONFIG_LLEXT_EDK_EXPORT_SYMS=y CONFIG_LLEXT_EDK_FORMAT_TAR_ZSTD=y CONFIG_GPIO=y diff --git a/variants/_ldscripts/memory-check.ld b/variants/_ldscripts/memory-check.ld index 47fc8d679..c7ff5e33c 100644 --- a/variants/_ldscripts/memory-check.ld +++ b/variants/_ldscripts/memory-check.ld @@ -15,5 +15,5 @@ PROVIDE(__heap_end = 0x50000000); PROVIDE(kheap__system_heap = 0x40000000); PROVIDE(kheap__system_heap_size = 0x10000000); -PROVIDE(kheap_llext_heap = 0x60000000); -PROVIDE(kheap_llext_heap_size = 0x10000000); +PROVIDE(kheap__sketch_heap = 0x60000000); +PROVIDE(kheap__sketch_heap_size = 0x10000000); diff --git a/variants/_ldscripts/memory-static.ld b/variants/_ldscripts/memory-static.ld index 85a3c48fe..f552ce408 100644 --- a/variants/_ldscripts/memory-static.ld +++ b/variants/_ldscripts/memory-static.ld @@ -8,7 +8,7 @@ MEMORY { /* 16 below compensates for the zsk header that is added before the .bin */ FLASH (rx) : ORIGIN = _sketch_start + 16, LENGTH = _sketch_max_size - 16 - RAM (rwx) : ORIGIN = kheap_llext_heap, LENGTH = kheap_llext_heap_size + RAM (rwx) : ORIGIN = kheap__sketch_heap, LENGTH = kheap__sketch_heap_size } PROVIDE(__heap_start = kheap__system_heap); diff --git a/variants/arduino_nano_33_ble_nrf52840_sense/arduino_nano_33_ble_nrf52840_sense.conf b/variants/arduino_nano_33_ble_nrf52840_sense/arduino_nano_33_ble_nrf52840_sense.conf index 687962fe7..0d7267ecc 100644 --- a/variants/arduino_nano_33_ble_nrf52840_sense/arduino_nano_33_ble_nrf52840_sense.conf +++ b/variants/arduino_nano_33_ble_nrf52840_sense/arduino_nano_33_ble_nrf52840_sense.conf @@ -35,7 +35,7 @@ CONFIG_PWM=y CONFIG_LLEXT_STORAGE_WRITABLE=n CONFIG_HEAP_MEM_POOL_SIZE=16384 -CONFIG_LLEXT_HEAP_SIZE=128 +CONFIG_SKETCH_HEAP_SIZE=128 CONFIG_MAIN_STACK_SIZE=16384 CONFIG_FPU=y diff --git a/variants/arduino_nano_matter_mgm240sd22vna/arduino_nano_matter_mgm240sd22vna.conf b/variants/arduino_nano_matter_mgm240sd22vna/arduino_nano_matter_mgm240sd22vna.conf index 6cf91d986..690319345 100644 --- a/variants/arduino_nano_matter_mgm240sd22vna/arduino_nano_matter_mgm240sd22vna.conf +++ b/variants/arduino_nano_matter_mgm240sd22vna/arduino_nano_matter_mgm240sd22vna.conf @@ -3,7 +3,7 @@ CONFIG_MAIN_STACK_SIZE=16000 CONFIG_HEAP_MEM_POOL_SIZE=112000 -CONFIG_LLEXT_HEAP_SIZE=64 +CONFIG_SKETCH_HEAP_SIZE=64 CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 CONFIG_FPU=y diff --git a/variants/arduino_nicla_sense_me_nrf52832/arduino_nicla_sense_me_nrf52832.conf b/variants/arduino_nicla_sense_me_nrf52832/arduino_nicla_sense_me_nrf52832.conf index ff9bebbad..d19cdb882 100644 --- a/variants/arduino_nicla_sense_me_nrf52832/arduino_nicla_sense_me_nrf52832.conf +++ b/variants/arduino_nicla_sense_me_nrf52832/arduino_nicla_sense_me_nrf52832.conf @@ -26,5 +26,5 @@ CONFIG_ADC=y CONFIG_LLEXT_STORAGE_WRITABLE=n CONFIG_HEAP_MEM_POOL_SIZE=8192 -CONFIG_LLEXT_HEAP_SIZE=15 +CONFIG_SKETCH_HEAP_SIZE=15 CONFIG_MAIN_STACK_SIZE=2048 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 b2a4b13d4..8e08851d7 100644 --- a/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf +++ b/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf @@ -28,7 +28,7 @@ CONFIG_LOG_BACKEND_UART_AUTOSTART=n CONFIG_LOG_DEFAULT_LEVEL=2 CONFIG_MAIN_STACK_SIZE=32768 -CONFIG_LLEXT_HEAP_SIZE=128 +CONFIG_SKETCH_HEAP_SIZE=128 CONFIG_HEAP_MEM_POOL_SIZE=32768 CONFIG_ISR_STACK_SIZE=8192 CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=8192 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 ce75edafc..476d51ccf 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 @@ -31,7 +31,7 @@ CONFIG_ARM_MPU=y CONFIG_MAX_THREAD_BYTES=4 CONFIG_MAIN_STACK_SIZE=32768 -CONFIG_LLEXT_HEAP_SIZE=128 +CONFIG_SKETCH_HEAP_SIZE=128 CONFIG_CODE_DATA_RELOCATION=y CONFIG_MAIN_STACK_REGION="DTCM"