2025年7月20日日曜日

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

前回からの続きです。

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


「nRF Connect for VS Code」のインストール

前回までにNordic社の無線マイコンで「Zephyr」の開発を行うのに必要な3つのアプリケーションをインストールしました。

最後の「Visual Studio Code」もインストールし、日本語化のための拡張機能の導入まで終わりました。

しかし「Zephyr」の開発を行うには、更に「Visual Studio Code」に拡張機能をインストールする必要があります。

…というか、ここからが開発環境構築の本丸だったりします。

インストールした「Visual Studio Code」を立ち上げましょう。

そして、日本語化の拡張機能をインストールした時と同じように、画面左端のアイコンが並んでいるところ、その中の「拡張機能」アイコンをクリックします。

「Visual Studio Code」 - 1


左端に拡張機能のリストが表示されます。

一番上のテキストボックスに「nRF」と入力してください。

フィルターされた候補が色々出てきますが、その中で「nRF Connect for VS Code Extension Pack」という拡張機能を探してクリックします。

画面右に詳細な情報が出てきましたね?

ここから「インストール」ボタンをクリックしましょう。

「Visual Studio Code」 - 2


インストール自体は待たされることもなく意外とアッサリ終わります。

「インストール」ボタンから「無効にする」とか「アンインストール」という文言のボタンに変化したらインストール完了の目安です。

「Visual Studio Code」 - 3


ここでもう一度、画面左端の「拡張機能」アイコンをクリックします。

現在インストールされている拡張機能のリストが表示されます。

すると、前回インストールした日本語化拡張機能「Japanese Language Pack for Visual Studio Code」、それと今インストールした「nRF Connect for VS Code Extension Pack」以外にも何やら沢山の拡張機能がインストールされていることが分かります。

「Visual Studio Code」 - 4


これら意図しない拡張機能は、依存関係で自動的にインストールされたものです。

nRF Connect for VS Code Extension Pack」をインストールしましたが、これ単体では意味を成しません。

これを動かすために必要な拡張機能が他にもあり、それらと一緒に使用しないと機能しない…これを「依存」などと呼びます。

他の拡張機能に依存する拡張機能は、そのインストール時に「Visual Studio Code」が自動的にインストールしてくれます。

今回の場合は「nRF Connect for VS Code Extension Pack」が依存している拡張機能が芋づる式に自動インストールされたため、身に覚えがない拡張機能がリストされているという訳です。

ご安心を。


さて、気が付くと画面左端のアイコン表示欄に見覚えのないアイコンが2つも追加されています。

これらも拡張機能のインストールの結果です。

今回は、上の四角い方のヤツをクリックします。

(サクマドロップスにこんな模様なかったっけ…?)

「Visual Studio Code」 - 5


画面左に「WELCOM」というタブが表示され、その中に「Install Toolchain」というボタンがあります。

これをクリックしてツールチェーンをインストールしましょう。

「Visual Studio Code」 - 6


すると、画面上方のリストビューにインストールできるツールチェーンのバージョン一覧が表示されます。

特に事情がない限りは最新のものを選んで良いでしょう。

お目当てのバージョンをクリック…なのですが、覚悟が必要です。

ツールチェーンのインストールには、かなりの時間がかかります。

お時間があるときにクリックしましょう。

…というわけで、クリック!

「Visual Studio Code」 - 7


インストールが開始され、経過表示が画面右下に表示されるのですが…。

進むのが遅いです。

じっと待ちましょう!

(シャワー浴びられちゃうくらいの時間。)

「Visual Studio Code」 - 8


インストールが完了すると画面右下に「Successfully installed toolchain vx.x.x.」などと表示されます。

これを確認したら、次は「SDK」のインストールです。

ツールチェーンの中にSDKは含まれてないんかいっ!!

…含まれてないらしいです。

というわけで、今度は「WELCOM」というタブの中から「Manage SDKs」という表示をクリックしましょう。

「Visual Studio Code」 - 9


画面上方のリストビュー に「Install SDK」という項目が出てきますので、これをクリック!

「Visual Studio Code」 - 10


すると、ツールチェーンの時と同様、画面上方のリストビューにインストールできるSDKのバージョン一覧が表示されます。

ここはツールチェーンのバージョンと同じものを選んだ方がトラブルは少ないでしょう。

お目当てのバージョンをクリックしてください。

「Visual Studio Code」 - 11


画面上方のリストビューSDKをインストールするパスが表示されます。

特に事情がなければ表示されているパスで問題ないと思いますので、ここでは「Enter」キーをヒット!

「Visual Studio Code」 - 12


インストールが開始され、再び経過表示が画面右下に表示されます。

これまた進むのが遅いです。

ここもじっと待機です!

(アニメ1話くらいは観れちゃう程度の時間。)

「Visual Studio Code」 - 13


