커널이 스레드를 일시 중지하는 것을 어떻게 중지합니까?

커널이 스레드를 일시 중지하는 것을 어떻게 중지합니까?

저는 Raspberry Pi 4(Debian Bullseye, 커널 5.10.92)용 소프트웨어 PWM 생성기를 작성했습니다. 이는 다중 스레드 프로그램이며 스레드 중 하나는 PWM 생성기입니다. PWM을 올바르게 생성하려면 중단 없이 실행되고 최대 속도로 일시 중지되어야 합니다.

메모리는 읽기/쓰기만 가능하도록 작성됩니다. 이러한 작업 중 일부는 다른 스레드와 통신하는 원자적 작업이고, 일부는 GPIO 출력을 전환하기 위해 Broadcom 칩의 레지스터에 직접 기록합니다.

물론 문제인 스레드가 중단되고 일시 중지된다는 점을 제외하면 잘 작동하고 매우 빠릅니다.

이 문제를 피하는 방법은 다음과 같습니다.

  1. 스레드 선호도를 CPU 3으로 설정합니다. 상단으로 확인하세요.
  2. 우선순위를 SCHED_FIFO 99로 설정합니다. 상단으로 확인하세요.
  3. isolcpus=3의 실행 명령에 매개변수를 추가합니다 /boot/cmdline.txt.

불행하게도 내 스레드는 여전히 다른 기간 동안 일시 중지되었습니다. 시간 측정을 통해 이를 감지하고 오실로스코프를 사용하여 GPIO 핀에서 이를 확인했습니다.

보고 있다커널 매개변수 문서, isolcpus는 더 이상 사용되지 않으며 cpuset으로 대체되었다고 합니다. 하지만 이에 대한 더 많은 정보를 찾을 수 없기 때문에 길을 잃었습니다.

스레드가 최고 속도로 실행되고 더 이상 커널에 의해 일시 중지되지 않게 하려면 어떻게 해야 합니까?

편집하다:소스 코드

관련 정보