diverta / onecard-fido

MIT License
0 stars 0 forks source link

[nCS更改対応] バージョン依存コードの移行 #737

Closed makmorit closed 1 year ago

makmorit commented 1 year ago

概要

nRF Connect SDKのバージョンアップ(v1.9.1-->v2.2.0)に伴い、nRF5340アプリケーションのバージョン依存コードを見直します。

現状、下記の対応が必要なことが判明しています。

makmorit commented 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点ずつ追加して戻しながら、原因を切り分けるしかなさそうです。

makmorit commented 1 year ago

ご参考

ですので、アプリケーションに搭載したコンポーネントを全て外して、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)
makmorit commented 1 year ago

進捗

残念ながらこのエラーメッセージだけでは、原因・対策を切り分けようがないです。 ですので、アプリケーションに搭載したコンポーネントを全て外して、nRF5340アプリケーションのベースとなったsample/bluetooth/peripheral_disの状態に一旦戻したのち、コンポーネントを1点ずつ追加して戻しながら、原因を切り分けるしかなさそうです。

詳細調査した結果、エラーZEPHYR FATAL ERROR 2: Stack overflow on CPU 0の根源は、以下の3処理のようです。

app_event.capp_main_threadapp_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.capp_crypto_init関数)

SYS_INIT(app_crypto_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEVICE);

app_main_threadapp_data_threadの2関数はメインスレッドなので、これが稼働しないと、当然ながらnRF5340アプリケーションは動作しないことになります。 なので、LEDもボタンも効かなければ、BLEアドバタイズも開始せず、USBチャネルも使用できないことになります。

一方のapp_crypto_initは、mbed TLSやPSAといった暗号処理関連のソフトウェア/ハードウェアの仕様変更により、もしかすると再構築を強いられるかもしれません。

それなりに対策工数がかかると思われますので、いったん本プルリクエストはクローズし、別件の個別プルリクエストにて、ひとつひとつ対応したいと思います。