インストールが完了すると画面右下に「Successfully installed nRF Connect SDK vx.x.x.」などと表示されます。

これでSDKのインストールも完了です!

「Visual Studio Code」 - 14


これで少なくともZephyrのプロジェクトを作成してビルドする環境は整いました。

次回は、この「Visual Studio Code」で空のZephyrプロジェクトを作成し、それをコンパイルしてターゲットに書き込んで動作させてみましょう。

開発環境の動作確認です。


<続く>

2025年7月13日日曜日

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

前回からの続きです。

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


「Visual Studio Code」のインストール

超有名なエディタ「Visual Studio Code」。

Nordic社の無線マイコンを「Zephyr」を使って開発する上で、半ば標準の開発環境となっています。

このあたり、他のマイコンメーカーが「Eclipse」ベースの開発環境に留まっていることを考えると、先進的ですよね。

(あ、私は「Eclipse」大好きです。)

まずは、インストーラーのダウンロードです。

以下のページにアクセスします。

最近ではクラウド版もあるみたいですが、今回はパソコンにアプリとしてインストールしましょう。

VS Codeをダウンロードする」というバナーをクリックします。


https://azure.microsoft.com/ja-jp/products/visual-studio-code

「Visual Studio Code」ダウンロードページ - 1


以下のようなページに切り替わります。

ここで「Winodws」のバナーをクリックします。

「Visual Studio Code」ダウンロードページ - 2


VSCodeUserSetup-x64-x.xxx.x.exe」というファイルがダウンロードされます。

これをダブルクリックしてインストーラーを起動しましょう。

インストーラーが起動すると、まずはライセンスの確認と承諾です。

ラジオボタンを「同意する」に選択してから「次へ」ボタンをクリックしてください。

「Visual Studio Code」インストーラー - 1


ここから先は、特に事情がない限りは赤い○で示した所をクリックしていくだけで作業は進みます。

「Visual Studio Code」インストーラー - 2


「Visual Studio Code」インストーラー - 3


「Visual Studio Code」インストーラー - 4


「Visual Studio Code」インストーラー - 5


「Visual Studio Code」のインストールが始まります。

「Visual Studio Code」インストーラー - 6


以下の表示が現れるとインストールも完了です。

完了」ボタンをクリックしてインストーラーを終了させましょう。

「Visual Studio Code」インストーラー - 7


インストーラーを閉じる自動的に「Visual Studio Code」が起動します。

ただし、UIが全部英語ですね!

ここでは、これを日本語化する作業もやっちゃいましょう!

他の言語も概ね同じ操作で出来るはずです。

画面左端のアイコンが並んでいるところ、その中の「拡張機能」アイコンをクリックします。

(なんか、積み荷の一個が崩れそうなマークのやつ。)

「Visual Studio Code」 - 1


Japanese Language Pack for Visual Studio Code」という拡張機能をインストールします。

拡張機能は星の数ほどあります。

その中からお目当ての拡張機能を探すには、左上のテキストボックスに拡張機能の名前の文字を入力しフィルター検索します。

今回の場合は「Japan...」などと入力しましょう。

すると「Japanese Language Pack for Visual Studio Code」が候補としてリストされるはずです。

この項目の「Install」ボタンをクリックします。

「Visual Studio Code」 - 2


画面の右下に以下のようなポップアップが出れば「Japanese Language Pack for Visual Studio Code」のインストールは終了です。

このポップアップは「言語拡張機能を有効にするためにVisual Studio Codeを再起動しますか?」と聞いています。

全然オッケーなので「Change Language and Restart」ボタンをクリックしましょう。

「Visual Studio Code」が再起動します。

「Visual Studio Code」 - 3


再起動後にUIを見ると、ちゃんと日本語になっているのが確認できます。

以上で「Visual Studio Code」のインストールは完了です!

「Visual Studio Code」 - 4


これで「Zephyr」を使って開発を始めるために必要な3つのアプリケーションのインストールが終わりました。

これで「Zephyr」をイジれる!…とは行かず…。

この後、インストールしたばかりの「Visual Studio Code」に更なる拡張機能を追加する必要があるのです!


<続く>

2025年7月5日土曜日

TOPPERS/ASP - Arduino UNO R4版 目次

みんな大好き「Arduino」。

豊富なライブラリが用意されていて簡単に安価に入手でき、気軽に電子工作に使えることが魅力です。

そんな「Arduino UNO R4」を「E2 emulator Lite」デバッガでデバッグができて、ちょっと本格的なRenesas RAマイコンの評価ボードとして利用しちゃおう!という目的でTOPPERS/ASPをポーティングしてみました。

後片付け


もし、Arduinoの豊富なライブラリを使用したい!

または、使い慣れた「Arduino IDE」で開発をしたい!

