2025年9月15日月曜日

μiTRONプログラマーがZephyrに挑戦! その6

前回からの続きです。

このテーマを最初からご覧になる場合はこちらからどうぞ。


「zephyr-sample」プロジェクトを動かそう!

さて、今回の本題「zephyr-sample」プロジェクトを「Visual Studio Code」で開き、ビルドをしてターゲット「nRF7002 Development Kit」上で動かしてみましょう。

まずは「zephyr-sample」のソースコードをダウンロードします。

これには2つの方法があります。

まず一つ目、以下のGitHubからZIPでダウンロードする方法です。

以下のリポジトリにアクセスしてもらって、緑色の「<>Code」というボタンをクリックします。


https://github.com/RyutaroMorita/zephyr-sample

「Zephyr-sample」リポジトリ - 1


次に「<>Code」ボタンの下に展開された「Download ZIP」という表示をクリックして「zephyr-sample-master.zip」をダウンロードします。

「Zephyr-sample」リポジトリ - 2


あとは「zephyr-sample-master.zip」を展開すればOKです。


2つ目の方法は「git clone」コマンドを使用することです。

Cygwinなどを使用して、ターミナルから以下のコマンドを入力すると「zephyr-sample」の

ソースツリーがダウンロードできます。

Cygwinのセットアップ方法は、こちらの記事を参考にしてください。


$ git clone git@github.com:RyutaroMorita/zephyr-sample.git

Cygwinターミナル


では、ゲットした「zephyr-sample」を「Visual Studio Code」で開いてみましょう。

まずは「nRF7002 Development Kit」をパソコンに接続した状態で「Visua
l Studio Code」を起動し、以下の操作を行います。

次に画面左端のアイコンが並んでいるところ、その中の四角いアイコン(「nRF Connect」)をクリックします。

「Visual Studio Code」 - 1


画面左端の各項目が以下のように変化したはずです。

その中で、一番上にある「WELCOME」という表示の直下「+ Open an existing application」の表示をクリックします。

「Visual Studio Code」 - 2


以下のようにディレクトリ選択ダイアログが表示されます。

ここで、ゲットしたソースコードのディレクトリを選択します。

ZIPファイルでダウンロードした場合は、ディレクトリ名が「zephyr-sample-master」、「git clone」コマンドでクローンした場合は、ディレクトリ名が「zephyr-sample」です。

いずれも「src」というディレクトリの一個上の階層のディレクトリを指定し、ダイアログ右下の「OK」ボタンをクリックです。

「Open an existing application」ダイアログ


すると、以下の警告が表示されます。

ここは「はい、作成者を信頼します」をクリックしてください。

警告表示


画面上方のリストビューには「zephyr-sample-master」、もしくは「zephyr-sample」という表示はされていますね?

画面左端の「フォルダー」アイコンをクリックしてソースディレクトリの中を確認してみましょう。

「Visual Studio Code」 - 3


すると、ソースディレクトリの中にいくつかのファイルの他、更に「src」というディレクトリがあるようです。

この中もクリックして展開してみましょう。

「Visual Studio Code」 - 4


ここから「zephyr-sample」の各ソースコードにアクセスできます。

試しに「sample1.c」をクリックすると「Visual Studio Code」のメインビューにソースコードが表示されます。

「Visual Studio Code」 - 5


ここまで来れば、このソースコードのビルドや実行は、一からプロジェクトを作った前回と同じ手順です。

前回の記事のこの項目を参考に「zephyr-sample」のビルドと実行を行いましょう!

但し、今回はデバッガも本格的に使用したいので「Add Build Configuration」の画面の「Board Target」を「nrf7002dk/nfr5340/cpuapp/ns」に設定するのはもちろんのこと…

「Visual Studio Code」 - 6


…「Optimization level」も「Optimize for debugging (-Og)」に設定してから「Genarate and Build」ボタンをクリックしましょう。

「Visual Studio Code」 - 7


これを設定しないと、ブレークポイントを設定しても効いてくれませんのでご注意を!

