hiro99ma blog

何か技術的なこと

Partition Manager (3)

2024/07/31

今までの簡単なまとめ

branch:rename_thingy53


オリジナルのThingy:53ボード定義ファイルではビルドが成功するのでログを比較すると、作ったボード定義ファイルではこのログが無かった。

NOT NS

Changed board to secure thingy53_nrf5340_cpuapp (NOT NS)

DevAcademy Lesson 3 Exercise 2 では MCUboot のボード定義ファイルを作成する手順が無い。 thingy53_nrf5340_cpuapp.confの中身をchild_image/mcuboot.confに貼り付ける。

これで上記のログは出力されるようになった。

commit

zephyr_pre0.elf

オリジナルのログはこう。

-- west build: building application
[5/274] Generating include/generated/version.h
-- Zephyr version: 3.5.99 (C:/ncs/v2.6.1/zephyr), build: v3.5.99-ncs1-1
[3/317] Generating include/generated/version.h
-- Zephyr version: 3.5.99 (C:/ncs/v2.6.1/zephyr), build: v3.5.99-ncs1-1
[317/317] Linking C executable zephyr\zephyr.elf

自作ログはこうでzephyr_pre0.elfのリンクでエラーになっている。

-- west build: building application
[5/274] Generating include/generated/version.h
-- Zephyr version: 3.5.99 (C:/ncs/v2.6.1/zephyr), build: v3.5.99-ncs1-1
[3/317] Generating include/generated/version.h
-- Zephyr version: 3.5.99 (C:/ncs/v2.6.1/zephyr), build: v3.5.99-ncs1-1
[312/317] Linking C executable zephyr\zephyr_pre0.elf
FAILED: zephyr/zephyr_pre0.elf zephyr/zephyr_pre0.map U:/Prog/BLE/nrf-ncs/blinky_devaca/build/mcuboot/zephyr/zephyr_pre0.map 
cmd.exe /C "cd . && C:\ncs\toolchains\cf2149caf2\opt\zephyr-sdk\arm-zephyr-eabi\bin\arm-zephyr-eabi-gcc.exe  -gdwarf-4 zephyr/CMakeFiles/zephyr_pre0.dir/misc/empty_file.c.obj -o zephyr\zephyr_pre0.elf  zephyr/CMakeFiles/offsets.dir/./arch/arm/core/offsets/offsets.c.obj  -fuse-ld=bfd  -T  zephyr/linker_zephyr_pre0.cmd  -Wl,-Map=U:/Prog/BLE/nrf-ncs/blinky_devaca/build/mcuboot/zephyr/zephyr_pre0.map  -Wl,--whole-archive  app/libapp.a  zephyr/libzephyr.a  zephyr/arch/common/libarch__common.a  zephyr/arch/arch/arm/core/libarch__arm__core.a  zephyr/arch/arch/arm/core/cortex_m/libarch__arm__core__cortex_m.a  zephyr/arch/arch/arm/core/cortex_m/cmse/libarch__arm__core__cortex_m__cmse.a  zephyr/lib/libc/minimal/liblib__libc__minimal.a  zephyr/lib/libc/common/liblib__libc__common.a  zephyr/soc/soc/arm/nordic_nrf/libsoc__arm__nordic_nrf.a  zephyr/boards/boards/arm/mdbt53a_nrf5340_cpuapp/libU____Prog__BLE__nrf-ncs__blinky_devaca__boards__arm__mdbt53a_nrf5340.a  zephyr/drivers/usb/device/libdrivers__usb__device.a  zephyr/drivers/usb/common/nrf_usbd_common/libdrivers__usb__common__nrf_usbd_common.a  zephyr/drivers/clock_control/libdrivers__clock_control.a  zephyr/drivers/flash/libdrivers__flash.a  zephyr/drivers/gpio/libdrivers__gpio.a  zephyr/drivers/hwinfo/libdrivers__hwinfo.a  zephyr/drivers/pinctrl/libdrivers__pinctrl.a  zephyr/drivers/regulator/libdrivers__regulator.a  zephyr/drivers/serial/libdrivers__serial.a  zephyr/drivers/timer/libdrivers__timer.a  modules/nrf/lib/fprotect/lib..__nrf__lib__fprotect.a  modules/nrf/subsys/pcd/lib..__nrf__subsys__pcd.a  modules/nrf/modules/mcuboot/hooks/lib..__nrf__modules__mcuboot__hooks.a  modules/nrf/drivers/hw_cc3xx/lib..__nrf__drivers__hw_cc3xx.a  modules/mcuboot/boot/bootutil/zephyr/libmcuboot_util.a  modules/mbedtls/libmbedTLSBase.a  modules/mbedtls/libmbedTLSCrypto.a  modules/mbedtls/libmbedTLSX509.a  modules/mbedtls/libmodules__mbedtls.a  modules/hal_nordic/nrfx/libmodules__hal_nordic__nrfx.a  modules/zcbor/libmodules__zcbor.a  -Wl,--no-whole-archive  zephyr/kernel/libkernel.a  -L"c:/ncs/toolchains/cf2149caf2/opt/zephyr-sdk/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/thumb/v8-m.main/nofp"  -LU:/Prog/BLE/nrf-ncs/blinky_devaca/build/mcuboot/zephyr  -lgcc  zephyr/arch/common/libisr_tables.a  modules/mbedtls/libmbedTLSBase.a  modules/mbedtls/libmbedTLSCrypto.a  modules/mbedtls/libmbedTLSX509.a  -mcpu=cortex-m33  -mthumb  -mabi=aapcs  -mfp16-format=ieee  -Wl,--gc-sections  -Wl,--build-id=none  -Wl,--sort-common=descending  -Wl,--sort-section=alignment  -Wl,-u,_OffsetAbsSyms  -Wl,-u,_ConfigAbsSyms  -nostdlib  -static  -Wl,-X  -Wl,-N  -Wl,--orphan-handling=warn  -Wl,-no-pie  C:/ncs/v2.6.1/nrfxlib/crypto/nrf_cc312_platform/lib/cortex-m33/soft-float/no-interrupts/libnrf_cc312_platform_0.9.19.a && cmd.exe /C "cd /D U:\Prog\BLE\nrf-ncs\blinky_devaca\build\mcuboot\zephyr && C:\ncs\toolchains\cf2149caf2\opt\bin\cmake.exe -E true""
c:/ncs/toolchains/cf2149caf2/opt/zephyr-sdk/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/../../../../arm-zephyr-eabi/bin/ld.bfd.exe: zephyr\zephyr_pre0.elf section `bss' will not fit in region `RAM'
c:/ncs/toolchains/cf2149caf2/opt/zephyr-sdk/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/../../../../arm-zephyr-eabi/bin/ld.bfd.exe: region `RAM' overflowed by 331864 bytes
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

理由の箇所を抜粋。

ld.bfd.exe: zephyr\zephyr_pre0.elf section `bss' will not fit in region `RAM'
ld.bfd.exe: region `RAM' overflowed by 331864 bytes

これは以前にもあったCONFIG_MCUBOOT_USE_ALL_AVAILABLE_RAMだろう。 =yになる条件がBOARD_THINGY53_NRF5340_CPUAPP_NS || BOARD_THINGY53_NRF5340_CPUAPPとなっているがKconfigに書いてあるのでボード定義ファイルをコピーしても反映されない。

commit

これでビルドが通った。

branch:rename_thingy53

ボード定義ファイル以外の箇所でボード依存の設定があるのは想定外だった。 BOARD_THINGY53_NRF5340_CPUAPP_NSでgrepすると以下があった。

Devicetree

LEDとボタンのピンアサインが違うのでDTSファイルを編集する。

どうでもよいが、ボタンとスイッチの違いが分からないので調べた。 回路図では SW と書いていたのでスイッチと呼んでいたのだが、DTSファイルでは”Push button”と書いてある。
スイッチは状態が変わって維持する、ボタンは押している間だけ状態を維持する、という感じか。 ただ「押しボタンスイッチ(MonotaRO, MiSUMi)というものもある。 説明文では「モーメンタリ動作:押したボタンを離すと初期状態に戻る」「オルタネイト動作:1回目の押し操作で動作状態を保持し、2回目の押し操作で動作状態を解除する」のように品物の名称ではなく挙動名で RS onlineでも”push button switch”といっているので電子部品のジャンルなのだろう(“momentary push button”と”maintained push button”という挙動名)。

話を元に戻そう。
DevAcademy Lesson 3 Exercise 1 で作ったDTSファイルはシンプルだ。 LEDだけしか設定しておらず、残りの部分はパーティションの定義くらいである。

Devicetree Visual Editorではチェックボックスをオフにすることもできるが、削除することもできる。

image

DTSファイルでは、オフにするとstatus = "disabled"、削除すると/delete-node/ &egu0;のようなコメントが付いた。 それよりなにより、Visual Editorを使うと include したファイルかどうかを区別しないので、図としては “common.dtsi” なども読み込んだ後の表示になるが GUI操作した結果は直接のDTSファイルにしか反映されない。
きれいにファイルを分けたかったらテキストエディタで編集するしかないだろう。GUIは確認用だ。

ただその前に、ビルドできているうちに Partition Manager が何をしたら読み込まれなくなるのか確認する。

pm-ext-flash

外部Flashを有効にする作業は DevAcademy Lesson 3 Exercise 2の8項から書かれていた。

pm-ext-flashの行をコメントアウトしてビルドするとPM_MCUBOOT_SECONDARY_IDPM_MCUBOOT_SECONDARY_1_IDがないなどでエラーになった。 PMファイルからmcuboot_secondary, mcuboot_secondary_1, external_flashを削除してもエラーになる。

Using MCUboot in nRF Connect SDKのNoteに、ファイル名のことではあるが direct-xipモードの場合はmcuboot_secondary_プレフィクスを付けるというようなことが書かれていた。 XIPの設定を見るとCONFIG_NORDIC_QSPI_NOR_XIPが当てはまりそうだったのでCONFIG_NORDIC_QSPI_NOR=nにしておく。

それでもエラーになるのであきらめてpm_sysflash.hを見るとMCUBOOT_IMAGE_NUMBER==2という条件がある。 child_image/mcuboot.confCONFIG_UPDATEABLE_IMAGE_NUMBER=1に変更したが変わらず。

ログを「secondary」で検索するとext_flash_mcuboot_secondary.confを読み込んでいるところがあった。

Parsing C:/ncs/v2.6.1/bootloader/mcuboot/boot/zephyr/Kconfig
Loaded configuration 'U:/Prog/BLE/nrf-ncs/blinky_devaca/boards/arm/mdbt53a_nrf5340/mdbt53a_nrf5340_cpuapp_defconfig'
Merged configuration 'C:/ncs/v2.6.1/bootloader/mcuboot/boot/zephyr/prj.conf'
Merged configuration 'C:/ncs/v2.6.1/nrf/subsys/pcd/pcd.conf'
Merged configuration 'C:/ncs/v2.6.1/nrf/subsys/partition_manager/ext_flash_mcuboot_secondary.conf'
Merged configuration 'C:/ncs/v2.6.1/nrf/modules/mcuboot/tfm.conf'
Merged configuration 'C:/ncs/v2.6.1/nrf/modules/mcuboot/fih_low_enable.conf'
Merged configuration 'C:/ncs/v2.6.1/nrf/subsys/partition_manager/partition_manager_enabled.conf'
Merged configuration 'U:/Prog/BLE/nrf-ncs/blinky_devaca/child_image/mcuboot.conf'
Merged configuration 'U:/Prog/BLE/nrf-ncs/blinky_devaca/build/mcuboot/zephyr/misc/generated/extra_kconfig_options.conf'
Configuration saved to 'U:/Prog/BLE/nrf-ncs/blinky_devaca/build/mcuboot/zephyr/.config'
Kconfig header saved to 'U:/Prog/BLE/nrf-ncs/blinky_devaca/build/mcuboot/zephyr/include/generated/autoconf.h'

ncs を grep すると2箇所あった。

MCUboot だと思うので前者か。 確かにCONFIG_PM_EXTERNAL_FLASH_MCUBOOT_SECONDARYbuild/mcuboot/zephyr/include/generated/autoconf.hに入っていた。 Kconfigのデフォルト値としてはCONFIG_BOOTLOADER_MCUBOOTがあればyらしい。
prj.confCONFIG_BOOTLOADER_MCUBOOT=yを設定しているのでCONFIG_PM_EXTERNAL_FLASH_MCUBOOT_SECONDARY=nも追加。

しかし・・・autoconf.hにはまだ定義が出てくる。 いろいろ設定を変更したのだが、どうやっても消えない。 外部Flashなんて付けるかどうかわからない部品だと思うのだが、なんでこんなに使わせようとしてくるのか。 CONFIG_FLASHが実は外部Flashのことを指しているかとも考えたが、CONFIG_SOC_FLASH_NRFCONFIG_FLASHと依存関係があるのでそういうことではなかろう。

もう、イメージを2つ使うというのは覆すことができないと思おう。
その上で外部Flashを使わないようにする。つまり PMファイルからmcuboot_secondaryなどを削除するのではなく、内蔵Flashを使うように割り当てる。 アドレスは適当だが、external_flashを使わないようにすることでビルドが通った。

commit

・・・と思ったのだが、リポジトリを整理してmainブランチにマージし、作業ディレクトリをきれいにして Build Configuration を作り直すとPM_MCUBOOT_SECONDARY_IDがないというビルドエラーが。。。
ビルドするボード定義ファイルを間違えていたのでなければ、nRF Kconfig GUI での変更を「Apply」で反映させた設定が有効だった(やり直したので設定が消えた)ということだろう。

うわー、参ったなあ。

< Top page