Zenn
🫐

QNX SDP 8.0 for RPi4でのPython/C開発環境構築

2024/12/14に公開

海洋ロボコンをやってた人です。

今回は、2024/11より非商用利用版が無料の永久ライセンスとして利用できるようになった「QNX SDP 8.0」について記載します。
ラズパイ用のQNX SDP 8.0 クイックスタートイメージファイルも提供されたと知り、昨年度から触ってみたかった「QNX SDP 8.0 for RPi4」を試してみたので、記事にまとめました。

記事のゴールは、QNXの導入からPython/Cの開発環境を構築できるところまでとします。

QNX 独自の処理については私自身も学習中(T.B.D)なので割愛しますが、導入まで試したい方は是非最後までご覧ください。

誤記等あればご指摘ください、どうぞよろしくお願いいたします。

1. What is QNX

ディフェンス大事なので敢えて強調します。

調べれば出てくる内容を集約しただけであり、X(旧Twitter)のQNX Newsを閲覧していれば誰でもアクセス可能な情報です。

非商用利用の場合、誰でも試せるようになった点、QNX公式Youtubeでも同様の内容が公開されています。

1.1. Input

・QNX公式ページ:このページからQNX SDP 8.0やGitLabなどへアクセスできます。

https://blackberry.qnx.com/en/products/qnx-everywhere?utm_medium=social&utm_source=bambu

・GitLab QNX 8.0 クイックスタート手順

https://gitlab.com/qnx/quick-start-images/raspberry-pi-qnx-8.0-quick-start-image

・マクニカ様の公開説明資料

https://www.macnica.co.jp/business/maas/columns/143114/

・BlackBerry QNX Academy for Functional Safety

https://dev.ti.com/tirex/explore/node?node=A__AEIJm0rwIeU.2P1OBWwlaA__BLACKBERRY-QNX-ACADEMY__AJunbYd__LATEST

1.2. RTOS

リアルタイムOS (Real-Time Operating System, RTOS) とは、主に組み込みシステムに使用されており、システムの要求に対してリアルタイム性能を満足する事に重点を置いたOSのこと

アールトスとも呼ばれ、リアルタイム性能が必要な自動車、医療機器、産業ロボット、産業機器、宇宙システムなどの機器に利用されます。

リアルタイムOSは汎用OS(Ubuntu)などと異なり、タスクスケジューラにより優先度の高いタスク順に処理を実行するため人命にかかわる要求が要件定義として入っている場合に有用だと言えます。

また、RTOSは優先度に応じて各処理をタスク単位で実行するため、プログラムが独立しており、複数人、複数チームでの開発がしやすいメリットもあります。

https://www.macnica.co.jp/business/maas/columns/143480/

1.3. QNX Portfolio

QNXのプロダクトポートフォリオとして下記のリンクに記載の通り

・OTAソフトウェアアップデート
・QNXフレークワークとミドルウェア
・QNXオペレーションシステム
・QNXハイパーバイザー
・QNX統合開発環境

が提供されています。

QNX OTAは実証済みのBlackBerryセキュリティテクノロジーを活用したOTA機能を利用できる点で利点があります。

QNX Hypervisorは異なる信頼性やセキュリティ要件を1SoCに統合することができ、必要な機能を任意のOS上に実装しながらコスト削減が可能になります。

QNXオペレーションシステムについては1.4.節で記載します。

https://www.macnica.co.jp/business/maas/products/134542/

1.4. QNX OS

QNX OSには下記のような利点があり、Ubuntuと比較しても製品の規格やセキュリティに対して堅牢な機能を発揮します。

・マイクロカーネルアーキテクチャ
・POSIX完全準拠(PSE54)
・堅牢なセキュリティ機能
・機能安全規格に対応(ISO26262、IEC61508)

マイクロカーネルとモノリシックカーネルのサマリはまとめると下記になります。

特徴 マイクロカーネル モノリシックカーネル
構造 小型でモジュール化 大型で一体化
安定性 バグの影響が限定的 バグがシステム全体に影響を与える可能性
保守性 モジュール単位で保守可能 カーネル全体の保守が必要
セキュリティ 分離性が高い 分離性が低い
適用分野 組み込み/セキュリティ重視のシステム 高性能なデスクトップ
代表的なOS MINIX, QNX, GNU Hurd Linux, Windows, Unix, macOS

