コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2026年6月11日 >>> 2026年5月29日
link もっと後

2026年6月11日

ZephyrのOut-of-treeアプリケーションその5 - OpenOCDとGDBで実行

目次: Zephyr

前回ZephyrのOut-of-treeアプリがビルドできました。今回は実行と実行結果の確認です。あえてwestに頼らずOpenOCDとGDBで殴っていくスタイルで行きます。OpenOCDのビルド方法は以前(2026年6月2日の日記参照)紹介したのでそちらをご覧ください。使用機材は下記のとおりです。

  • ボード: STMicroelectronics NUCLEO-F446RE
  • デバッガ: NUCLEOのオンボードチップ(ST-Link)

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停止状態にしておくために指定しています。要らないはずなんですが、なぜか接続できないときがあるんですよねー。なんでだろ?

OpenOCDの起動コマンド例
$ 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)を指定します。

GDBの起動とアプリ実行のためのコマンド例
$ 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のシリアル出力を見る方法を説明していないからです。

続きは次回。

編集者:すずき(2026/06/26 01:10)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2026年6月8日

ZephyrのOut-of-treeアプリケーションその4 - 最小限のアプリ

目次: Zephyr

便利ツールwestとZephyr SDKをインストールしました。やっとOut-of-treeアプリケーション作成の説明ができます。基本的にはZephyr Example Applicationを見たら良いですけど、機能満載すぎてどこ見たら良いかわからんと思うので、最低限必要な要素だけを1つずつ組み立てて紹介します。

westのマニフェスト

最初にwestのマニフェストを作ります。これがないとwest initができません。マニフェストではwestのカスタムコマンドを定義できますが、今は要らないのでzephyr本体だけ記述します。

hello/west.yml

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に入れました。

west initとその他の設定
$ 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を作ります。

hello/app/CMakeLists.txt

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)
hello/app/Kconfig

menu "Zephyr"
source "Kconfig.zephyr"
endmenu
hello/app/prj.conf

(空っぽでOK)
hello/app/src/main.c

#include <zephyr/kernel.h>

int main(void)
{
	printk("Hello, World!\n");

	return 0;
}

作成し終わったらビルドします。

Out-of-treeアプリのビルド
$ 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済だぞ!みたいなエラーで怒られるときは、

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

ビルドできたら実行したいですね。続きはまた今度。

編集者:すずき(2026/06/23 03:22)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2026年6月2日

OpenOCDのビルド2026

目次: OpenOCD

以前(2023年6月28日の日記参照)紹介したときからビルド方法が変わったかも?と思ったらそんなことはなく同じでした。コードはSourceForgeのGitリポジトリが本家ですが、GitHubにも公式ミラー(OpenOCD GitHub公式ミラー)があります。気のせいかもしれませんが、GitHubの方が速い気がします。

今回はUbuntu 24.04のDockerイメージからビルドしてみます。

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ユーザーなのでプロンプトの先頭は#ですが、一般ユーザーで実行しても一緒なのでプロンプトの先頭は$で表記します。

リポジトリ取得、初期化、configure
$ 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は依存ライブラリを発見すると関連機能を自動的に有効にしますから、特に何も指定する必要がありません。が、今回は下記を指定します。

  • --enable-internal-libjaylink: OpenOCDが内蔵しているlibjaylinkを使用
  • --enable-internal-jimtcl: OpenOCDが内蔵しているjimtclを使用

ディストリビューション提供の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

うまくいったようです。良かった良かった。

編集者:すずき(2026/06/02 21:25)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2026年5月31日

ZephyrのOut-of-treeアプリケーションその3 - Zephyr SDKのインストール

目次: Zephyr

前回はPythonとwestの準備をしました。今回はZephyrをビルドするツールzephyr-sdkをインストールします。基本的にはZephyr SDKにあるとおりです。westを使える方はwestで良いですが詰みやすい(※)ので、インストーラを使う方法も知っておいて損はないでしょう。

SDKのバージョンは何でも良い訳ではなくZephyr Version Compatibilityにある通り、SDKのバージョンによってサポートしているZephyrのバージョンが違うのでご注意ください。

今回はSDK 1.0系とZephyr 4.4.0を使いましたが、特に理由はないので必要に応じて適切なバージョンを選んでください。

Zephyr-SDKのインストール
$ 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をローカルディレクトリに置く場合

Zephyr SDKを/optや/usr/localなどに置く場合はZephyrのビルドシステムが勝手にSDKを探してくれます。もし別の場所に置きたい場合はもうひと手間必要です。ホームディレクトリに下記の.zephyrrc設定ファイルを作ります。

設定ファイル~/.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/24 01:08)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2026年6月11日 >>> 2026年5月29日
link もっと後

管理用メニュー

link 記事を新規作成

<2026>
<<<06>>>
-123456
78910111213
14151617181920
21222324252627
282930----

最近のコメント5件

  • link 26年1月23日
    すずきさん (01/29 09:48)
    「おおー、そんな昔からなんですね。歴史感じ...」
  • link 26年1月23日
    hdkさん (01/27 19:53)
    「#! はUNIX v8からだったってWi...」
  • link 24年12月9日
    すずきさん (01/18 15:45)
    「Thank you for your i...」
  • link 24年12月9日
    Up2Uさん (01/15 12:57)
    「Hi I also find the p...」
  • link 25年12月18日
    すずきさん (12/23 23:51)
    「良く見たらksys_read()でfil...」

最近の記事3件

  • link 20年2月22日
    すずき (06/26 02:03)
    「[Zephyr - まとめリンク] 目次: Zephyr導入、ブート周りHello! Zephyr OS!!Hello! Ze...」
  • link 26年6月18日
    すずき (06/26 02:02)
    「[ZephyrのOut-of-treeアプリケーションその6 - シリアル出力] 目次: Zephyr前回はシリアルに文字を出...」
  • link 26年6月23日
    すずき (06/26 01:27)
    「[ANA国内線予約サイトが悲惨なことに] 4月くらいにANAの国内線予約サイトが国際線と共通のクラウドシステム(Amadeus...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 2026年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www2.katsuster.net
RDFファイル RSS 1.0

最終更新: 06/26 02:03