ちなみに、これを忘れてデバッグしようとすると、以下のように「Debug options not enabled」というポップアップが出ますので、後で気付くことが良くあります…。

警告ポップアップ


さて、不幸にもビルドの過程でエラーが発生してしまった方へ…。

もしや、以下のようなエラーメッセージではありませんでしたか?

私は今まさに、この記事を書いているときに遭遇しました…。

  • C:/ncs/v3.0.2/modules/crypto/mbedtls/library/memory_buffer_alloc.c:602:1: fatal error: opening dependency file secure_fw\partitions\crypto\mbedcrypto\nrf_security_src\CMakeFiles\crypto_service_mbedcry
  • pto.dir\C_\ncs\v3.0.2\modules\crypto\mbedtls\library\memory_buffer_alloc.o.d: No such file or directory
  •   602 | }
  •       | ^
  • compilation terminated.
  • ninja: build stopped: subcommand failed.
  • FAILED: modules/trusted-firmware-m/tfm-prefix/src/tfm-stamp/tfm-build tfm/bin/tfm_s.elf tfm/bin/tfm_s.bin tfm/bin/tfm_s.hex tfm/bin/tfm_s_signed.bin tfm/bin/tfm_s_ns_signed.bin tfm/api_ns/interface/li
  • b/s_veneers.o tfm/api_ns/interface/src/tfm_attest_api.c tfm/api_ns/interface/src/tfm_crypto_api.c tfm/api_ns/interface/src/tfm_fwu_api.c tfm/api_ns/interface/src/tfm_its_api.c tfm/api_ns/interface/src
  • /tfm_platform_api.c tfm/api_ns/interface/src/tfm_ps_api.c tfm/api_ns/interface/src/tfm_tz_psa_ns_api.c tfm/api_ns/interface/src/tfm_ioctl_core_ns_api.c C:/cygwin64/home/User/zephyr-sample-ma
  • ster/zephyr-sample-master/build/zephyr-sample-master/modules/trusted-firmware-m/tfm-prefix/src/tfm-stamp/tfm-build C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build/zephy
  • r-sample-master/tfm/bin/tfm_s.elf C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build/zephyr-sample-master/tfm/bin/tfm_s.bin C:/cygwin64/home/User/zephyr-sample-m
  • aster/zephyr-sample-master/build/zephyr-sample-master/tfm/bin/tfm_s.hex C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build/zephyr-sample-master/tfm/bin/tfm_s_signed.bin C:
  • /cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build/zephyr-sample-master/tfm/bin/tfm_s_ns_signed.bin C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master
  • /build/zephyr-sample-master/tfm/api_ns/interface/lib/s_veneers.o C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build/zephyr-sample-master/tfm/api_ns/interface/src/tfm_attes
  • t_api.c C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build/zephyr-sample-master/tfm/api_ns/interface/src/tfm_crypto_api.c C:/cygwin64/home/User/zephyr-sample-mas
  • ter/zephyr-sample-master/build/zephyr-sample-master/tfm/api_ns/interface/src/tfm_fwu_api.c C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build/zephyr-sample-master/tfm/api_
  • ns/interface/src/tfm_its_api.c C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build/zephyr-sample-master/tfm/api_ns/interface/src/tfm_platform_api.c C:/cygwin64/home/Ryutaro
  • uMorita/zephyr-sample-master/zephyr-sample-master/build/zephyr-sample-master/tfm/api_ns/interface/src/tfm_ps_api.c C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build/zephy
  • r-sample-master/tfm/api_ns/interface/src/tfm_tz_psa_ns_api.c C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build/zephyr-sample-master/tfm/api_ns/interface/src/tfm_ioctl_cor
  • e_ns_api.c
  • cmd.exe /C "cd /D C:\cygwin64\home\User\zephyr-sample-master\zephyr-sample-master\build\zephyr-sample-master\tfm && C:\ncs\toolchains\0b393f9e1b\opt\bin\cmake.exe --build . -j 1"
  • [12/231] Generating misc/generated/syscalls.json, misc/generated/struct_tags.json
  • ninja: build stopped: subcommand failed.
  • FAILED: _sysbuild/sysbuild/images/zephyr-sample-master-prefix/src/zephyr-sample-master-stamp/zephyr-sample-master-build C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build/
  • _sysbuild/sysbuild/images/zephyr-sample-master-prefix/src/zephyr-sample-master-stamp/zephyr-sample-master-build
  • cmd.exe /C "cd /D C:\cygwin64\home\User\zephyr-sample-master\zephyr-sample-master\build\zephyr-sample-master && C:\ncs\toolchains\0b393f9e1b\opt\bin\cmake.exe --build ."
  • ninja: build stopped: subcommand failed.
  • FATAL ERROR: command exited with status 1: 'C:\ncs\toolchains\0b393f9e1b\opt\bin\cmake.EXE' --build C:/cygwin64/home/User/zephyr-sample-master/zephyr-sample-master/build

  •  * ターミナル プロセスが終了コード 1 で終了しました。
  •  * ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。