機能安全規格のASILとSILリスク分類は下記を参照。

https://www.macnica.co.jp/business/maas/columns/143531/

QNX は用途に応じて機能安全性や医療規格準拠などが強化されたOSのバリエーションが下記のように用意されています。

製品名 主な特徴 主な用途
QNX Neutrino RTOS 高信頼性のRTOS、スケーラブル設計 自動車、産業機器
QNX OS for Safety ISO 26262 ASIL D 認証取得、安全性重視 車載システム、ADAS
QNX Hypervisor 仮想化により複数OSを安全に分離・統合 自動車・産業用統合システム
QNX OS for Medical IEC 62304 準拠、医療規格対応 医療機器

BlackBerry VAI パートナープログラムにバリュエーションの例が記載されています。

QNXの安全認証などについては QNX 安全認証、コンプライアンス、適合性に記載されています。

また、製品開発向けに、QNX Neutrino RTOSをベースに開発が可能な「QNX SDP 8.0」などが提供されています。

今回使用するのも、Raspberry pi用に開発された「QNX SDP 8.0 Quick Start Target Image for Raspberry Pi 4」を使用することになります。


付録として

ISO26262 とは自動車に搭載するE/Eシステム(電気/電子システム)についての機能安全規格

https://www.synopsys.com/ja-jp/automotive/what-is-iso-26262.html

IEC62304 とは医療機器ソフトウェアの安全性と信頼性の向上を目的とした国際規格

https://www.vector.com/jp/ja/know-how/vj-columns/medical/vj-columns230201/#

1.5. QNX Reference

その他、QNX + Robotics関連のReferenceを記載しておきます。

https://blackberry.qnx.com/en/industries/robotics

https://monoist.itmedia.co.jp/mn/articles/2406/06/news078.html

https://monoist.itmedia.co.jp/mn/articles/2209/01/news062.html

2. Install QNX 8.0

ここからは実際にQNX SDP 8.0を入手して利用できるようにします。

https://www.qnx.com/products/everywhere/

に記載のあるように、下記3ステップでライセンス承認からQNX SW Centerから入手していきます。

2.1. Check the License terms

PDFを確認し、チェックボックスをクリックします。

2.2. Accept License from myQNX account

myQNX ライセンスマネージャーを開き、「Accept License」をクリックし

※ Foundry27 Community Portalなど、過去にリクエストしている場合は、再度リクエストを送信し、受信メールを待ちます。

「Click to deploy to user/s」から登録済みメールアドレスを入力し「Deploy」します。

2.3. Download QNX Software Center

QNX Software Centerへアクセスし、Download Optionsが「Download Now」となっていることを確認し、ビルド環境に応じてLinux HostsまたはWindows Hostsを選択しインストーラーを入手/実行してください。

・qnx-setup-2.0.3-xxxxxxxxxxxx-win.exe
・qnx-setup-2.0.3-xxxxxxxxxxxx-linux.run

Windows環境で入手した場合は.exeを実行し、QNX Software Centerのアプリを起動させます。

Linuxの場合は下記でインストールします。

terminal
sudo chmod +x qnx-setup-2.0.3-2024xxxxxxxx-linux.run
./qnx-setup-2.0.3-2024xxxxxxxx-linux.run
# ライセンスについて表示されるので、確認後qをクリック
Please type y to accept, n otherwise: y

2.4. Install QNX SDP 8.0 and Image file for RPi4

https://gitlab.com/qnx/quick-start-images/raspberry-pi-qnx-8.0-quick-start-image/-/wikis/Getting-Started

に従って操作を進めます。

はじめに、WindowsまたはLinuxに「QNX SDP 8.0」のインストールをします。

QNX Software Centerを起動後、下記のように画面を進めpackage ID 「com.qnx.qnx800」のQNX SDP 8.0を選択してください。

Ubuntuの場合は下記で確認ができます。

terminal
cd qnx800/ && ls
> host  qnxsdp-env.bat  qnxsdp-env.sh  target

source qnxsdp-env.sh
QNX_HOST=/home/ubuntu/qnx800/host/linux/x86_64
QNX_TARGET=/home/ubuntu/qnx800/target/qnx
MAKEFLAGS=-I/home/ubuntu/qnx800/target/qnx/usr/include


