NI cRIO-904x (Rev. C)においてCPU 割り込みが多発

更新しました Jul 18, 2024

使用製品

ハードウェア

  • cRIO-9040
  • cRIO-9041
  • cRIO-9042
  • cRIO-9043
  • cRIO-9045
  • cRIO-9046
  • cRIO-9047
  • cRIO-9048
  • cRIO-9049

ソフトウェア

  • LabVIEW Real-Time Module

ドライバ

  • NI CompactRIO

問題

  • NI cRIO 904x (Rev. C)を使用しています。CPU 使用率が異常に高くなります。特にi801_SMB 割り込みが問題になっています。
  • コンソールでcat /proc/interruptsコマンドを実行したところ、i801_SMB(IRQ20) の CPU 割り込みが非常に高いことがわかりました。NI cRIO-904x を再フォーマットし、NI ソフトウェアを再インストールした直後でも発生しています。
  • BIOS バージョン 2.0.3f0 にアップグレードしましたが、依然として i801_SMBのCPU使用率が高いです。
  • cRIOがフリーズし、カーネルリングバッファ(dmesg) に RCU 関連のエラーメッセージが表示されます。
task:rcu_preempt  state:I stack:  0 pid: 13 ppid:  2 flags:0x00004000
Call Trace:
? __schedule+0x1de/0x5b0
? schedule+0x7e/0x120
? schedule_timeout+0x182/0x2f0
? del_timer_sync+0xa0/0xa0
? rcu_gp_kthread+0x6ac/0xbd0
? rcu_cpu_kthread+0x280/0x280
? kthread+0x17c/0x1a0
? kthread_worker_fn+0x110/0x110
? ret_from_fork+0x1f/0x30
Sending NMI from CPU 1 to CPUs 0:

解決策

この問題は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 MAXファームウェアのバージョン

 

NI Linux Real-Timeバージョンがx64 4.9.47-rt37-6.0.0f1バージョン(NI CompactRIO 18.5)よりも新しい場合:

  • NI cRIO 904x の BIOS バージョンを BIOS バージョン 2.0.3f0 以降に更新します。最新の BIOS バージョンは、 「cRIO-904x ファームウェアと追加ドライバ」からダウンロードできます。
  • BIOS を更新するための手順については、BIOS インストール ファイルに含まれる Readme ファイルを参照してください。「CompactRIO 904x ファームウェアと追加ドライバーの Readme」も参照してください。
  • NIはBIOSバージョンのダウングレードをサポートしておらず、BIOSのダウングレードによって生じる損害については責任を負いませんのでご注意ください。



NI Linux Real-Timeバージョンがx64 4.9.47-rt37-6.0.0f1バージョン(NI CompactRIO 18.5)と同じかそれより古い場合は、次のいずれかの方法を実装してください。

方法 1: SLVCMD レジスタの SMBALERT_DIS ビットを設定するための RTOS ファイルを作成します。

  1. まず、NI cRIO 9040x の BIOS バージョンを BIOS バージョン 2.0.3f0 以降に更新してください。詳細については、「NI Linux Real-Timeバージョンがx64 4.9.47-rt37-6.0.0f1バージョン(NI CompactRIO 18.5)より新しい場合」 を参照してください。
  2. コントローラを再起動し、SSH 接続を開始します。手順については「NI Linux Real-Timeデバイスでシェルにアクセスする 」を参照してください。
  3. この手順では、RTOS スクリプト ファイルを作成してください。 RTOS ファイルを作成するには、 「cat > /etc/rc5.d/S01smbfix」と入力し、 Enterを押します。次に「#! /bin/bash」を入力してEnterを押します。その後、「devmem 0x91612011 8 0x5」を入力し、 Enterを押します。最後に、<Ctrl-D> を押します。このコマンドラインは、コントローラのローカルの場所に RTOS ファイルを作成して保存します。スクリプト ファイルが保存されると、コンソールにスクリプト ファイルの権限を設定するよう求めるプロンプトが表示されます。
  4. 「chmod +x /etc/rc5.d/S01smbfix」を入力し、 Enter を押します。これによりスクリプトファイルの権限が設定されます。これでRTOSスクリプトファイルの作成は完了です。
RTOS ファイルの作成
  1. コンソールを終了し、NI MAXの再起動ボタンを押してコントローラを再起動します。
cRIO を再起動します
  1. コントローラのコンソール出力に再接続し、「devmem 0x91612011 8」コマンドを実行し、出力が0x05であるかどうかを確認します。「cat /proc/interrupts」コマンドを実行し、i801_smbus 割り込みの高い CPU 使用率の問題が解決されているかどうかを確認します。
問題解決の図


方法 2: i801_smbus 割り込みを無視するように modprobe に指示します。

  1. SSH接続を開始します。手順については「NI Linux Real-Timeデバイスでシェルにアクセスする 」を参照してください。
  2. 「echo "options i2c-i801 disable_features=0x10" >> /etc/modprobe.d/i2c-i801.conf && reboot」を入力し、 Enterを押します。
  3. 「cat /proc/interrupts」コマンドを実行し、i801_smbus 割り込みの高い CPU 使用率の問題が解決されているかどうかを確認します。

上記の解決策を実装すると、i801_smbus 割り込みによる CPU 使用率の問題は解決されるはずです。

追加情報

上記の解決策を試しても同じ問題が発生する場合は、「devmem 0x91612011 8 0x5」コマンドを実行して i801_smbus 割り込みの CPU使用率を削減できたかどうかを確認してください。ただし、これは永続的な解決策ではない可能性があります。この方法を永続的に実装するには、RTOS スクリプトを NI cRIO 904x にインストールする必要があります。

NI cRIO 904x (Rev. C) をお持ちでないにもかかわらず、アイドル状態で CPU 使用率が高いことが観察される場合は、さらなるトラブルシューティングについてNI サポートにお問い合わせください。