この原因は、アプリケーションの存在するディレクトリのパスが長すぎることです。

この記事を書いている時は「zephyr-sample」のリポジトリからZIPファイルをダウンロードして、それを展開したものを「c:\cygwin\home\<ユーザー名>\」以下にコピーしました。

Windows11で「zephyr-sample-master.zip」を普通に展開してしまうと「zephyr-sample-master」ディレクトリの中に、更に「zephyr-sample-master」ディレクトリが生成され、その中にソースコードが格納されることになります。

この構造を「Visual  Studio Code」に設定し「nRF Connect SDK Toolchain」を使ってしまったのが悪かった!

この場合、アプリケーションのディレクトリは非常に長くなります。

すなわち…


c:\cygwin\home\<ユーザー名>\zephyr-sample-master\zephyr-sample-master\~


…となります。

これは「nRF Connect SDK Toolchain」の制限(というか、バグ?)による問題です。

結構困っている人も多いみたいです。

回避策は、上記のパスを以下のように再配置することです。

つまり、余計なZIPファイル展開の過程で生成されてしまった余計な「zephyr-sample-master」ディレクトリを一階層上げてパスを短くします。


c:\cygwin\home\<ユーザー名>\zephyr-sample-master\~


これで正常にビルドが通るようになります。

とはいえ元のパスでも、それほど非常識な長さとは思えず、Nordic社に改善を求めたいところではあります。

こういうクダラナイ問題で長時間ハマると、気力がゴッソリ削られますので、マジお願いしますよ~。


ともあれ、正しくビルドが通り「zephyr-sample」が動作すると、TeraTermには以下のような表示が現れます。

TeraTerm


そもそも、この「zephyr-sample」は「Zephyr」というRTOSを学習するために、μiTRONとの比較としてTOPPERS/ASP公式のサンプルプログラムを可能な限り忠実に再現したものです。

もちろん、コンフィギュレーションの方法は大分違いますが。

したがって、それ以外の操作方法や処理の流れは「TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトで遊ぼう」の記事とほとんど同じです。

是非、遊んでみていただけると嬉しいです。

見た目の違いといえば、メッセージの「task(タスク)」が「Zephyr」の文化に合わせて「thread(スレッド)」となっている点くらいですかね。


次回は、このシリーズの最終回です。

今回の「zephyr-sample」で判明した「Zephyr」とμiTRONとの違いや、今後「Zephyr」を使用する上で注意しなければならないRTOSの設計思想の違いなどを自分なりにまとめてみたいと思います。

あくまで自分自身のための備忘録や警鐘の意味合いで…。

でも、私のようにμiTRONに長年慣れていて急に「Zephyr」を使わなきゃならなくなった人って、結構いるんじゃないかな?

…Nordicのせいだ。


<続く>

μiTRONプログラマーがZephyrに挑戦! その6

前回からの続き です。 このテーマを最初からご覧になる場合は こちら からどうぞ。 「zephyr-sample」プロジェクトを動かそう! さて、今回の本題「 zephyr-sample 」プロジェクトを「 Visual Studio Code 」で開き、ビルドをしてターゲット「...