cpuidle_idle_call() が「エラー」を返す理由はいくつかあります。
- CPU 用にインストールされた cpuidle ドライバーはありません。
- cpuidle が無効になりました
- ドライバーを初期化できませんでした
行方不明のドライバーは、発生する可能性が最も高いものです。しかし、この場合、カーネルは何らかの方法でサイクルを焼き尽くす必要があります。そのため、アーム上でデフォルトで default_idle にマップされる pm_idle を呼び出します。そこでカーネルは、CPU に arm_pm_idle が登録されているかどうかをチェックします。これは、軽量の cpuidle ドライバーのように考えることができます。すべてが失敗した場合、cpu_idle にフォールバックします。これは実装する必要があり、ほとんどの場合、書き込みバッファーを空にして WFI モードに入ります。
その全体には多くの冗長性がありますが、これにより、開発者は単純なアイドル ドライバーを作成し、必要に応じて後でそれらを完全に拡張された cpuidle ドライバーにすることができます。
問題は、さまざまな SoC がさまざまな機能を提供することです。たとえば、カークウッドでは、アイドル ドライバーは DDR をセルフ リフレッシュ モードに設定してから、wfi モードに切り替えて電力を節約します。理論的には、CPU をより遅いクロックに切り替えるように拡張することもできます。
あなたの他の質問のために。割り込みを無効にすると、CPU が割り込みハンドラーをトリガーするのを防ぐだけで、割り込みが発生したことを登録する必要があります。そうしないと、データが失われる可能性があります。したがって、ハンドラーは無効になりますが、着信割り込みは引き続き WFI のウェイクアップ機能をトリガーします。