ということであれば、TOPPERS/ASPをマルっとArduinoのライブラリに閉じ込めた「TOPPERS/ASP Arduino UNO R4 ライブラリ(TA2LIB)」という実装が公式から発表されています。

以下のGitHubを参照してください。


https://github.com/toppers/Arduino_TOPPERS_ASP-renesas_uno


以下、本ブログのTOPPERS/ASP Arduino UNO R4版に関する記事の目次です。


■TOPPERS/ASP - Arduino UNO R4版 その1

     TOPPERS/ASP - Arduino UNO R4版 概要

     TOPPERS/ASP - Arduino UNO R4版の注意事項

        必要なもの

        ダウンロード/GitHub


■TOPPERS/ASP - Arduino UNO R4版 その2

開発環境の構築


■TOPPERS/ASP - Arduino UNO R4版 その3

Flexible Software Package (FSP)とは?

雛形プロジェクトの作成

マイコンのピンの設定

クロックの設定

ソースコードの出力


■TOPPERS/ASP - Arduino UNO R4版 その4

Cygwinターミナルでのビルド


■TOPPERS/ASP - Arduino UNO R4版 その5

デバッガ⇔ターゲット・ケーブルの作成


■TOPPERS/ASP - Arduino UNO R4版 その6

プロジェクトの作成


■TOPPERS/ASP - Arduino UNO R4版 その7

プログラムの転送とデバッグ


■TOPPERS/ASP - Arduino UNO R4版 その8

「e2 Studio」で普通にFSPを使う


■TOPPERS/ASP - Arduino UNO R4版 その9

TOPPERS/ASPとFSPを組み合わせて使う~その1


■TOPPERS/ASP - Arduino UNO R4版 その10

TOPPERS/ASPとFSPを組み合わせて使う~その2


■TOPPERS/ASP - Arduino UNO R4版 その11

RTOSを使用した利点とは?

まとめ

ライセンスについて

2025年6月29日日曜日

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

前回からの続きです。


Zephyrの開発環境

Nordic社の無線マイコンをRTOS「Zephyr」を使って開発を始めるには、以下のソフトウェアのインストールが必要です。


〇nRF Command Line Tools

〇nRF Connect for Desktop

〇Visual Studio Code


これらは全て無償で使用できますので安心ですね!

ただし、3つもインストーラーを起動しなければならないので複雑でチョット面倒…。

自分自身への備忘録としての意味合いが強いですが、以降、各々のインストール方法を書いていきます。


「nRF Command Line Tools」のインストール

nRF Command Line Tools」は、プログラムの開発やデバッグに使用される、その名の通りコマンドラインで使用されるアプリケーションです。

具体的には、ビルドの結果出力されたHEXファイルの編集などの機能を持っているようです。

まずは、インストーラーのダウンロードです。

以下のページにアクセスします。

このページを少し下にスクロールして行くと…


https://www.nordicsemi.com/Products/Development-tools/nRF-Command-Line-Tools/Download

「nRF Command Line Tools」ダウンロードページ - 1


インストーラーへのリンクの表示があります。

ここで「nRF-Command-Line-Tools-xx.xx.x-x64.exe」の表示をクリックします。

「nRF Command Line Tools」ダウンロードページ - 2


nrf-command-line-tools-xx.xx.x-x64.exe」というファイルがダウンロードされます。

これをダブルクリックしてインストーラーを起動しましょう。

インストーラーが起動すると、まずはライセンスの確認と承諾です。

I agree to the license terms and conditions」のチェックボックスをチェックしてから「Install」ボタンをクリックしてください。

「nRF Command Line Tools」インストーラー - 1


以下のダイアログが表示されますので右下「Next」ボタンをクリックしましょう。

「nRF Command Line Tools」インストーラー - 2


またまたライセンスの確認と承諾!?

I accept the license terms in the Liceense Agreement」のチェックボックスをチェックしてから「Next」ボタンをクリックです。

「nRF Command Line Tools」インストーラー - 3


ここからしばらくは、特に事情がない限りは赤い○をクリックしていくだけで作業は進みます。

「nRF Command Line Tools」インストーラー - 4


「nRF Command Line Tools」インストーラー - 5


「nRF Command Line Tools」インストーラー - 6


「nRF Command Line Tools」インストーラー - 7


これで「nRF Command Line Tools」のインストールいっちょ上がりです。


「nRF Connect for Desktop」のインストール

nRF Connect for Desktop」は、プログラムの開発やデバッグに使用される、様々なユーティリティやテストプログラムのフレームとかなんとか…?

でも、一番重要なのは評価ボードに内蔵されているデバッガである「J-Link」のドライバーもこれに含まれていることです!

まずは、インストーラーのダウンロードです。

以下のページにアクセスします。

このページを少し下にスクロールして行くと…


https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-Desktop

