Common issues and solutions when working with EoS, eboot, and ebuild.
CMake Error: EOS_PRODUCT is not defined
Solution: Specify the product profile:
cmake -B build -DEOS_PRODUCT=iotSee Choosing a Product Profile for all 41 options.
Solution: Install the ARM toolchain:
# Ubuntu/Debian
sudo apt install gcc-arm-none-eabi
# macOS
brew install --cask gcc-arm-embedded
# Windows — download from https://developer.arm.com/downloads/-/gnu-rmundefined reference to `eos_hal_init'
Cause: HAL source files not included in the build.
Solution: Ensure you're compiling the HAL sources:
# If using CMake, add_subdirectory(eos) handles this automatically.
# If using manual compilation:
gcc -c eos/hal/src/hal_common.c -I eos/hal/include -I eos/includeCause: Both Linux and RTOS backends compiled together.
Solution: Only compile ONE backend:
# For host/Linux builds:
gcc -c eos/hal/src/hal_linux.c ...
# For RTOS/bare-metal builds:
gcc -c eos/hal/src/hal_rtos.c ...Cause: The product profile doesn't enable BLE, or eos_config.h is not included.
Solution:
#include <eos/eos_config.h> /* Must be included before hal_extended.h */
#include <eos/hal_extended.h>
/* Guard your BLE code: */
#if EOS_ENABLE_BLE
eos_ble_init(&ble_cfg);
#endifOr switch to a profile that enables BLE (e.g., iot, watch, wearable).
Cause: Too many peripherals enabled, or debug symbols included.
Solution:
- Use a targeted product profile instead of building everything
- Disable unused peripherals in your profile header
- For release builds:
cmake -B build -DCMAKE_BUILD_TYPE=Release - Strip debug symbols:
arm-none-eabi-strip firmware.elf
Solution:
- Check USB cable is connected (use the debug USB port, not the kit USB)
- Install J-Link drivers from SEGGER
- On Linux, add udev rules:
sudo cp 99-jlink.rules /etc/udev/rules.d/ - Try
nrfjprog --recoverto unlock a locked device
Solution:
- Install ST-Link drivers (Windows) or
libusb(Linux) - Check USB cable
- Try:
openocd -f interface/stlink.cfg -f target/stm32h7x.cfg - On Linux:
sudo openocd ...or add udev rules
Cause: Flash might be write-protected or corrupted.
Solution:
# Mass erase first
nrfjprog --eraseall
# Then program
nrfjprog --program build/firmware.hex --verify
# For STM32:
openocd -f interface/stlink.cfg -f target/stm32h7x.cfg \
-c "init; reset halt; flash erase_address 0x08000000 0x200000; exit"Checklist:
- Correct baud rate? Default is 115200
- Correct COM port / device? (
/dev/ttyACM0,/dev/cu.usbmodem*) - TX/RX pins not swapped?
- USB cable supports data (not charge-only)?
- UART initialized in code? Check
eos_uart_init()is called beforeeos_uart_write()
Checklist:
- Correct pin number? Check your board's schematic:
- nRF52840-DK: pin 13 (LED1)
- STM32 Nucleo: pin 5 (PA5 = LD2)
- Custom board: check your schematic
- GPIO initialized as output? Check
eos_gpio_init()config - For host builds: GPIO operations print to stdout (no physical LED)
Checklist:
- Called
eos_kernel_init()before creating tasks? - Called
eos_kernel_start()after creating tasks? (This function doesn't return) - Task stack size large enough? Try 1024 or 2048 bytes
- Task priority valid? Higher number = higher priority
- No infinite loop before
eos_kernel_start()?
Checklist:
EOS_ENABLE_MULTICOREset to 1 in your product profile?- Called
eos_multicore_init()beforeeos_core_start()? - Target board actually has multiple cores?
- Secondary core entry function has correct signature:
void fn(void *arg)
Cause: Firmware signature doesn't match, or firmware is corrupted.
Solution:
- Verify you're using the correct signing key
- Check that the firmware binary isn't truncated
- Ensure
eos_ota_finish()is called beforeeos_ota_verify() - Check
eos_ota_get_status()for detailed error state
Solution:
cd EoS/ebuild
pip install -e .
# Or run directly:
python -m ebuild --helpIf ebuild analyze doesn't recognize your MCU:
Edit ebuild/hardware/soc/ and add a YAML file:
# ebuild/hardware/soc/my_mcu.yaml
name: MY_MCU_FAMILY
vendor: my_vendor
architecture: arm
core: cortex-m4f
flash_kb: 512
ram_kb: 128
peripherals:
- UART
- SPI
- I2C
- GPIOebuild analyze "Custom ARM Cortex-M4F MCU, 512KB flash, 128KB RAM, UART SPI I2C GPIO"See Choosing a Product Profile.
- Check the API Reference for correct function signatures
- Read the example applications for working code patterns
- Review the Integration Guide for eos + eboot workflow