小さく高速な組込み向けGUIツール「GUIX」の基礎を解説【その1】

つぶつぶコラム

第2回記事 小さく高速な組込み向けGUIツール「GUIX」の基礎を解説【その2】

第3回記事 小さく高速な組込み向けGUIツール「GUIX」の基礎を解説【その3】

GUIXとは

GUIXとは、Express Logic社が開発した組込み向けのGUIツールです。
比較的、性能の低い環境でも動作するように設計されています。
ご存知の方も多いと思いますが、Express Logic社はMicrosoft社に買収され「Azure RTOS GUIX」となりました。(名称が長いので、本コラムでは「GUIX」と呼びます。)
ライセンスも、Microsoft社にて事前ライセンスされているマイクロコントローラー (MCU) 、マイクロプロセッサー (MPU) であれば無料で使用が可能になりました。
※事前ライセンスされているデバイスのリストは、GitHub (https://aka.ms/AzureRTOSdevices) にあります。

GUIXの構成

GUIXには組込み機器で動作するGUIXライブラリと、Windows PCで動作するデザインツールで構成されます。
GUIXライブラリのソースコードはGitHubで公開されています。
デザインツールは、Microsoft Storeからダウンロード/インストールすることができます。
また、GitHubにはいくつかの評価ボードで動作するサンプルプロジェクトもあります。

AzureRTOSに関するMicrosoftのHP:https://azure.microsoft.com/en-us/services/rtos/
GitHub:https://github.com/azure-rtos

GUIXライブラリ

GUIXライブラリは組み込み環境で動作するソースコード群です。
全てC言語で記述されており、移植性の高いコードとなっています。
GUIXライブラリには、サンプルアプリケーションと、チュートリアル目的のアプリケーションが含まれていますので、使い方などの学習に役立てることが出来ます。
GUIXライブラリは、Azure RTOS ThreadX上で動作し、いくつかのOS機能を使用します。
GUIXライブラリは、内部にシステムスレッドがありますが、イベントドリブンで動作するため、イベントの無い間はCPU時間を使いません。
また、画面の出力の為のインターフェイス(以後I/F)や、タッチパネルなどからの入力I/Fが定義されており、これに対応することで様々な環境での動作を行えるようになっています。
なお、画面出力の為のLCDドライバや、タッチパネルなどのドライバはユーザーが用意する必要があります。

デザインツール

デザインツールはWindows10以降で使用が可能で、Microsoft Storeからダウンロード/インストールが出来ます。(GUIXで検索すると出てくると思います。)
デザインツールは直感的に分かりやすい作りになっており、Visual Studioで作業された経験があれば迷うことなく使用できると思います。

サンプルアプリケーションのdemo_guix_home_automation.gxpを開いた様子

デザインツールでは、画面に表示する部品(Widgetと呼びます)を配置したり、各Widgetのプロパティ(画面左下の様々なパラメータ)を設定することで動作を定義します。
また、リソース(色、絵、文字列など)の登録なども行います。
作成した画面情報はC言語のコードとして生成することができ、生成したコードと組み込み環境のコードを合わせてビルドすることで、組込み環境でのGUIを実現します。
なお、デザインツールのソースは公開されていないようです。

用意しないといけないもの

GUIXを使う際に必要になるものを上げます。

OS

GUIXは基本的にAzure RTOS ThreadX上で動作します。
スレッドやミューテックスなどのOSリソースを使うため、OSは必須となっています。
また、GUIXは動作時にメモリの動的な割り当て・解放を行います。可変長メモリプール機能を用意しておくのが良いと思います。
また、冒頭に「基本的に」と書いたのは、弊社ではITRON上に移植した実績がある為です。もし、ご要望があれば弊社までお問い合わせいただければと思います。

表示機器とドライバ

GUIXが行うことはメモリ上に画面を描画し、入力機器やタイマなどイベントでメモリ上の画面を更新することです。
GUIXが描画したメモリ上の画面をLCDなどの表示機器に出力する処理は、GUIXには含まれていません。
GUIXは画面を描画し、表示の更新が必要なタイミングで表示更新用のI/Fを呼び出します。(トグルファンクションと呼ばれています。)
ですので、GUIXが表示更新用のI/Fを呼び出した先の、LCDコントローラなどの表示機器に表示する処理はユーザーが用意する必要があります。

入力機器とドライバ

GUIXへのタッチパネルなどの入力機器による入力は、イベントで行われます。
イベントの送信機能はGUIXに用意されているAPIを用いて行います。
このようにI/Fが規定されているため、イベントの送信部分を用意することで多くの入力機器に対応することが出来ます。(通常は入力機器のドライバ内部、もしくはラッパーのような処理としてGUIXへイベントを送る処理を追加します。)
多くの場合はタッチパネルやマウスなどのポインティングデバイスで、座標やボタンの状態を送りますが、GUIXはユーザーイベントが定義できますので、外部ボタンなどに独自のイベントを割り当てることも出来ます。(もちろん、イベントを受ける側の処理も作る必要があります。)
また、表示を行うだけであれば入力機器や、これに付随するドライバなどは不要です。

Widgetに張り付ける絵

デザインツールで画面を作る際にボタンなどに絵を張り付けることができます。
デフォルトのデザインもありますが、簡単なデザインなのでデモなどで使う分には良いとは思いますが、見栄えよく見せるには張り付けるための絵を用意しておいた方が良いと思います。
絵はPNG形式のものが、透過設定もできるので良いと思います。(透過してもWidgetの形は変化しないのでWidgetの範囲は変りません。)

色定義

GUIとしても重要な決めごとの一つです。
1つのピクセル(ドット)を何階調で表現するか、と言った決めごとになります。例えばWindows PCなどは32ビット/ピクセルが主流ですが、昔は256色(8ビット/ピクセル)などもありました。
ビット数が増えればその分使用するメモリ量も増えます。また、表示機器側や表示用のコントローラが対応しているかどうかの確認も必要になります。
システムの搭載メモリ量次第ではビット数を減らした選択をする必要もあるかもしれません。
逆に言えば、ビット数が決まらないとどのくらいメモリを用意しておけばよいかも決められません。

Configure Projectにある設定

また、GUIXではシステムで使用する色を定義できます。

Colorsリソース
Colorsリソースの編集画面

アプリケーション

GUIXのシステムはイベントドリブンで動作します。主にタイマイベントや入力機器からの通知をイベントとして動作を行います。
イベントはイベントハンドラと呼ぶ関数に渡され、その中でイベントに対する処理を行います。主なWidgetのデフォルトのイベントハンドラはGUIXに組み込まれていますが、GUIXが動作する上での最小限の処理だけです。また、Widgetからのイベント(例えばボタンWidgetが押された、等)のイベントハンドラはアプリケーションで用意する必要があります。
つまり、GUIXの生成するイベントを処理するイベントハンドラは、GUIXのシステムスレッドから呼び出されます。そのため、アプリケーションで用意するイベントハンドラの中で、時間のかかる処理を行ってしまうと、その間、GUIXのシステムスレッドが停止しますので、イベント処理や画面更新などが停止します。時間のかかる処理が必要な場合は、別途スレッドを用意し、イベントフラグなどのOS機能を使用して、GUIXのシステムスレッドが停止しない様にするなどの工夫が必要な場合があります。

イベントハンドラのオーバーライド

全てのイベントハンドラはオーバーライドが可能です。
GUIXのシステムスレッドは、イベントハンドラを関数ポインタとして呼び出しますので、関数ポインタを入れ替えることで既存のイベントハンドラを任意のイベントハンドラに置き換えることが出来ます。
これを利用して既存の動作ではなく特殊な動作を行うことが出来ます。
例えば、ボタンWidgetは通常ボタンを押した際にイベントを発生させますが、これをボタンの長押しでイベントを発生させるなどが出来るようになります。
ただし、イベントハンドラが入れ替わりますので、既存のイベントハンドラで行っていた処理を行う必要があります。これは、オーバーライドしたイベントハンドラから、既存のイベントハンドラを呼び出すことで、両方の処理を行う事で解決できる場合があります。(もちろん、実行タイミングや処理内容で難しい場合もあります。)

AzureRTOS GUIXの製品ページはこちら

2023年、Microsoft は Azure RTOS テクノロジを Eclipse Foundation に提供しました。
Eclipse Foundation を新しい拠点として、Azure RTOS は Eclipse ThreadX になりました。