「nRF Connect for Desktop」ダウンロードページ - 1


Downloads」というバナーがありますので、これをクリック。

「nRF Connect for Desktop」ダウンロードページ - 2


すると、インストーラーへのリンクの表示まで飛ばされます。

ここで「nrfconnect-setup-x.x.x-x64.exe」の表示をクリックします。

「nRF Connect for Desktop」ダウンロードページ - 3


nrfconnect-setup-x.x.x-x64.exe」というファイルがダウンロードされます。

これをダブルクリックしてインストーラーを起動しましょう。

なにやら始まった…。

「nRF Connect for Desktop」インストーラー - 1


まもなく「J-Link」のインストールが始まります。

ここからしばらくは、特に事情がない限りは赤い○をクリックしていくだけで作業は進みます。

「nRF Connect for Desktop」インストーラー - 2


「nRF Connect for Desktop」インストーラー - 3


「nRF Connect for Desktop」インストーラー - 4


「nRF Connect for Desktop」インストーラー - 5


「J-Link」のインストールが始まります。

「nRF Connect for Desktop」インストーラー - 6


以下の表示が現れると「J-Link」、それと同時に「nRF Connect for Desktop」のインストールも完了です。

Finish」ボタンをクリックしてインストーラーを終了させましょう。

「nRF Connect for Desktop」インストーラー - 7


このとき、パソコンの画面上に見知らぬ表示が現れていると思います。

こいつが「nRF Connect for Desktop」というヤツでして、必要に応じて開発で使用する様々なアプリケーションやツールを追加インストールするためのランチャーとなっています。

今は、必要がないので消してしまっても大丈夫です。

「nRF Connect for Desktop」


必要になった時は、デスクトップ上にアイコンが作られていますので、ここから起動できます。

「nRF Connect for Desktop」アイコン


今回は「nRF Command Line Tools」と「nRF Connect for Desktop」のインストールを行いました。

Zephyrのための開発環境も残るは「Visual Studio Code」のインストールのみ。

結構簡単じゃね?って思わせてか~ら~の!

これから先が面倒だったりします。


<続く>

2025年6月23日月曜日

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

Zephyrの習得が避けられなかった経緯

私は組み込みソフトウェア・エンジニアとして長年μiTRON準拠のRTOSを使用してきました。

どんなに時代が進もうが、余程大きな案件でなければμiTRON、コレさえマスターしておけば大概の案件に対処できる…と思っていたのですが。


…甘かった!!


そのきっかけがコイツです!

Nordicという会社の「nRF5340」というマイコンです。

「nRF7002 Development Kit」 - 1


Nordic社は、BluetoothやZigbeeなどの2.4GHz帯の無線技術にめっぽう強い半導体メーカーです。

この「nRF5340」も、Bluetoothをはじめ様々な無線ペリフェラルを備えたSoCです。

今後、コイツを仕事で使用する可能性が出てきました。

マイコンとしてのコアはただのARMですから、この上で走るソフトウェアも、いつも通りμiTRON準拠のTOPPERS/ASPでも載せてサクッと作れるっしょ?ってタカを括っていたのですが…コレが大間違い!

何が問題か?

それは、肝心のBluetoothなどの無線周辺機器を動作させるドライバやプロトコルスタックが「Zephyr」というRTOS上での動作を前提としてNordic社から提供されていることです!

昔は、シリアルやSPIなど、組み込みソフトウェアといえばマイコンのデータシートとにらめっこして一からドライバなどをフルスクラッチで作成していました。

今では、こういった開発は工数と信頼性の面で避けられ、マイコンのメーカーからミドルウェアのサンプルが提供され、これを自分のターゲットに移植する…という方法がメジャーです。

このようなサンプルは大概の場合はベアメタル、すなわち特定のRTOSの上で動くものではなく、プレーンな状態で提供される傾向がありました。

しかし最近ではペリフェラルが複雑化しており、ベアメタルでは実装が煩雑になる(つまり読みにくいし、使いにくい)場合が増えてきており、ベアメタルで動作するサンプルに加え、何らかのRTOSの上で動作するサンプルも同時に提供される例も見られるようになりました。

イーサネットやUSBが出てきた辺りで、RTOSを使わないとベアメタルでの実装はキツくなった印象ですね。

しかし、Nordicの例のようにベアメタル向けのものが無く、特定のRTOSでのみ動作するサンプルしか提供されていないという例は私の知る限り初めてでした。

(古いドライバやプロトコルスタックでは提供されていたようですが、今更それらは使いたくありませんよね?)

つまり「Zephyr」というRTOSを使用しないと「nRF5340」に搭載している無線周辺機器が全く使えないということです!


さあ困った…。


ことここに至り「nRF5340」を存分に使用するには「Zephyr」を学ばなければならない状況となってしまいました。

