Closed makmorit closed 1 year ago
40e7646までの対応の結果、nRF5340アプリケーションのバージョン依存コードについて移行が完了し、ビルドエラーも発生しなくなった事を確認いたしました。
bash-3.2$ ./westbuild.sh
-- west build: generating a build system
Loading Zephyr default modules (Zephyr base).
-- Application: /Users/makmorit/GitHub/onecard-fido/nRF5340_app/secure_device_app
:
[503/503] Generating zephyr/merged_domains.hex
build_signed/zephyr/app_update.bin -> ../firmwares/secure_device_app/app_update.PCA10095_01.0.4.8.bin
Application binary for secure bootloader is now available.
bash-3.2$ ./westbuild.sh -f
ZEPHYR_BASE=/Users/makmorit/opt/ncs_2.2.0/zephyr (origin: env)
-- west flash: rebuilding
cmake version 3.25.2 is OK; minimum version is 3.13.1
Running CMake: /usr/local/bin/cmake --build build_signed
:
runners.nrfjprog: nrfjprog --pinreset -f NRF53 --snr 1050084791
Applying pin reset.
-- runners.nrfjprog: Board with serial number 1050084791 flashed successfully.
bash-3.2$
しかしながら、実際にアプリケーションをスタートさせようとすると、以下のようなエラーが発生し、結果としてファームウェアが起動しません。
*** Booting Zephyr OS build v3.2.99-ncs1 ***
I: Starting bootloader
I: Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
I: Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
I: Boot source: none
I: Swap type: none
I: Bootloader chainload address offset: 0xc000
*** Booting Zephyr OS build v3.2.99-ncs1 ***
[00:00:00.010,559] <err> os: ***** USAGE FAULT *****
[00:00:00.010,559] <err> os: Stack overflow (context area not valid)
[00:00:00.010,589] <err> os: r0/a1: 0x20004270 r1/a2: 0x200225f8 r2/a3: 0x00000100
[00:00:00.010,589] <err> os: r3/a4: 0x00000000 r12/ip: 0x00000000 r14/lr: 0x0003152b
[00:00:00.010,620] <err> os: xpsr: 0x29000200
[00:00:00.010,620] <err> os: Faulting instruction address (r15/pc): 0x0003130c
[00:00:00.010,650] <err> os: >>> ZEPHYR FATAL ERROR 2: Stack overflow on CPU 0
[00:00:00.010,681] <err> os: Current thread: 0x200040b0 (unknown)
[00:00:00.068,450] <err> os: Halting system
残念ながらこのエラーメッセージだけでは、原因・対策を切り分けようがないです。
ですので、アプリケーションに搭載したコンポーネントを全て外して、nRF5340アプリケーションのベースとなったsample/bluetooth/peripheral_dis
の状態に一旦戻したのち、コンポーネントを1点ずつ追加して戻しながら、原因を切り分けるしかなさそうです。
ですので、アプリケーションに搭載したコンポーネントを全て外して、nRF5340アプリケーションのベースとなった
sample/bluetooth/peripheral_dis
の状態に一旦戻したのち、コンポーネントを1点ずつ追加して戻しながら、原因を切り分けるしかなさそうです。
ご参考までに、sample/bluetooth/peripheral_dis
の状態に一旦戻した時の動作ログを添付します。
AndroidとのBLE接続/データ読出し/切断の流れが正常に確認できております。
*** Booting Zephyr OS build v3.2.99-ncs1 ***
I: Starting bootloader
I: Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
I: Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
I: Boot source: none
I: Swap type: none
I: Bootloader chainload address offset: 0xc000
*** Booting Zephyr OS build v3.2.99-ncs1 ***
Bluetooth initialized
Advertising successfully started
[00:00:00.030,761] <inf> bt_hci_core: No ID address. App must call settings_load()
[00:00:00.039,276] <err> bt_gatt: Failed to save Database Hash (err -2)
Connected
Disconnected (reason 0x13)
残念ながらこのエラーメッセージだけでは、原因・対策を切り分けようがないです。 ですので、アプリケーションに搭載したコンポーネントを全て外して、nRF5340アプリケーションのベースとなったsample/bluetooth/peripheral_disの状態に一旦戻したのち、コンポーネントを1点ずつ追加して戻しながら、原因を切り分けるしかなさそうです。
詳細調査した結果、エラーZEPHYR FATAL ERROR 2: Stack overflow on CPU 0
の根源は、以下の3処理のようです。
app_event.c
(app_main_thread
、app_data_thread
の2関数)
K_THREAD_DEFINE(app_main_thread_id, CONFIG_APP_SETTINGS_THREAD_STACK_SIZE, app_main_thread, NULL, NULL, NULL, CONFIG_APP_SETTINGS_THREAD_PRIORITY, 0, 0);
K_THREAD_DEFINE(app_data_thread_id, CONFIG_APP_SETTINGS_THREAD_STACK_SIZE, app_data_thread, NULL, NULL, NULL, CONFIG_APP_SETTINGS_THREAD_PRIORITY, 0, 0);
app_crypto.c
(app_crypto_init
関数)
SYS_INIT(app_crypto_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEVICE);
app_main_thread
、app_data_thread
の2関数はメインスレッドなので、これが稼働しないと、当然ながらnRF5340アプリケーションは動作しないことになります。
なので、LEDもボタンも効かなければ、BLEアドバタイズも開始せず、USBチャネルも使用できないことになります。
一方のapp_crypto_init
は、mbed TLSやPSAといった暗号処理関連のソフトウェア/ハードウェアの仕様変更により、もしかすると再構築を強いられるかもしれません。
それなりに対策工数がかかると思われますので、いったん本プルリクエストはクローズし、別件の個別プルリクエストにて、ひとつひとつ対応したいと思います。
概要
nRF Connect SDKのバージョンアップ(v1.9.1-->v2.2.0)に伴い、nRF5340アプリケーションのバージョン依存コードを見直します。
現状、下記の対応が必要なことが判明しています。
zephyr.h
の廃止 コードで#include
しているところを修正(または他のヘッダーファイルと置き換え)bluetooth/peripheral_dis
の修正追従 nRF5340アプリケーションのベースとなったサンプルアプリbluetooth/peripheral_dis
の修正に合わせ、nRF5340アプリケーションのコードを修正 (事前に、変更箇所を洗い出す必要があります)