続いて、QNX Software Centerのトップメニューから「Install New Packages」を選択。
「All」からquickと検索窓に打ち込み、「QNX SDP 8.0 Quick Start Target Image for Raspberry Pi 4」を入手します。

2.5 Bulid QNX SDP 8.0 Binary for RPi4

別の方法として、ソースパッケージのビルドからバイナリ入手する方法も記載します。
「All」からrpiと検索窓に打ち込み、「QNX SDP 8.0 BSP for Raspberry Pi」を入手します。

入手したラズパイ用QNX環境を「QNX Momentics IDE」を用いてビルドしていきます。

まずは下記よりIDEをインストールします。

「QNX Momentics IDE」を起動後、「Import Projects」 > 「QNX Source Package and BSP」を選択し

「Browser for ZIP Archive」から1.4節でインストールしたZIPファイルを選択します。

なお、このZIPファイルなどは下記へ格納されています。

C:\Users\username\qnx800\images. # Windows
~/qnx800/images. # Linux

インストールしたZIPのimagesにバイナリファイルがビルドされていない場合はIDEを使用してビルドしてください。

プロジェクト名を右クリック>「Build Project」を選択しビルドを行います。

imagesフォルダに「ifs-rpi4.bin」が成果物として生成されていることを確認出来たら完了です。

2.6 Format Image file

2.4節でImageファイルを入手した場合は「qnx_sdp8.0_rpi4_quickstart_YYYY/MM/DD.img」
2.5節でBinaryファイルを入手した場合は「ifs-rpi4.bin」

を「Raspberry pi imager」用いてSDカードに書き込みます。

OS customisationはNo/いいえを選択します。

書き込み終了後、Volumeを確認しHOSTNAMEとネットワークの設定を行います。

qnx_config.txt
HOSTNAME=qnxpi
USE_DEMO_SENSOR=true
wpa_supplicant.conf
network={
    ssid="YOUR_NETWORK_SSID"
    key_mgmt=WPA-PSK
    psk="YOUR_PASSWORD"
}

2.7 Boot and Login

下記のどれかを実行し、ログインします。
初回ログインはifconfigでIPアドレスが不明のため.local経由でのアクセスになります。

On Linux
ssh qnxuser@qnxpi.local
ssh -m hmac-sha2-512 qnxuser@192.168.40.156
ssh -m hmac-sha2-512 qnxuser@qnxpi.local

Windowsの場合はコマンドプロンプトからアクセス可能です。

On Windows cmd
ssh -m hmac-sha2-256 qnxuser@qnxpi.local
(qnxuser@qnxpi.local) Password:qnxuser

3. QNX Turtorial

QNXはマイクロカーネルですが、Python3やVimなど最低限の機能はプレインストールされているので、これらをまずは確認していきます。

3.1. Controlling I/O with Python

https://gitlab.com/elahav/qnx-rpi-book/-/blob/master/python.md?ref_type=heads

こちらを参考にPythonのI/Oを確認していきます。

python3のバージョン確認

terminal
qnxuser@qnxpi:~$ python -V
Python 3.11.7

pythonファイルの作成と編集

terminal
touch myprogram.py
vim myprogram.py
myprogram.py
import rpi_gpio as GPIO
import time

GPIO.setup(16, GPIO.OUT)
GPIO.output(16, GPIO.LOW)

while True:
    GPIO.output(16, GPIO.HIGH)
    time.sleep(.5)
    GPIO.output(16, GPIO.LOW)
    time.sleep(.5)

基本はvimでの編集になるので、「i」でインサートモード変更しプログラム記述
Esc後に:wqで上書き保存してpythonファイルを準備して実行する

Lチカできていれば、他のPythonサンプルも基本できるはず。

3.2 Real-Time Programming in C

https://gitlab.com/elahav/qnx-rpi-book/-/blob/master/realtime.md?ref_type=heads

QNX Momentics IDEを使用する場合は

「Create a new project targeting QNX > QNX Executable」

としてプロジェクトを作成します。

ここでは、下記通りに行いたいため、VS Code プラグイン「QNX Toolkit」を用いて進めていきます。 プラグインは事前にDLしてください。