これが、リスキリングってやつかぁ?


Zephyr何するものぞ?

噂の「Zephyr」ですが、一体何者?

私の拙い説明を読んでいただくより、こちらをご覧いただいた方が確実でしょう。

つまり、Linux Foundationが中心に開発を行っているオープンソースのRTOSです。

Zephyrロゴ


Apache License 2.0ライセンスのもと、無料で使用できます。

「nRF5340」の採用するARM Cortex-M33コアだけではなく、RISC-Vや他のアーキテクチャのマイコンもサポートされています。

また、OSのカーネルだけではなく、通信関係のドライバやセキュリティ関連のミドルウェアまで提供されます。

Linux Foundationが主管であるだけに、Linuxと同様コミュニティーによるバザール式の開発スタイルが採られ、世界中のエンジニアが開発を活発に継続しているとのこと。

ZephyrはLinux Foundationが主管しているから誤解されがちですが、ZephyrとLinuxは全くの別物です。

ベテランの方は「μCiinux」などを思い浮かべ、ZephyrをMMU抜きのLinuxミニマム版と解釈してしまいそうですが、設計がまるで異なる実装となっています。

しかしながら、CUIのコンフィギュレーションメニューやデバイスツリーでのハードウェア設定など、Linuxの文化は取り入れられています。

ですので、組み込みLinuxの開発経験者にとっては他のRTOSよりも取っつき易いでしょう。

一方で、私のようなμiTRONしか使ってこなかったプログラマーが、すぐにコイツを使いこなすことができるものでしょうか?


今回のミッション

初めてのRTOSを使うときは、普段使っているRTOSとの動作の差分を見ることが最も近道だと思っています。

どんなRTOSでもタスク(スレッド)、セマフォ、イベントフラグ…など大体同じような機能を持っていて、それらの作成・設定方法や「細かな動き」が異なります。

問題となるのは、その「細かな動き」の違いです。

新しいRTOSの上で走るアプリケーションを組む時には、ついつい今まで使い慣れたRTOSをベースに設計してしまいがちです。

そうすると予想外の問題にぶち当たることが良くあります。

同じ設計で使い慣れたRTOSでは動いたのだから、新しいRTOSでも同様だろう…と思い込んでしまうのは仕方のないことですが、これが落とし穴だったりします。

私たちは、大きな違いにはよく気付くし注意を払うけど、微妙で小さな違い…ましてやOSの中身の動作の違いなどにはなかなか気が付かないものです。

具体的な例として、タスクやスレッドの起動/休止タイミングや優先度とタスクスケジューリングの違いなどです。

大雑把に見れば両OSともに違いはないが細部での動作が異なることが引き金となり、深刻な不具合に繋がるかもしれません。

しかも、そういったものに限って原因の特定は難しい場合が多いのです。

したがって、予めそれぞれの違いを可能な限り把握しておくことが重要だと考えました。

ところで、μiTRON準拠の実装であるTOPPERS/ASPには、RTOSの動きを理解する上で非常に有用なサンプルプログラムが用意されています。

このサンプルプログラムはターゲットとパソコンをシリアル通信で接続し、パソコン上のターミナルからコマンドを送ることによって、μiTRONの主要なシステムコールを実際に動かしてみるといった内容となっています。

こんな感じです。

μiTRONのタスクの切り替えや、その反応のタイミングなどが視覚的に確認でき、非常に理解しやすい「名プログラム」だと思います。

こちらの過去記事に内容を書かせていただいていますので、興味のある方は是非。

今回は、このサンプルプログラムを可能な限り忠実にZephyrに移植し、動作を比較することでμiTRONとの「細かな動き」の違いを見つけていきたいと思います。


必要なもの

今回のターゲットとなるのはNordic社製の評価ボード「nRF7002 Development Kit」です。

「nRF7002 Development Kit」 - 2


搭載されているマイコンこそ「nRF5340」ですが、これは「nRF7002」というWi-Fiのコントローラを「nRF5340」マイコンと組み合わせて使うための評価ボードです。

デバッガはオンボードでかの有名な「J-Link」が載っていますので、別個に用意する必要はありません。

これ一枚で遊べますよ。

こちらでは9,000円行かない程度?

またコレじゃなくとも、同じNordicのボードなら大体同じ手順で動かすことができると思います。


ダウンロード/GitHub

TOPPERS/ASPのサンプルプログラムをZephyrに移植したソースコードの入手は、こちらからどうぞ。

(リンクは「Z」だから下の方です。)


今回は、説明ばかりの退屈な更新となってしまいました…。

次回から開発環境の構築を説明します。


<続く>

2025年5月26日月曜日

TOPPERS/ASP - Arduino UNO R4版 その11

前回からの続きです。

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


RTOSを使用した利点とは?

前回までに「Arduino UNO R4」で、ターミナル・ソフトウェアで入力した文字をシリアル通信でそのまま返すという簡単なプログラムを作成してきました。

そして、同じようなプログラムをTOPPERS/ASPを使用しない場合(「ベアメタル版」と呼んでいます)と使用した場合(「RTOS版」とでもしましょう)の2種類を紹介させていただきました。

これらは何が違っていて、TOPPERS/ASPなどのRTOSを使った場合はどのような点で優れているのか?

苦労してRTOSを載っけても、メリットがなければ意味がありませんからね…。

早速比較してみましょう。

Renesas RA4M1


メインプログラムを比較します。

まずは、TOPPERS/ASPを使用しない場合…ベアメタル版のメインプログラムです。

この記事で作成した「Hinagata」プロジェクトの「hal_entry.c」ファイルの「hal_entry()」関数です。

以下のような内容でした。

  1. ...
  2. void hal_entry(void)
  3. {
  4.     uint8_t c;
  5.     // シリアル通信を開く
  6.     R_SCI_UART_Open(&g_uart2_ctrl, &g_uart2_cfg);
  7.     while (1) {
  8.         // 受信する
  9.         R_SCI_UART_Read(&g_uart2_ctrl, &c, 1);
  10.         // 受信するまで待つ
  11.         while (!recieved);
  12.         // 受信完了フラグをリセットする
  13.         recieved = false;
  14.         // 受信した一文字を送信する
  15.         R_SCI_UART_Write(&g_uart2_ctrl, &c, 1);
  16.     }
  17. }
  18. ...


ここで上のリストで言うところの11から14行目に注目しておいてください。


次は、TOPPERS/ASPを使用した場合…つまりRTOS版のメインプログラムです。

この記事前回の記事で作った「asp_arduino_uno_r4_gcc-template」プロジェクトの「OBJ_template」直下「main.c」ファイルの「main_task()」関数です。

  1. ...
  2. void main_task(intptr_t exinf)
  3. {
  4.     uint8_t c;
  5.     // 割り込み番号とイベント番号の紐付け
  6.     bsp_irq_cfg();
  7.     // 各割り込みを有効化
  8.     ena_int(INTNO_UART2_RXI);
  9.     ena_int(INTNO_UART2_TXI);
  10.     ena_int(INTNO_UART2_TEI);
  11.     ena_int(INTNO_UART2_ERI);
  12.     // シリアル通信を開く
  13.     R_SCI_UART_Open(&g_uart2_ctrl, &g_uart2_cfg);
  14.     while (1) {
  15.         // 受信する
  16.         R_SCI_UART_Read(&g_uart2_ctrl, &c, 1);
  17.         // タスクを待ち状態にする
  18.         slp_tsk();
  19.         // 受信した一文字を送信する
  20.         R_SCI_UART_Write(&g_uart2_ctrl, &c, 1);
  21.     }
  22. }
  23. ...


「bsp_irq_cfg()」とか「ena_int()」などの関数コール以外は、一見ベアメタル版と変わらないように見えます。

しかし、ここで上のリストで言うところの20から21行目に注目してください。

ベアメタル版では「received」グローバル変数がtrueになるまで空ループしていて、それがtrueになったら次の受信に備えて「received」グローバル変数を自らfalseにリセットしています。

一方、RTOS版では、これら一連の処理が「slp_tsk()」というシステムコールに置き換えられていますね?


…一体、これらに何の違いがあるのか?


ベアメタル版の場合「received」グローバル変数をtrueにする…つまり「received = true;」を実行しているのは「Hinagata」プロジェクトの同じ「hal_entry.c」に記述されている「uart2_callback()」コールバック関数内…以下のリストでは7行目です。

  1. ...
  2. void uart2_callback(uart_callback_args_t *p_args)
  3. {
  4.     if (p_args->event == UART_EVENT_RX_COMPLETE) {
  5.         // 受信が完了したら「r_sci_usrt.c」ファイルの
  6.         // 「sci_uart_rxi_isr()」割り込みハンドラからここに来る
  7.         recieved = true;
  8.     }
  9.     if (p_args->event == UART_EVENT_TX_COMPLETE) {
  10.         // 送信が完了したら「r_sci_usrt.c」ファイルの
  11.         // 「sci_uart_tei_isr()」割り込みハンドラからここに来る
  12.     }
  13.     if (p_args->event == UART_EVENT_RX_CHAR) {
  14.         // 一文字受信したら「r_sci_usrt.c」ファイルの
  15.         // 「sci_uart_rxi_isr()」割り込みハンドラからここに来る
  16.     }
  17.     if (p_args->event == UART_EVENT_ERR_FRAMING) {
  18.         // フレーミングエラーを検出した時に「r_sci_usrt.c」ファイルの
  19.         // 「sci_uart_eri_isr()」割り込みハンドラからここに来る
  20.     }
  21.     if (p_args->event == UART_EVENT_BREAK_DETECT) {
  22.         // ブレークを検出した時に「r_sci_usrt.c」ファイルの
  23.         // 「sci_uart_eri_isr()」割り込みハンドラからここに来る
  24.     }
  25.     if (p_args->event == UART_EVENT_TX_DATA_EMPTY) {
  26.         // 送信バッファが空になった時に「r_sci_usrt.c」ファイルの
  27.         // 「sci_uart_txi_isr()」割り込みハンドラからここに来る
  28.     }
  29. }
  30. ...


つまり、ベアメタル版の場合ではシリアル通信の受信割り込みが発生して「uart2_callback()」コールバック関数にて「received」変数がtrueにセットされるまでは、空ループをグルグル回り続けます。

この状態では、CPUは割り込みハンドラ内の処理以外は他に何もできません。

空ループとは言っても処理は処理です。

この間CPUは空ループを回すという非生産的なことだけに全力を傾けている状態です。


一方、RTOS版は…?

「received」変数の操作の代わりに「slp_tsk()」というシステムコールを置きました。

「slp_tsk()」は、これを呼び出したタスクを「起床待ち(スリープ)」にするシステムコールです。

「main_task()」関数は「MAIN_TASK」というIDのタスクであることは同じディレクトリにある「main.cfg」で設定されています。

ですので「slp_tsk()」を呼び出した時点で「MAIN_TASK」はスリープ状態となり、割り込みハンドラや他のタスクが「iwup_tsk(MAIN_TASK);」や「wup_tsk(MAIN_TASK);」してあげない限り、ずっと動作を停止した状態が続きます。

RTOS版で具体的にこれを行っているのは、ベアメタル版と同じく「hal_entry.c」に記述されている「uart2_callback()」コールバック関数内…以下のリストでは6行目です。

  1. ...
  2. void uart2_callback(uart_callback_args_t *p_args)
  3. {
  4.     if (p_args->event == UART_EVENT_RX_COMPLETE) {
  5.         // 待ち状態のタスクを起床させる
  6.         iwup_tsk(MAIN_TASK); // 追記!
  7.     }
  8.     if (p_args->event == UART_EVENT_TX_COMPLETE) {
  9.         // 送信が完了したら「r_sci_usrt.c」ファイルの
  10.         // 「sci_uart_tei_isr()」割り込みハンドラからここに来る
  11.     }
  12.     if (p_args->event == UART_EVENT_RX_CHAR) {
  13.         // 一文字受信したら「r_sci_usrt.c」ファイルの
  14.         // 「sci_uart_rxi_isr()」割り込みハンドラからここに来る
  15.     }
  16.     if (p_args->event == UART_EVENT_ERR_FRAMING) {
  17.         // フレーミングエラーを検出した時に「r_sci_usrt.c」ファイルの
  18.         // 「sci_uart_eri_isr()」割り込みハンドラからここに来る
  19.     }
  20.     if (p_args->event == UART_EVENT_BREAK_DETECT) {
  21.         // ブレークを検出した時に「r_sci_usrt.c」ファイルの
  22.         // 「sci_uart_eri_isr()」割り込みハンドラからここに来る
  23.     }
  24.     if (p_args->event == UART_EVENT_TX_DATA_EMPTY) {
  25.         // 送信バッファが空になった時に「r_sci_usrt.c」ファイルの
  26.         // 「sci_uart_txi_isr()」割り込みハンドラからここに来る
  27.     }
  28. }
  29. ...


割り込みが発生して「iwup_tsk(MAIN_TASK);」を行わない限り、メインプログラムが再開しないのはベアメタル版と同じです。

しかし、ベアメタル版の空ループではなく、RTOS版の場合はタスクをスリープ状態に移管しただけ…という点に違いがあります。

ベアメタル版の空ループの場合、この時実行できる他の処理は、何らかの割り込みが発生した時に呼び出される割り込みハンドラの処理だけです。

一方、RTOS版のスリープ状態の場合は、割り込みハンドラの処理に加えて、他のタスクに処理が移り、文字通り他の処理を行うことができます。

RTOS版で空ループを使った場合も、そこでCPU全体が固まってしまうということはなく、他に優先度の高いタスクが動いていれば、そちらに処理が移ります。

これがマルチタスクと呼ばれているもので、RTOSを使用する最大のメリットの一つです。

この辺りの動きの詳細は、μITRON4.0の仕様書か、TOPPERS/ASPのサンプルプログラムの動きを解説したこちらの記事を参照してください。

今回のRTOS版では、同時に動いているタスクは、メインプログラムである「MAIN_TASK」の他にログを管理する「LOGTASK」があります。

