目次: Zephyr
前回ZephyrのOut-of-treeアプリがビルドできました。今回は実行と実行結果の確認です。あえてwestに頼らずOpenOCDとGDBで殴っていくスタイルで行きます。OpenOCDのビルド方法は以前(2026年6月2日の日記参照)紹介したのでそちらをご覧ください。使用機材は下記のとおりです。
PCとボードをUSB接続します。NUCLEOにはデバッガがオンボードで搭載されています。ボードのUSBコネクタ(CN1)は給電兼、デバッガの接続用です。NUCLEOは切り込みに沿ってボードを折るとデバッガ部分を物理的に切り離せるようになっていて、面白いですね。よく考えられているな〜と思います。

NUCLEO-F446RE、左側がメインSoC、右側がデバッガ
OpenOCDはオプション-fでデバッガやデバッグ対象の設定ファイルを指定します。今回はST-Link(interface/stlink.cfg)とSTM32F4系(target/stm32f4x.cfg)の設定ファイルを指定します。
オプション-cは起動時に実行するコマンドを指定します。"bindto 0.0.0.0"は他のマシンからの接続を受け付けるためのコマンドで、OpenOCDを実行するマシンとZephyrをビルドするマシンが同じ場合は省略してOKです。"init; reset halt"は初期化後にボードをリセットしてCPU停止状態にしておくために指定しています。要らないはずなんですが、なぜか接続できないときがあるんですよねー。なんでだろ?
$ cd openocd/tcl $ sudo ../src/openocd -f interface/stlink.cfg -f target/stm32f4x.cfg -c 'bindto 0.0.0.0' -c 'init; reset halt'
GDBはARM用ならOKですが、Zephyr SDKにあるarm-zephyr-eabi-gdbを使うのが手軽でしょう。バイナリのパスはビルドしたOut-of-treeアプリ(build/zephyr/zephyr.elf)を指定します。
$ cd work_dir/hello $ ../zephyr-sdk/gnu/arm-zephyr-eabi/bin/arm-zephyr-eabi-gdb build/zephyr/zephyr.elf target remote :3333 monitor reset halt load c
GDBが起動したらtargetコマンドでOpenOCDに接続し、リセット(monitor reset halt)、ロード(load)、コンティニュー(c)すればアプリが実行開始されます。これでやっとHello, World!を拝め……ません。まだNUCLEO-F446REのシリアル出力を見る方法を説明していないからです。
続きは次回。
この記事にコメントする
目次: Zephyr
便利ツールwestとZephyr SDKをインストールしました。やっとOut-of-treeアプリケーション作成の説明ができます。基本的にはZephyr Example Applicationを見たら良いですけど、機能満載すぎてどこ見たら良いかわからんと思うので、最低限必要な要素だけを1つずつ組み立てて紹介します。
最初にwestのマニフェストを作ります。これがないとwest initができません。マニフェストではwestのカスタムコマンドを定義できますが、今は要らないのでzephyr本体だけ記述します。
manifest:
remotes:
- name: zephyrproject-rtos
url-base: https://github.com/zephyrproject-rtos
projects:
- name: zephyr
remote: zephyrproject-rtos
revision: v4.4.0
import:
name-allowlist:
- cmsis_6
- hal_stm32
今回はST-Microのnucleo F446REボードを使いますので、Cortex-M用にcmsis_6とhal_stm32をallowlistに入れました。
$ cd work_dir $ west init -l hello $ west update $ west zephyr-export $ west packages pip --install
チュートリアルに紹介されているコマンドは-m URLオプションでリモートのGitリポジトリを指定する方法でした。これはこれで便利ですが、なんでもかんでもGitHubにアップロードするのも面倒です。今回は-lオプションでローカルディレクトリを指定する方法を使います。
もし間違えてしまったら.westディレクトリを全て消してwest initからやり直せば良いです。zephyr-exportとpackages pip --installは1回やればもうやらなくていいはず。たぶん。
アプリケーションの骨組みを作ります。ディレクトリ名は何でも良いですが、ここではhello/appとします。CMakeLists.txt, Kconfig, prj.confとmain.cを作ります。
cmake_minimum_required(VERSION 3.13.1)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(app LANGUAGES C)
target_sources(app PRIVATE src/main.c)
menu "Zephyr"
source "Kconfig.zephyr"
endmenu
(空っぽでOK)
#include <zephyr/kernel.h>
int main(void)
{
printk("Hello, World!\n");
return 0;
}
作成し終わったらビルドします。
$ cd work_dir/hello
$ west build -b nucleo_f446re app
[158/158] Linking C executable zephyr/zephyr.elf
Memory region Used Size Region Size %age Used
FLASH: 17136 B 512 KB 3.27%
RAM: 4480 B 128 KB 3.42%
BACKUP_SRAM: 0 B 4 KB 0.00%
SRAM0: 0 B 128 KB 0.00%
IDT_LIST: 0 B 32 KB 0.00%
Generating files from /home/ubuntu/work_dir/hello/build/zephyr/zephyr.elf for board: nucleo_f446re/stm32f446xx
もし下記のような既にconfig済だぞ!みたいなエラーで怒られるときは、
ERROR: Build directory /home/ubuntu/work_dir/hello/build targets board nucleo_f446re, but board warp7 was specified. (Clean the directory, use --pristine, or use --build-dir to specify a different one.) FATAL ERROR: refusing to proceed without --force due to above error
ビルド生成物(buildディレクトリ)を全削除してからやり直してください。最小アプリであればビルドにさほど時間はかかりませんし、毎回buildディレクトリを削除してフルビルドするストロングスタイルでもいいと思います。以上がうまくいっていたら、ディレクトリはこうなっているはずです。
work_dir |-- .venv |-- .west |-- hello |-- modules |-- zephyr `-- zephyr-sdk-1.0.1
ビルドできたら実行したいですね。続きはまた今度。
この記事にコメントする
目次: OpenOCD
以前(2023年6月28日の日記参照)紹介したときからビルド方法が変わったかも?と思ったらそんなことはなく同じでした。コードはSourceForgeのGitリポジトリが本家ですが、GitHubにも公式ミラー(OpenOCD GitHub公式ミラー)があります。気のせいかもしれませんが、GitHubの方が速い気がします。
今回はUbuntu 24.04のDockerイメージからビルドしてみます。
$ docker run -it ubuntu:24.04 /bin/bash
# apt-get update
# apt-get install -y git gcc g++ autoconf automake libtool pkg-config make \
libusb-1.0-0-dev libhidapi-dev libgpiod-dev libftdi1-dev
以下、Docker内で実行する場合はrootユーザーなのでプロンプトの先頭は#ですが、一般ユーザーで実行しても一緒なのでプロンプトの先頭は$で表記します。
$ git clone https://git.code.sf.net/p/openocd/code openocd-code $ cd openocd-code $ git submodule init Submodule 'jimtcl' (https://github.com/msteveb/jimtcl.git) registered for path 'jimtcl' Submodule 'src/jtag/drivers/libjaylink' (https://gitlab.zapb.de/libjaylink/libjaylink.git) registered for path 'src/jtag/drivers/libjaylink' $ git submodule update --recursive $ bootstrap $ ./configure --enable-internal-jimtcl --enable-internal-libjaylink OpenOCD configuration summary --------------------------------------------------- ... CoreSight Direct Memory yes (auto) Linux GPIO bitbang through sysfs yes (auto) Remote Bitbang driver yes (auto) SEGGER J-Link Programmer yes (auto) Xilinx XVC PCIe and AXI drives yes (auto) Bus Pirate yes (auto) ...
基本的にOpenOCDのconfigureは依存ライブラリを発見すると関連機能を自動的に有効にしますから、特に何も指定する必要がありません。が、今回は下記を指定します。
ディストリビューション提供のlibjaylinkやjimtclを使っても構わないですが、Ubuntu 20.04のような古めのディストリビューションを使っている場合はバージョンが合わないので内蔵のライブラリを使うと良いです。
OpenOCDはconfigureのオプションを打ち間違っても怒らずにそのまま進んでしまうので、configureの最後に表示されるconfiguration summaryのSEGGER J-Link Programmerがyesになっているか確認しましょう。
$ make -j8
$ ./src/openocd --version
Open On-Chip Debugger 0.12.0+dev-01537-ge6752ecbc (2026-06-02-00:00)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
うまくいったようです。良かった良かった。
この記事にコメントする
目次: Zephyr
前回はPythonとwestの準備をしました。今回はZephyrをビルドするツールzephyr-sdkをインストールします。基本的にはZephyr SDKにあるとおりです。westを使える方はwestで良いですが詰みやすい(※)ので、インストーラを使う方法も知っておいて損はないでしょう。
SDKのバージョンは何でも良い訳ではなくZephyr Version Compatibilityにある通り、SDKのバージョンによってサポートしているZephyrのバージョンが違うのでご注意ください。
今回はSDK 1.0系とZephyr 4.4.0を使いましたが、特に理由はないので必要に応じて適切なバージョンを選んでください。
$ mkdir work_dir $ cd work_dir $ tar xf zephyr-sdk-1.0.1_linux-x86_64_minimal.tar.xz $ cd zephyr-sdk-1.0.1 Install GNU toolchain [y/n]? y Install GNU toolchains for all targets [y/n]? y → この問いにnと答えると、アーキテクチャごとに要るか/要らないかを聞かれるので、 要るものだけにyと答えると時間節約になります。 Install LLVM toolchain [y/n]? y Install host tools [y/n]? y Register Zephyr SDK CMake package [y/n]? y Create symbolic links for old Zephyr bisectability [y/n]? y → 以前はSDK直下にアーキテクチャのディレクトリ(例: x86_64-zephyr-elf)がありましたが、 llvmが導入されてgnu/以下に移動しました。 昔のディレクトリ構造を期待する古いZephyrを使うなら、yと答えてシンボリックリンクを作っておいたほうが良いです。
基本は全部yと答えれば良いはずです。インストール時間を短くしたい人は"Install GNU toolchains for all targets"にnと答えて要るものだけに絞りましょう。
(※)west sdk installでもインストールできますが、westだと何が起きたのか全くわかりません。成功するうちは良いものの、いざ失敗するとどうしようもなくなります。
Zephyr SDKを/optや/usr/localなどに置く場合はZephyrのビルドシステムが勝手にSDKを探してくれます。もし別の場所に置きたい場合はもうひと手間必要です。ホームディレクトリに下記の.zephyrrc設定ファイルを作ります。
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
export ZEPHYR_SDK_INSTALL_DIR=/home/ubuntu/work_dir/zephyr-sdk-1.0.1
設定を反映させるため、zephyrのディレクトリにあるzephyr-env.shをsourceで取り込みます。
$ cd work_dir/zephyr $ source zephyr-env.sh
先ほど作った設定ファイルの内容が環境変数に反映されていれば成功です。
$ env | grep -i zephyr ZEPHYR_BASE=/home/ubuntu/work_dir/zephyr PWD=/home/ubuntu/work_dir/zephyr ZEPHYR_TOOLCHAIN_VARIANT=zephyr ZEPHYR_SDK_INSTALL_DIR=/home/ubuntu/work_dir/zephyr-sdk-1.0.1 PATH=/home/ubuntu/work_dir/zephyr/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
注意点は、シェルを終了させると環境変数が消えてしまうことです。したがってシェルを立ち上げる度に、
$ cd work_dir $ source .venv/bin/activate $ cd zephyr $ source zephyr-env.sh
を実行する必要がありまして面倒です……。手間なく設定する方法がありそうなので、ご存じの方は教えてくださいませ。以上がうまくいっていたら、ディレクトリはこうなっているはずです。
work_dir |-- .venv `-- zephyr-sdk-1.0.1
またセットアップだけで話が終わってしまいました。Zephyrは本題に至るまでが遠いです。次こそアプリを作ります。
この記事にコメントする
| < | 2026 | > | ||||
| << | < | 06 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| - | 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | - | - | - | - |
20年2月22日
26年6月18日
26年6月23日
26年6月11日
26年4月29日
26年5月3日
26年5月31日
26年6月8日
23年5月15日
26年4月8日
26年5月28日
26年5月22日
21年7月10日
26年6月2日
22年3月18日
26年5月24日
26年5月16日
21年12月28日
26年4月7日
26年2月8日
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
2026年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: