解決策
この問題はi801_smbusの割り込みの連続実行を有効にするSLVCMD レジスタの SMBALERT_DISビットが原因で発生し、CPU 使用率が増加する事が確認されました。この問題に関してはNI cRIO 904x にインストールされている NI Linux Real-Time のバージョンに応じて、いくつかの解決策があります。
この記事の解決策を実行する前に、NI cRIO 904x (Rev. C)の通常PCまたは TPMコントローラを使用していること、および i801_SMB での CPU 割り込みが多い現象を確認してください。 NI cRIO 904x のリビジョンバージョンを確認する方法については、
「NI ハードウェアのリビジョンを確認する」を参照してください。高CPU割り込みが i801_SMB によって引き起こされているかどうかを確認するには、コンソールで
cat /proc/interruptsコマンドを実行してください。 SSH経由でコントローラのコンソールに接続する方法については、「
NI Linux Real-Timeデバイスでシェルにアクセスする 」と以下の図を参照してください。
NI Linux Real Timeのバージョンは、
NI MAXのコントローラの
システム設定に移動して確認できます。下の写真を参照してください。
NI Linux Real-Timeバージョンがx64 4.9.47-rt37-6.0.0f1バージョン(NI CompactRIO 18.5)と同じかそれより古い場合は、次のいずれかの方法を実装してください。
方法 1: SLVCMD レジスタの SMBALERT_DIS ビットを設定するための RTOS ファイルを作成します。
- まず、NI cRIO 9040x の BIOS バージョンを BIOS バージョン 2.0.3f0 以降に更新してください。詳細については、「NI Linux Real-Timeバージョンがx64 4.9.47-rt37-6.0.0f1バージョン(NI CompactRIO 18.5)より新しい場合」 を参照してください。
- コントローラを再起動し、SSH 接続を開始します。手順については「NI Linux Real-Timeデバイスでシェルにアクセスする 」を参照してください。
- この手順では、RTOS スクリプト ファイルを作成してください。 RTOS ファイルを作成するには、 「cat > /etc/rc5.d/S01smbfix」と入力し、 Enterを押します。次に「#! /bin/bash」を入力してEnterを押します。その後、「devmem 0x91612011 8 0x5」を入力し、 Enterを押します。最後に、<Ctrl-D> を押します。このコマンドラインは、コントローラのローカルの場所に RTOS ファイルを作成して保存します。スクリプト ファイルが保存されると、コンソールにスクリプト ファイルの権限を設定するよう求めるプロンプトが表示されます。
- 「chmod +x /etc/rc5.d/S01smbfix」を入力し、 Enter を押します。これによりスクリプトファイルの権限が設定されます。これでRTOSスクリプトファイルの作成は完了です。
- コンソールを終了し、NI MAXの再起動ボタンを押してコントローラを再起動します。
- コントローラのコンソール出力に再接続し、「devmem 0x91612011 8」コマンドを実行し、出力が0x05であるかどうかを確認します。「cat /proc/interrupts」コマンドを実行し、i801_smbus 割り込みの高い CPU 使用率の問題が解決されているかどうかを確認します。
方法 2: i801_smbus 割り込みを無視するように modprobe に指示します。
- SSH接続を開始します。手順については「NI Linux Real-Timeデバイスでシェルにアクセスする 」を参照してください。
- 「echo "options i2c-i801 disable_features=0x10" >> /etc/modprobe.d/i2c-i801.conf && reboot」を入力し、 Enterを押します。
- 「cat /proc/interrupts」コマンドを実行し、i801_smbus 割り込みの高い CPU 使用率の問題が解決されているかどうかを確認します。
上記の解決策を実装すると、i801_smbus 割り込みによる CPU 使用率の問題は解決されるはずです。