https://www.youtube.com/watch?v=M02X6AqdK7M&t=415s

3.2.1. Hello QNX.

VS Codeプラグイン 「QNX Toolkit」を使用する場合は

「Projects/Create new Project > QNX Recursive Makefile > c > Excecutable」と進めます。 Project nameはhello_worldとします

続いて、「フォルダを右クリック > QNX > Build Active Project」を選択してビルドします。

左のQNXアイコンをクリックし、「Add new QNX Target Connection > Enter IP or hostname
でQNX Target」と接続します。

接続が完了すると、PROPERTIESからQNXターゲットのアーキテクチャ種別を確認することができます(aarch64le)。

この状態で「フォルダを右クリック > QNX > Run as QNX Application」を実行し、QNX Targetであるラズパイ側で動作を確認します。

terminal
ssh qnxuser@192.168.40.156
Password:qnxuser
su
Password:root
/tmp/hello_world

3.2.2. Thread Scheduling

スケジューリングとQNXの優先度のデモも要点のみ記載していきます。

スケジューリング 説明
FIFO (First-In, First-Out) 最初に準備できたタスクから実行。タスクが自発的にCPUを解放しない限り他スレッドが実行できない可能性あり。
Round-Robin 各スレッドに固定の実行時間(タイムスライス)を与え、交代で実行。長時間の待ち時間を軽減するが限界あり。
優先度 説明
Priority 0 アイドルスレッド専用。プロセッサがすることがない場合に実行。
Priority 255 プロセッサ間割り込み (IPI) スレッドに予約。タスク分散等で使用。
Priority 254 デフォルトでクロック割り込みハンドラ用。オプションで優先度を下げることが可能。
優先度設計のベストプラクティス 説明
非特権範囲 (1~63) 一般的なスレッドが使用する優先度。
特権範囲 (64~254) 信頼されたプログラムのみ使用可能。
ウォッチドッグ 高優先度スレッドの暴走を検出し、システムの安定性を保つために推奨される。

実際に動作させると、優先度63に設定したタスク「Slept for xxxxxxxxus」が先に実行され、workerスレッドは割り込まれた後似実行されていることが分かります。

terminal
root@qnxpi:/data/home/qnxuser# /tmp/thread_scheduling 
Slept for 1000091us
Slept for 1001002us
Slept for 1000998us
Slept for 1000999us
Slept for 1001001us
pi=3.141593
pi=3.141593
pi=3.141593
pi=3.141593
pi=3.141593
pi=3.141593
pi=3.141593
pi=3.141593
pi=3.141593
pi=3.141593

ここまでできれば、残りの「Real-Time Programming in C」も進められるはずです。

Appendix

ISO 26262

ASIL Dを満足し得るISO 26262対応のプラットフォーム であるQNXだが、そもそもISO 26262とは何なのか?が上述では説明不十分のため、こちらでも補足します。

ISO 26262は、自動車の電気・電子(E/E)システムにおける機能安全(Functional Safety)を確保するための国際規格です。自動車の安全関連システムが故障によるリスクを許容範囲内に抑えることを目的としています。

機能安全を確保するための安全要求: Safety Requirementsは大きく5つに分かれます。

  • 車両視点の安全目標(SG:Saftey Goal)
  • システム視点の機能レベル安全要求(FSR:Functional Safety Requirement)
  • アイテム視点の技術レベル安全要求(TSR:Technical Safety Requirement)
  • ハードウェアアーキテクチャに対する安全要求(HSR)
  • ソフトウェアアーキテクチャ(SSR)

ISO 26262に準拠した開発ではV字プロセス(Vモデル)が推奨され、ハードウェア・ソフトウェアレベルで安全機構(Safety Mechanism)を設計することも求められます。
e.g. フェールセーフやフォールト検出、WDT(ウォッチドッグタイマ)など


以上、QNXの導入からPython/C開発環境の構築でした。

普段はUbuntuばかり使っていて、個人でRTOSや低レイヤーを触ることは少ないため、低レイヤーを学ぶにはとても良い環境だなと思いました。

別途ROS 2 on QNXなどを着手、まとめていきたいと思います。

Likeいただけると大変励みになりますので、よろしくお願いいたします。

Discussion

ログインするとコメントできます