및 캐시
당신이이 일을 위하여려고하는 경우에, 말하자면, C/C++ 및 이전 다음 제안 전역/정적 루프를 확인해야합니다 별도의 모니터 스레드를 사용 휘발성 변수. 컴파일러가 루프 변수에 대한 레지스터를 사용할지 결정하기를 원하지 않습니다. 어쨌든 일부 툴체인은 이러한 가정을합니다. 그러나 그것에 대해 명백한 해를 끼치 지 않습니다.
그리고 작은 문제가 있습니다. 별도의 모니터 스레드는 요즘 별도의 코어에서 끝날 것이며, 이는 두 개의 개별 캐시 서브 시스템이 그 값에 동의해야 함을 의미합니다. 그러면 루프의 런타임에 미치는 영향이 불가피합니다.
실제 실시간 제한?
그럼 어쨌든 실시간이 얼마나 반복적입니까? 타이밍 제약이 특정 CPU 클럭주기 내에서 실행되는 것에 의존하고있는 것은 아닌지 의심 스럽습니다.두 가지 이유는 다음과 같습니다. a) 현대 OS가 그걸 보증하는 데 거의 다가 서지 않을 것입니다. 베어 메탈에서 실행해야합니다. b) 요즘 대부분의 CPU는 요즘의 시계 속도를 등뒤로 다양하게합니다. 특정 실시간 간격에 대응하는 특정 클록주기 수.
기능이 풍부한 솔루션
그래서 실시간 요구 사항은 그 제약이없는 가정, 당신은 더 많은 능력 모니터 스레드를 수행 할 수 있습니다. 루프가 때때로 업데이트하는 세마포어로 공유 구조를 보호하고 모니터 스레드가 주기적으로 진행 상황을 검사하고보고합니다. 최상의 성능을 위해 모니터 스레드는 세마포어를 가져 와서 구조체를 복사하고 세마포어를 해제 한 다음 구조를 검사/인쇄하여 잠긴 세마포어 시간을 최소화합니다.
이전의 대답에서 제안 된 것보다이 접근법의 유일한 장점은 루프 변수의 값 이상을보고 할 수 있다는 것입니다. 루프 블록에서보고 할 정보가 더 많을 수도 있습니다.
리눅스에서 뮤텍스 세마포어가 꽤 빠릅니다. 루프 블록이 매우 가벼운 경우가 아니라면 특히 단일 루프 반복마다 공유 구조를 업데이트하는 경우 단일 뮤텍스의 런타임 오버 헤드가 현저하지 않을 수 있습니다. 알맞은 OS는 당신의 스레드를 별개의 코어에 놓을 것이지만, 좋은 형태를 위해서 모니터 스레드의 우선 순위를 루프를 실행하는 스레드보다 높게 만들 것입니다. 이렇게하면 두 스레드가 동일한 코어에서 끝나는 경우 실제로 모니터링이 수행됩니다.
"나는'나는 실시간으로 실행되고 있는지 배우고 싶다. ' 언제, 얼마나 자주 배우고 싶습니까? 어딘가에 표시하고 있습니까? –
정확도가 그렇게 중요하지 않으므로 문제없이 작동하는지 확인하고 종료 시점을 예상하고 싶습니다. –