SOLID for Raspberry Pi 4で使用するSOLID-OSシステムについて説明します。
SOLID-OSはSOLID for Raspberry Pi 4が使用するRTOSアプリケーション実行環境です。
マルチコア対応のTOPPERS/FMP3 RTOSカーネルの独自拡張版を使用しており、以下の機能に対応しています。
- 動的資源生成: カーネル資源を
acre_tsk
等のカーネル関数を使用して生成できます。 - 優先度拡張: タスク優先度の有効範囲は
[1, 256]
です。 - 優先度継承ミューテックス:
TA_INHERIT
属性をサポートしています。 - Readers-Writerロック
- イベントトラッカー: タスクや割込みハンドラの実行履歴を記録しIDE上で可視化できます。
SOLID-OSが提供するファイルシステム、割込み処理、ネットワーク等のAPIはユーザアプリケーションから使用することができます。
アプリケーションコードはAArch64 EL1・MMU有効状態で動作し、Armコアからアクセス可能なすべてのペリフェラルが使用できます。
注意: Linuxが使用しているペリフェラルを同時に操作することも可能ですが、Linuxの動作に干渉しないよう注意する必要があります。
GhostアプリケーションホストはSOLID-OS側のメインアプリケーションで、Ghostdと連携し、ユーザアプリケーションを動的ロードし起動する役目があります。
以下のタスクが静的生成されます。
エントリポイント | 初期優先度 | 目的 |
---|---|---|
ghost_main_task |
10 |
ユーザアプリケーションを動的ロードし、エントリポイントを呼び出します。 |
ghost_time_sync_task |
200 |
Linuxからシステム時刻を定期的に取得し、RTC APIの時刻を同期します。 |
solid_sys_terminator_task |
1 |
exd_tsk 関数のエミュレーションで使用します。 |
注意: Ghostが生成するタスクは予告なく変更される可能性があります。
OSCOM RPCはファイルやBSDソケット等のシステムコールを仲介しLinux側で処理するためのOS間通信機構です。これによりSOLID APIを経由して透過的にLinuxファイルシステムやネットワークにアクセスできます。
SOLIDファイルシステムAPIではマウントポイント \OSCOM_FS
がLinuxファイルシステムにマップされています。例えばデバイスファイル /dev/urandom
はアプリケーションコードからは \OSCOM_FS\dev\urandom
というパス名でアクセスできます。
注意: パス区切り文字はWindowsと同様にバックスラッシュ (ASCII 92, U+005C,
\
,"\\"
) が標準です。
制限事項#OS間通信 (OSCOM RPC) も参照してください。
GIC-400割込みコントローラをLinuxと共用しています。割込みハンドラはSOLID割込みコントローラAPIを使用して登録できます。
このシステムではRTOSカーネルで扱うものとして静的に定義された割込みラインは存在しないため acre_isr
などの関数は機能しません。
SOLIDログ出力API (e.g., SOLID_LOG_printf
) はBCM2711 Mini UART (GPIO 14/15, 40ピンヘッダ 8/10, 3.3V) に接続されています。ボーレートは115200に設定されています。
Jstrom99, CC BY-SA 4.0.
注意: Linuxシリアルコンソールも同じUARTポートを使用するため、同時に出力が行われると出力内容が壊れることがあります。
ログ出力を見るためにはUSB-UARTケーブル等が必要です。Windows向けのシリアル端末プログラムとしてはTera TermやPuTTYなどが定番です。SOLID-IDEの内蔵ターミナルもシリアルポートに対応しています。
SOLID-OSのボード依存コードは以下の通り実装されています。
- DMAコントローラAPIはサポートされていません。
- RTC APIはLinuxのシステム時刻を返します。
- ログ出力APIは上記の通りBCM2711 Mini UARTに出力します。
- タイマはVirtual Timer (
CNTVCT_EL0
) を利用して実装されています。 - 乱数生成APIはLinuxの
/dev/random
からエントロピーを取得します。非タスクコンテクストではSOLID_ERR_NOTSUPPORTED
エラーを返します。 - ファイルシステムスレッド安全性ラッパーはカーネルミューテックスを排他制御に使用します。非タスクコンテクストでは
E_CTX
エラーを返します。
ローダブルアプリケーション起動時のメモリマップ (抜粋) は以下の通りです。
仮想アドレス (VA) | 物理アドレス (PA) | 説明 |
---|---|---|
[0x0_0000_0000, 0x0_0007_ffff] |
無効 | Nullアクセスを捕捉する |
[0x0_fc00_0000, 0x0_ff7f_ffff] |
VAと同じ | BCM2711 main peripherals |
[0x0_ff80_0000, 0x0_ff80_0fff] |
VAと同じ | BCM2711 ARM Local peripherals |
[0x2_e000_0000, 0x2_ffff_0000] |
(RAMから割当て) | SOLID-OS、ヒープ、スタック等 |
[0x3_0000_0000, 0x3_ffff_ffff] |
(RAMから割当て) | ローダブルアプリケーション |
SOLID-OSで使用するRAMの物理アドレス範囲はdevice tree overlay /boot/overlays/ghost-rpi4.dtbo
によってLinuxの割当てから除外しています。
注意: メモリマップはアプリケーションから変更できますが、既存のマッピングを解除したり、新たなPA範囲をマッピングしてアクセスするのは一般に安全ではなく、データ破壊やシステムのハングアップに繋がることがあります。例えばLinuxがファイルキャッシュとして使用しているRAM領域のデータを変更した場合、ファイルの内容が破壊される可能性があります。