コグノスケ


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

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

2026年6月18日

ZephyrのOut-of-treeアプリケーションその6 - シリアル出力

目次: Zephyr

前回はシリアルに文字を出力するアプリを作って動かしました。肝心のシリアル出力をどうやって見るのか?これは「使うボードによる」が答えなんですけど、一例としてNUCLEO-F446REでのやり方を説明します。

NUCLEOボードはボードのどこかに型番(MBxxxxみたいな番号)が書いてあります。F446REの場合はMB1136です。この型番に対応する回路図(MB1136-DEFAULT-C05 Board schematic)をダウンロードしてください。

今回使ったボードのSoC STM32F446はシリアル送受信のハードウェアUSART/UARTを6つ持っています。Zephyrのデフォルト設定でIn/Outピンが割当たっているのは、6つのうち2つ(usart1とusart2)でした。それぞれのTX/RXのピンは下記の通りです。

  • usart1 TX/RX: PB6, PB7
  • usart2 TX/RX: PA2, PA3

先ほどダウンロードしたMB1136の回路図を見ると、usart1/usart2に割り当てられたピンは下記のように何らかのコネクタに接続されています。

  • usart1 TX: PB6: Arduino Connector(CN5) 3番
  • usart1 RX: PB7: Morpho Connector(CN7) 21番
  • usart2 TX: PA2: Arduino Connector(CN9) 2番(SB63をブリッジする必要がある)
  • usart2 RX: PA3: Arduino Connector(CN9) 1番(SB62をブリッジする必要がある)

Zephyrのデバイスツリーを見ると、シリアル出力にはusart2を使うようになっています。

NUCLEO-F446REのデバイスツリー(work_dir/zephyr/boards/st/nucleo_f446re/nucleo_f446re.dts)

/ {
	model = "STMicroelectronics STM32F446RE-NUCLEO board";
	compatible = "st,stm32f446re-nucleo";

	chosen {
		zephyr,console = &usart2;
		zephyr,shell-uart = &usart2;
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,canbus = &can2;
	};

ハンダ付けできる環境があるなら、SB63やSB62を0Ω抵抗などでジャンパしてArduino Connector(CN9)の2番と1番にUARTケーブルを繋げばシリアル出力が見えるはずです。

Out-of-treeアプリでDevice tree overlay

ハンダ付け以外の方法として、シリアル出力先を変えてusart1にする方法を紹介します。シリアル出力先を変えるにはZephyrのデバイスツリーを書き変える必要がありますが、Zephyr本体のファイルを変更するとwest updateのときにZephyrが更新できなくなったりして面倒です。

素晴らしいことにデバイスツリーを後から書き換える便利な方法があって、アプリ側にオーバーレイ(Device tree overlay)ファイルを用意するだけでOKです。コンソール出力をusart2からusart1に上書きする例を示します。

デバイスツリーオーバーレイ(work_dir/hello/app/boards/nucleo_f446re.overlay)

/ {
	chosen {
		zephyr,console = &usart1;
		zephyr,shell-uart = &usart1;
	};
};

このファイルを作成したら再度アプリをビルドして、Arduino Connector(CN5) 3番とMorpho Connector(CN7) 21番にUARTケーブルを繋げばシリアル出力が見えるはずです。

シリアル出力例
** Booting Zephyr OS build v4.4.0 ***
Hello, World!

うまくいけばこんな感じの出力が得られるはずです。動きましたね。

おまけ

シリアル出力の受信方法は何でも良いですけど、これも一例を紹介します。まずUARTを送受信できるHWが必要です。私のおすすめは手軽なUSB接続のUARTケーブルです。秋月電子通商のFTDI USBシリアル変換ケーブル(3.3V)みたいなやつです。

PCに接続すると/dev/ttyUSBnのような名前で認識されるので、ターミナルソフトで開きます。pyserial-minitermを使う場合はこんな感じです。

pyserial-minitermの起動例
$ sudo apt-get install -y python3-serial

$ pyserial-miniterm /dev/ttyUSB0 115200 --eol LF --raw

オプション--eolは行末がCRかLFか指定します。--rawは印字できない文字(エスケープシーケンスなど)を加工せず素通しします。カーソルを移動させたり、色付きの文字を出力するアプリケーションを動かすならこのオプションがあると見やすいです。

ボードに接続する前にケーブルのTX/RXを確認すると良いです。

  • UARTケーブルに何も接続せず(つまりTXもRXもオープン状態)
  • ターミナルソフトに何か文字を打つ
  • 何も表示されないはず
  • UARTケーブルのTXとRXを短絡させる
  • ターミナルソフトに何か文字を打つ
  • 打ち込んだ文字がそのまま表示されるはず

もし何も表示されない場合は/dev/ttyUSBnのデバイス指定を間違っている可能性が高いので確認してみてください。

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

コメント一覧

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



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 この記事にコメントする



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

管理用メニュー

link 記事を新規作成

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

最近のコメント20件

  • 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...」
  • link 25年12月18日
    すずきさん (12/23 23:15)
    「ですね、まあpread+readだと話が...」
  • link 25年12月18日
    hdkさん (12/21 08:34)
    「昔試しにデバイスドライバーを作ったことが...」
  • link 25年11月28日
    hdkさん (12/04 08:10)
    「あれ、停止直前くらいの時のトルクコンバー...」
  • link 25年11月28日
    すずきさん (12/03 11:24)
    「トルクコンバーターがいてエンブレは掛かり...」
  • link 25年11月28日
    hdkさん (12/02 08:02)
    「"停止直前に急にエンブレがほぼゼロになる...」
  • link 25年10月6日
    すずきさん (10/10 13:14)
    「ですね。ccはもはやコンパイラというより...」
  • link 25年10月6日
    hdkさん (10/10 08:27)
    「ただのHello, worldでも試して...」
  • link 25年9月29日
    すずきさん (10/03 00:29)
    「なんと、メタパッケージ入れてなかったです...」
  • link 25年9月29日
    hdkさん (10/02 06:51)
    「あれ、dkmsは自動ビルドされるのが便利...」
  • link 20年8月24日
    すずきさん (08/30 22:06)
    「ですね、自分も今はPulseAudioを...」
  • link 20年8月24日
    hdkさん (08/29 09:32)
    「ALSA懐かしい... PulseAud...」
  • link 16年2月14日
    すずきさん (08/04 01:31)
    「お役に立ったようでしたら幸いです。」
  • link 16年2月14日
    enc28j60さん (08/03 17:40)
    「ちょうど詰まっていたところです。\n非常...」
  • link 25年7月20日
    すずきさん (07/30 00:10)
    「ギクシャクするのは減速時の2速シフトダウ...」
  • link 25年7月20日
    hdkさん (07/29 07:38)
    「2速発進でギクシャクするんですか? 面白...」

最近の記事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