nRF5340 multi image build APP + NET core

Hello!

I need to create the following kind of application to nRF5340:

  • APP core: various peripherals (modem, I2C ICs etc) + business logic;
  • NET core:
    • BLE stack (from BLE beacon to more sophisticated solutions);
    • my custom code;

I've spent some time investigating both Zephyr and NRF multicore/child image samples, but none of them covered my needs.

To start with a small leap, I tried to refactor zephyr/samples/hello_world to compile to APP and NET cores with a single command, to have a merged hex and finally to print some text on both cores. I've followed the nrf/samples/nrf5340/multicore sample, but aci dir never gets executed, so the child image is never compiled.

I've attached the modified hello_world. The command was west build -b nrf5340dk_nrf5340_cpuapp

(I've seen in some samples the child_image directory holding config fragments for the child image. It's again not appropriate to me, because I want to be able to specify the config with full path, like it's possible for APP core with the -DCONF=... CMake option).

Please help me implementing a one-command-buildable multi-image hello world for APP+NET ;)

Thanks, regards,

5584.hello_world_multicore.zip


Here's my second attempt based on this page:

doesn't find CPUNET domain, but nrf5340dk_nrf5340_cpuapp board dir features one...

2845.hello_world2.zip

Parents
  • Hi,

    For your first project, if you want to add it as a Zephyr module (as you are doing with aci), then ZEPHYR_EXTRA_MODULES must be set in the project CMakeLists.txt. For example:

    cmake_minimum_required(VERSION 3.20.0)
    
    set(ZEPHYR_EXTRA_MODULES ${CMAKE_CURRENT_LIST_DIR})
    
    find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
    project(hello_world)
    
    target_sources(app PRIVATE src/main.c)

    For the second project, the board must be specified with ${CONFIG_DOMAIN_CPUNET_BOARD}. You should also be aware that if you provide a relative path without ${CMAKE_CURRENT_LIST_DIR}, then the path will be relative to the build directory. For example, SOURCE_DIR net-src will make the path "hello_world/build/hello-world-net/net-src" in this case.

    add_child_image(
      NAME hello-world-net
      SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/net-src
      DOMAIN cpunet
      BOARD ${CONFIG_DOMAIN_CPUNET_BOARD}
      )

    The child image will also need CMakeLists.txt and prj.conf files.

    Best regards,
    Marte

Reply
  • Hi,

    For your first project, if you want to add it as a Zephyr module (as you are doing with aci), then ZEPHYR_EXTRA_MODULES must be set in the project CMakeLists.txt. For example:

    cmake_minimum_required(VERSION 3.20.0)
    
    set(ZEPHYR_EXTRA_MODULES ${CMAKE_CURRENT_LIST_DIR})
    
    find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
    project(hello_world)
    
    target_sources(app PRIVATE src/main.c)

    For the second project, the board must be specified with ${CONFIG_DOMAIN_CPUNET_BOARD}. You should also be aware that if you provide a relative path without ${CMAKE_CURRENT_LIST_DIR}, then the path will be relative to the build directory. For example, SOURCE_DIR net-src will make the path "hello_world/build/hello-world-net/net-src" in this case.

    add_child_image(
      NAME hello-world-net
      SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/net-src
      DOMAIN cpunet
      BOARD ${CONFIG_DOMAIN_CPUNET_BOARD}
      )

    The child image will also need CMakeLists.txt and prj.conf files.

    Best regards,
    Marte

Children
Related