sched_rt_period_us를 사용하여 작업 호출 사이의 최대 시간을 10ms 수준으로 설정하세요.

sched_rt_period_us를 사용하여 작업 호출 사이의 최대 시간을 10ms 수준으로 설정하세요.

나는 이를 알고 sched_rt_period_us있으며 sched_rt_runtime_usRT 작업이 손에 잡히지 않을 경우 시스템이 멈추는 것을 방지하기 위한 것입니다. 하지만 sched_rt_period_us작업이 원활하게 실행되도록 하려면 더 작은 값을 사용할 수 있는지 궁금합니다 .

호출당 CPU 시간이 1밀리초 정도만 소요되는 간단한 작업이 있습니다. 예를 들어 GPIO 핀을 통해 스테퍼 모터를 구동하는 것입니다. 하지만 저는 초당 100사이클 이상을 지속적으로 달성하고 싶습니다. 이는 선점 및 스케줄러 오버헤드를 제외한 CPU 시간의 10%를 넘지 않습니다.

"sched_rt_ period_us의 값이 너무 작으면 시스템이 불안정해질 수 있다"는 글을 읽었습니다.1그러나 "매우 작은 값"을 구성하는 크기의 순서는 설명하지 않습니다. sched_rt_period_us10000으로 설정하고 sched_yield()제때에 제어( )를 반환하면 프로그램 호출 사이의 지연이 0.01초를 넘지 않는다고 믿을 수 있습니까?

기본 CPU는 아마도 850MHz ARM이고 위의 컨트롤 외에 다른 많은 작업이 있지만 그 중 어느 것도 실시간이 아니며 "응답성"을 느낄 필요도 없으며 여전히 기본값과 동일하지 않으며 sched_rt_period_us( sched_rt_runtime_us1의 95%) 둘째) RT 작업이 한 번에 0.05초 동안 절전 모드로 전환되도록 허용할 수 없습니다.

답변1

이것은 오래된 질문입니다. 시도해 보겠습니다. 내가 이해한 바에 따르면, 귀하는 교착 방지 메커니즘(이것) RT 프로세스로 인한 정상적인 프로세스 기아를 방지합니다.

당신이 그렇게 말했어요

호출당 CPU 시간이 1밀리초 정도만 소요되는 간단한 작업이 있습니다.

하나인가요?짧은 주기 작업아니면 외부 입력에 의해 시작된 짧은 작업인가요?

첫 번째 경우(단기 작업): 리눅스에서 꼭 알아야 할 것커널 3.14사용 가능SCHED_DEADLINE수업. 이를 통해 정기적으로 최소한 이 정도의 CPU 시간을 갖도록 프로세스에 대한 스케줄링 정책을 설정할 수 있습니다. 그것을 봐문서SCHED_DEADLINE, 섹션에서 이해하기 쉬운 다이어그램을 찾을 수도 있습니다.남자 7 배치. 트리거가 외부(무작위, 비주기적)인 경우에는 솔루션이 아닐 수 있습니다.

두 번째 경우(짧은 산발적 작업): 프로그램이 필요할 때마다 작업의 작은 부분만 수행한다고 주장할 수 있다면 우선순위 사용을 중지하고 호출을 수행할 수 있습니다.sched_yield작업이 완료되면. 풀링으로 바쁜 경우 이는 ba 접근 방식입니다. 정말로 우선순위가 필요하다면 보충할 수도 있습니다., RT 프로세스가 절전 모드인 동안 비RT 프로세스가 실행됩니다. 인터럽트에 의해 트리거되는 경우 다음을 사용해야 한다는 것도 알 수 있습니다.하부, 더 어려운 방법입니다.

그 외에도 더 많은 것이 있습니다. 실제 프로세스보다 더 많은 라이브 프로세스가 있을 수 있다는 점을 기억해야 합니다. 예를 들어,커널 스레드.

답변2

이 문제와 관련된 내용은 많지 않지만 이 스레드를 찾았습니다. 2009년 버전이고 2.6.X 리눅스 커널에 관한 내용인데 적절해 보입니다.

이번 주제의 제목은,주제: sched-rt 그룹 할당 제한에 대한 질문: sched_rt_runtime_us - msg#01766.

발췌

나는 작은 테스트 프로그램을 작성했습니다.

(a) 두 개의 스레드(SCHED_FIFO 하나와 SCHED_OTHER 하나)를 포크하고(스레드는 -20에 재할당됨) 둘 다 특정 코어에 바인딩합니다.

(b) SCHED_FIFO 스레드가 종료될 때까지 긴밀한 루프에서 두 스레드를 실행합니다(두 스레드 모두 동일한 반복 횟수를 가짐).

(c) SCHED_FIFO 스레드의 고정된 반복 횟수를 기반으로 일반 SCHED_OTHER 스레드의 완료된 반복 횟수를 계산합니다. 그런 다음 이를 기반으로 백분율을 계산합니다.

위의 워크로드를 다양한 sched_rt_runtime_us 값(200ms~700ms)으로 실행하고 sched_rt_기간_us를 1000ms로 일정하게 유지했습니다. 또한 눈에 띄는 동작 변화 없이 sched_rt_기간_us 값을 줄여(따라서 일정 세분성을 높임) 몇 가지 실험을 실행했습니다.

내 관찰 내용은 표 형식으로 나열되어 있습니다.

reg 스레드가 완료된 반복 횟수 / sched_rt_runtime_us / RT 스레드 반복 횟수 비율(%) sched_rt_runtime_us

  • 0.2 100%(일반 스레드가 모든 반복을 완료함)
  • 0.3 73%
  • 0.4 45%
  • 0.5 17%
  • 0.6 0%(SCHED_OTHER 스레드가 완전히 조절되었습니다. 실행되지 않았습니다.)
  • 0.7 0%

관련 정보