本ドキュメントではSOLID for Raspberry Pi 4を使用中に起こる可能性のある問題と解決策を示します。
手元にあるRaspberry Pi 4 Model Bのメモリサイズが分からない。
Raspberry Pi 4上で /proc/cpuinfo
からモデルリビジョンコードを取得して判別できます。2022年の時点では以下の規則に従っているようです。
リビジョンコード | モデル | メモリサイズ |
---|---|---|
a0311* |
4B | 1GB |
b0311* |
4B | 2GB |
c0311* |
4B | 4GB |
d0311* |
4B | 8GB |
例えば、以下の例ではRaspberry Pi 4 Model B 8GBモデルであると分かります。
$ cat /proc/cpuinfo | grep Revision
Revision : d03114
Raspberry Piに接続できない。ホスト名を指定して接続している。
SSHやRaspberry Pi Selectorでホスト名 (e.g., raspberrypi
) を指定して接続する場合はマルチキャストDNSという方法で接続先を検索します。通常はこれでうまくいくことが多いのですが、ネットワーク構成によっては失敗する場合があるようです。
ホスト名が使用できない場合、IPアドレスを代わりに指定して接続してください。IPアドレスを調べる方法としては、Raspberry Pi上で ip addr
コマンドを実行する方法があります。他の方法についてはRaspberry Pi公式ドキュメント (英語) をご覧ください。
注意: IPアドレスをDHCPにより動的割り当てする環境では、Raspberry PiのIPアドレスが変化する可能性があります。IPアドレスが変化した場合、以下の手順を再実施する必要があります。
- 新しいIPアドレスでSSHリモートログインを行ってください。接続が完了してシェルが表示されればOKです。
- Raspberry Pi Selectorの Home 画面から作成済みのプロファイルを選択し、編集 を押し、表示されるダイアログで ホスト名 入力欄の内容を修正してください。
Raspberry Piに接続できなくなった。
Raspberry Piの電源が入っているのに突然接続できなくなった場合、Linuxカーネルがハングアップしている可能性が疑われます。UARTコンソールでエンターキーを入力し、Linuxのログインプロンプトが表示されるか確認してください。UARTコンソールも反応しない場合、Raspberry Piの電源を切断して再起動することが必要です。
SOLID-OSとLinuxは完全に分離されていないため、モニタデバッガやロードしたアプリケーションの誤作動が原因でLinuxがハングアップする可能性があります。例えば、Linuxが使用しているペリフェラルの割込みラインの設定をSOLID-OSから変更することは推奨されません。
インターネットの接続の調子が悪くなった。
Raspberry Piがハングアップしていないか確認してください。Linuxカーネルがハングアップするとハードウェアが大量のPauseフレームを送信し、一部のネットワーク機器の動作に一時的な支障を来す場合があることを確認しています。
Raspberry Piのファイアウォールを有効化したらRaspberry Pi Selectorに表示されなくなった。
Raspberry PiがUDPポート51590のパケットが受信できるように設定してください。
Raspberry Pi Selectorで接続時に "Host key verification failed" または "WARNING: POSSIBLE DNS SPOOFING DETECTED!" というエラーが出る。
SSHサーバーは固有の識別子を持っており、SSHクライアントはサーバーのホスト名と識別子の対応関係を %USERPROFILE%\.ssh\known_hosts
テキストファイルで記憶しています。Raspberry Pi Selectorはここに記憶された既知のサーバーにのみ接続できます。
"Host key verification failed" というエラーが出る場合、まだ対応関係が登録されていないので、一度Windows標準のSSHクライアントを使用してサーバーに接続してください。この際、ホスト名がRaspberry Pi Selectorに登録されているものと完全に同じになるようにしてください。
注意: WSL (Windows Subsystem for Linux) やMSYS2からこれを行うと異なる場所の
known_hosts
に保存される可能性があります。TeraTermなど別のSSHクライアントはまったく独立した仕組みを利用しています。必ず、Windowsオプション機能として提供されているOpenSSHクライアントを使用するようにしてください。
SDカードイメージの書込みを行うとサーバー側の識別子が再生成されるため、記録された対応関係が無効になります。"WARNING: POSSIBLE DNS SPOOFING DETECTED!" というエラーが出る場合、ssh-keygen -R ホスト名
コマンド (e.g., ssh-keygen -R raspberrypi
) を実行して古い情報を削除してください。
このエラーは、ホスト名が指すサーバーが変化したことを表します。DNS偽装攻撃 (DNS spoofing attack) が一つの要因ですが、意図的にサーバーを置き換えたときや、DHCP環境でIPアドレスが別のホストで再利用されたときも同じことが起こります。
同じネットワーク内にホスト名が重複する複数のサーバーが存在すると、どれに接続されるかが一定しないため、最初に接続したものと異なるものに接続されたときに上記のエラーが発生します。これを避けるためにはSDカードイメージを書き込む際に異なるホスト名を指定するようにしてください。
ビルドが "Failed to get license: SOLID_RASPI" エラーで失敗する。
Raspberry Pi Selectorが起動していて、ターゲットに接続した状態であることを確認してください。
Rustプロジェクトのビルドが "No such file or directory" エラーで失敗する。
Rust MinGWツールチェーンの制約です。ソリューションを非ASCII文字を含まない短いパスの場所に移動して再度お試しください。ソリューションの完全パスが110文字以内に収まるようにすることを推奨します。
Rustプロジェクトのビルドが "the 'cargo.exe' binary, normally provided by the 'cargo' component, is not applicable to the 'nightly-2022-08-12-x86_64-pc-windows-gnu' toolchain" エラーで失敗する。
ツールチェーンのインストールに失敗している可能性があります。SOLID-IDEを終了後、コマンドプロンプトで以下のコマンドを実行し、ツールチェーンの再インストールを行ってから、再度お試しください。
rustup toolchain uninstall nightly-2022-08-12-x86_64-pc-windows-gnu
rustup toolchain install nightly-2022-08-12-x86_64-pc-windows-gnu
実行を中断すると "ソースは利用できません" という表示が出る。
リアルタイムOSのソースコードは提供されていないため、ここで実行を中断した場合はソースコードは表示されません。ただし、この場合でも呼び出し履歴ウィンドウ (Alt+7) から呼び出し元を辿ることはできます。
アイドル状態 (実行可能なタスクがない) の場合もOS内で実行が中断します。この状況は次の方法で確認することができます。
- 呼び出し履歴ウィンドウ (Alt+7) に
ghost_debug.elf!_kernel_exit_and_dispatch()
という行のみが表示されている。 - 逆アセンブルウィンドウ (Alt+8) を表示すると
wfi
(Wait for Interrupt) 命令で実行が中断している。
待ち状態のタスクを探すにはスレッド (Ctrl+Alt+H) または並列スタックウィンドウ (Ctrl+Shift+D, S) を使用すると便利です。タスクの待ち要因はRTOSビューアーで確認できます。
"アプリケーションホストからの応答がありません。ターゲットシステムの再起動が必要な可能性があります。" というエラーが出た。
デバッグモニタがハングアップしていることが考えられます。この場合、 sudo reboot
コマンドなどの方法でRaspberry Piを再起動することが必要です。これはモニタデバッガの技術的制限です。
"ターゲットにアタッチ中のデバッガが既に存在します。" というエラーが出た。
他にデバッガのインスタンスが存在しないのにもかかわらずこのメッセージが表示される場合、次のコマンドをRaspberry Pi上で実行することで、Ghostdを強制的に再起動し、デバッグモニタへの接続をすべて切断することができます。
$ sudo systemctl restart ghostd
"ライセンスが取得できません。" というエラーが出た。
Raspberry Pi Selectorが起動していて、ターゲットに接続した状態であることを確認してください。
ステップ実行が非常に遅い。
RTOSビューアーが表示中の場合、実行を停止するたびにウィンドウの内容を更新するため、 ステップ実行などの動作が極端に遅くなります。ステップ実行を行う際は非表示にするか、自動更新を停止することをお勧めします。
acre_isr
関数が E_OBJ
を返して失敗する。
割込みハンドラはSOLID-OSが提供する SOLID_INTC_Register
関数を使用して登録してください。acre_isr
関数は使用できません。
main
関数を作ったが呼び出されない。
SOLID for Raspberry Pi 4アプリケーションはSOLID独自のローダブル形式を使用しており、 slo_main
がRTOSメインタスクから呼び出されるエントリポイント (入り口関数) となります。このエントリポイントは各言語で以下のようにして定義できます。
void slo_main() { /* ... */ } // C
extern "C" void slo_main() { /* ... */ } // C++
#[no_mangle]
pub extern "C" fn slo_main() { /* ... */ } // Rust
メインタスクのスタックを大きくしたい。
メインタスクのスタックサイズは変更できないため、独自のスタックサイズを指定した新しいタスクを起動してください。
// C++
const T_CTSK inner_main_task_opts = {
.tskatr = 0,
.exinf = 0,
.task = inner_main_task,
.itskpri = 5,
.stksz = 1024 * 256, // 256KiB
.stk = NULL,
.iprcid = 1,
.affinity = 0b01,
};
acre_tsk(&inner_main_task_opts);
// Rust
std::thread::Builder::new()
.stack_size(256 * 1024) // 256KiB
.spawn(inner_main_task)
.expect("failed to spawn an inner main task")
.join()
.expect("inner main task panicked");
実行可能ファイルを起動すると "そのようなファイルはありません" 旨のエラーが出て失敗する。
file
コマンドを使用して実行可能ファイルのターゲットCPUアーキテクチャを確認してください。SOLID for Raspberry Pi 4のOSイメージのRaspberry Pi OSは 64-bit Arm (AArch64) バージョンを使用しており、32-bit Arm向けにビルドされたプログラムは初期状態では起動できない場合があります。
$ file xxx
xxx: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, ...
^^^^^^ ^^^^^^^^^^^
'---------------+-------------'
|
good
$ file xxx
xxx: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, ...
^^^^^^ ^^^
'-------------+----------'
|
BAD
32-bit Arm向けにビルドされたプログラムを起動するためには32-bit Arm向けのシステムライブラリを別途インストールする必要があります。(Stack Exchange, "How to run 32-bit (armhf) binaries on 64-bit (arm64) Debian OS on Raspberry Pi?")