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

  • Thanks, I could move on with your help.

    I've created a static Partition Manager config for NET core (pm_static.yml):

    hello-world-net:
    address: 0x1000000
    size: 0x3F000
    region: flash_primary

    otp_partition:
    address: 0x103F000
    size: 0x800
    region: flash_primary

    cfg_partition:
    address: 0x103F800
    size: 0x800
    region: flash_primary

    And this seems to be correct, because the the partitions_cpunet.yml is generated and reflects to my static config. However, compilation fails, because pm_config.h isn't found. How can I fix this?

    Additionally, I think another pm_static.yml shall be defined for the APP core too. I want the 'app' partition occupy the entire APP flash (start from 0x0), because momentarily no MCUboot/b0n is to be used. So I want to burn the generated APP image at 0x0 and run without any boot manager. This stands for NET image too (running without boot manager from 0x1000000). Is it possible at all?

    thanks, regards,

    PS: I've attached the current app + build log, hope it helps.hello_world_dualcore.zip

  • Hello Marte!

    Have you got any idea how to solve the missing pm_config.h issue?

    thanks

  • Hi,

    I have been looking into this, and it seems like the error is due to the order in which the configuration steps are performed. The child image is not added to the build early enough, causing partition manager to give an error. Adding the child image in, for example, nrf/samples/CMakeLists.txt should fix the issue.

    Best regards,
    Marte

Reply Children
  • So you mean that this issue can only be fixed by patching/modifying the CMakeLists.txt in NCS? Other multi image samples are manually added to the mentioned CMakeLists.txt?

  • Hi,

    It can also be done using Zephyr modules, as described in Adding a child image using Zephyr modules.

    Best regards,
    Marte

  • Did you folks ever got this sorted out? I'm trying to add custom netcore (starting with hci_rpmsg sample) into my application and I'm in a world of hurt trying to get it working. I got the same pm_config.h issue where it looked like the file was generated under hci_rpmsg module but not under netcore and thus failing). I tried few other approaches but always something stopped working.

    It would be great if somebody could share minimal boilerplate for getting this working with BT. 

  • I've finally solved this, but I believe it's not the elegant Nordic-recommended way. I got fed up struggling with multi images, child images and their configuration.

    In our project both the app and net cores have an MCUBoot followed by our app. Luckily MCUboot compilation can easily be enabled in menuconfig, and it's just working without any hacking. Furthermore, custom MCUboot and Zephry kernel configurations can also be specified as config files, so we don't have to rely on "config fragments" (which sometimes drives me crazy), easier to overview, we don't have to dig in the build directory for the generated final configs. In scenario config I could simply enable BLE too, NCS build system did all the required tricks. My original intent was to have a merged.hex containing all the images for APP and NET core, but I failed. Now I have separate hex files for APP and NET cores, but it turned out it's not a problem. By the way, they could be merged with mergehex or whatever, but I don't care...

    The point is: I couldn't make it with the above recommended "add_child_image" magic, but have finally found a tradeoff.

  • Thanks for the update. I very much appreciate Nordic way of being willing to address the questions on individual project bases but stuff like this has been asked several times so the basic first answer for those should be to point standalone example that does exactly this. Basic app core hello world with BT support and netcore with sufficient enablers. There are good standalone examples of hci_rpmsg but it is non-obvious what's the best way to integrate those two worlds together in the latest SDK.

    Let's see if Nordic folks respond and provide some additional information as there might be some example or new guidance since you first asked the question.

Related