私はRaspberry Pi 4(Debian Bullseye、カーネル5.10.92)用のソフトウェアPWMジェネレータを作成しました。これはマルチスレッドプログラムで、スレッドの1つはPWMジェネレータです。 PWMを正しく生成するには、中断することなく実行され、最大速度で一時停止する必要があります。
メモリは読み書き可能なように作成されます。これらのタスクのいくつかは他のスレッドと通信するアトミックタスクであり、いくつかはGPIO出力を切り替えるためにBroadcomチップのレジスタに直接書き込みます。
もちろん、問題であるスレッドが中断されて一時停止されることを除いて、うまく動作し、非常に高速です。
この問題を回避する方法は次のとおりです。
- スレッドの好みをCPU 3に設定します。トップで確認してください。
- 優先順位をSCHED_FIFO 99に設定します。トップで確認してください。
isolcpus=3
の実行コマンドにパラメータを追加します/boot/cmdline.txt
。
残念ながら、私のスレッドはまだ別の期間中に一時停止しています。時間測定によってこれを検出し、オシロスコープを使用してGPIOピンでこれを確認しました。
見ているカーネルパラメータ文書、isolcpusは廃止され、cpusetに置き換えられたと言われています。しかし、これについての詳細情報が見つからなかったので、迷子になりました。
スレッドが最高速度で実行され、カーネルによって一時停止されないようにするにはどうすればよいですか?
編集する:ソースコード