マルチタスクで動作している証拠として、RTOS版を実行した後、ターミナル・ソフトウェアによる操作を何も行わない状態で「LOGTASK」のプログラムにデバッガでブレークを仕掛けてみましょう。

具体的には「syssvc」ディレクトリ直下の「logtask.c」ファイルの140行目、ループの先頭「while ((rercd = syslog_rea_log(&logbuf)) >= 0) {」というコードの辺りが良いでしょうか?

e2 studio


引っかかりましたね?

この時「MAIN_TASK」タスクは「slp_tsk()」により止まっていますが、空ループに入ったベアメタル版とは違い「LOGTASK」という他のタスク、すなわち他の処理が実行できていることが分かります。


今回はRTOS版でも、システム全体で2つのタスクしかありません。

しかし、もっと複雑なアプリケーションの開発において、同時に処理しなければならないことが増えた時にこそ、RTOSを使用するメリットが増大します。

CPUに無駄な処理をさせることなく、待ち時間や休む暇なく、同時に多くの仕事を効率的に動いてもらうことがRTOSの役割です。

こういう言い方だと、ブラック企業のマネージャーみたいでCPUには気の毒ですがね…。


まとめ

組み込みソフトウェアにおいてTOPPERS/ASPなどのRTOSを使用するメリットは、以下の通りです(…だと個人的には思っています!)。


1.マルチタスクが使えること

今まで説明させていただいた通り、これが最大のメリットだと思います。

RTOSを使用しない場合、メインプログラムの処理の他に何かをやらせようとすると、何らかの割り込みハンドラに全ての処理を記述しなければなりません。

そうすると割り込みハンドラの処理が重くなり、他の割り込み処理など、システム全体のパフォーマンスを落としかねません。

ソフトウェア全体の設計も窮屈で難解なものになるでしょう。


2.ソースコードの移植性が高くなること

今回のターゲット「Arduino UNO R4」はARMアーキテクチャのマイコンを搭載しています。

例えば、あるソフトウェアをRTOSを使って開発していて、それをARMではなくRISC-VやRXなどの他のアーキテクチャのハードウェアに移植することを考えてみてください。

あるアーキテクチャでは簡単に実現できることが、別のアーキテクチャでは困難であるケースや、やり方が大きく違うことが多々あります。

本来、OSとはハードウェアとアプリケーションの間に入って、アプリケーションから見たハードウェアの差異を吸収する役割を持つものです。

したがって、もしRTOSを使っていなければ、ソフトウェアのかなりの部分の書き直しが必要となる可能性もあります。

当然、ハードウェア依存部分は使用するハードウェアやマイコンによってその都度書き直す必要のある部分はあるにしても、少なくともアプリケーション部分に関しては、そのまま流用できるはずです。

移植元と移植先のRTOSの仕様が同一であれば、アプリケーションは同じ動作のシステムコールを使用しますので、動作検証の工数も大幅に削減できます。

むしろ、この工数削減こそ貴重です!

が、このメリットは昔ほど重視されません。

こう…、なんでもかんでもARMの時代じゃあ…。


3.ソースコードの可読性が高くなること

RTOSを使用しないベアメタルなソフトウエアにおいては、その作者によってルールが異なります。

プログラマーの中には変わり者も多く(そういう人ほど天才が多いですが…)、俺俺ルール満載、カオスで難読のソースコードも数多くあります。

その点、RTOSを使用した場合はシステムコールの仕様やタスクの構成など、一定のルールが保たれる傾向があります。

(そうじゃなきゃ動かないしねぇ。)

見慣れたRTOSのシステムコールを起点にソースコードを読んでいけば、それが赤の他人が書いたものでも理解は格段に容易になります。

自分の書いたものであっても、しばらくすれば忘れてしまうもの。

その際にもメンテナンス性が向上しますよ。


RTOSの導入は多少手間がかかりますが、開発しているソフトウエアが複雑になればなるほど、手間を上回る十分なメリットが得られると思います。

とはいえRTOSも万能ではありませんので、特にROMやRAMなどのリソースが少ない状況でのご使用は、是非とも慎重なご判断を!


ライセンスについて

このカーネルは「TOPPERSライセンス」で配布しております。

無償ですが、使用に関しては自己責任です。

このカーネルを商用利用する方は、このリンク先の条項に従ってください。


さて、これで「TOPPERS/ASP Arduino UNO R4版」に関するテーマは終了です。

お付き合いいただき、ありがとうございました。

これでようやく次のアーキテクチャの説明に入れます!


<終わり>

TOPPERS/ASP - PIC24F版 その2

前回からの続き です。 開発環境の構築(MPLAB X IDE/XC16編) 「 MPLAB X IDE 」とは、Microchip社の純正のIDEです。 以前「 TOPPERS/ASP - PIC32MX版 その2 」でも紹介していますが、大分時間が経ってしまって、バージョンア...