크리에이티브 커먼즈 라이선스
Creative Commons License

이제 막바지입니다 ㅋㅋㅋ

지금 이야기할 주제는 리얼타임 커널이 자체적으로 가지고 있는 클럭틱 (Clock Tick) 에 관한 내용이에요 ㅋㅋ

클럭틱이란 정기적으로 일어나는 특별한 인터럽트 입니다. 이 정기적으로 일어나는 인터럽트가 리얼타일 OS 의 심장 박동이라고 할수 있지요 ㅋㅋ

이 인터럽트의 간격은 대부분의 커널이 프로그래머가 직접 조절 할 수 있도록 해놓습니다 ㅋ


보이시나요? ㅋㅋ

이것이 RTX_Kernel 이 제공하는 Config 창입니다 ㅋ

가운데 쪽에 보이시나요?? Timer tick Value[us] ㅋㅋㅋ

저는 10000 으로 현재 세팅을 했군요 ㅋㅋ

10ms 를 OS 한 틱으로 하겠다!!! 라고 설정한 것이랍니다 ㅋ

클럭틱 인터럽트는 커널로 하여금 클럭 틱 주기의 정수배 만큼 태스크를 지연시키고, 이벤트가 발생하기를 기다리는 태스크에게 타임아웃을 제공합니다 ㅋ

이 틱의 속도가 빠르면 빠를수록 CPU 에 더 많은 오버헤드가 걸리겠지요? ㅋㅋ

제가 사용하는 RTX Kernel 에서는 저 클럭틱을 이용한 딜레이 인터럽트를 제공하는 OS 제공 함수가

os_dly_wait(10) 이런식으로 쓴답니다 ~ ㅋㅋ

10틱 기다려라 라는 소리이지요 ~ ㅋㅋ

위와같이 세팅이 되어있다면, 태스크는 어플리케이션을 수행하다가 저 문장을 만나면 시피유의 점유권을 스케쥴러에게 양도하고 100ms 가 지난 후에 "I'm Ready" 이렇게 외치죠 ㅋㅋ

즉! 100ms 이후에 Ready List 에 들어가게 된다는 소리에요 ㅋㅋㅋ

하지만!!

여기가 중요합니다 ㅋㅋ 여기서 말하는 클럭틱의 시간이 진짜 타이머가 만들어내는 인터럽트처럼 완벽하게 정확하지가 않다는 것이지요~

예를 보시지요~


자 상위 우선순위 테스크와 ISR 이 1틱만큼 딜레이를 하려는 테스크보다 선행되어 실행되고 있습니다. 여기서 1틱을 20ms 로 설정했군요

이 태스크는 1틱만큼 딜레이를 시도하지만 우선순위 때문에 실제로는 불규칙적인 간격으로 실행되게 됩니다. 짧은 시간차이지만, 생각한대로 깔끔하게 제시간에 돌지는 못하는 군요???

이런 현상을 jitter 현상 라고 부른답니다.

그럼 우리는 이런 지터 현상을 어떻게 해결할수 있을까요? ㅋㅋㅋ

정답은 '돈' 입니다 ㅋㅋㅋ 비싸고 좋은 CPU 를 사용해서 작업을 더욱 빨르 끝내버려서 틱 인터럽트를 먹어버리는 현상을 줄여야하는 것이지요 ㅋㅋ

(1) MCU 의 클럭 속도를 높인다.
(2) 틱 인터럽트 사이의 시간을 늘린다.
(3) 태스크의 우선순위를 다시 지정한다.
(4) 플로팅 포인트 연산을 피하고 정수연산으로 변환한다.
(5) 코드 최적화를 수행한다.
(6) 시간이 중요한 코드는 어셈블리 언어로 프로그래밍한다.

정도의 해결방안을 줄수 있겠네요 ㅋㅋ

사실 OS 틱에 의존하여 매우 정확한 타이밍 마다 태스크를 돌게 하려는 발상은 발상 자체가 잘못된 것입니다.
다만 대부분 저정도의 수 밀리초 정도의 지터 현상이 전체 어플리케이션의 동작에 영향을 크게 미치지 않는 경우에 많이 사용하게 되지요 ㅋ

여러분이 사용하시는 윈도우즈 라는 OS 는 OS 틱이 1ms 입니다 ㅋㅋ

그래서 엄청 무거운 프로그램 돌리시거나, RAM Test 같은거 하거나 이렇때 윈도우 시계의 초침이 부자연스럽게 움직이는 경우를 경험해 보신적이 있으실거에요 ㅋㅋ

때에따라서 엄청 정확한 타이밍에 딱!!! 동작을 하게 만들어야하는 경우가 있습니다 ㅋㅋ

이때는 MCU 에 내장된 내장 타이머를 이용하여 Timer Overflow 를 이용해서 Interrupt 에서 처리를 하던지 혹은
이때 Interrupt 에서 해당 테스크로 이벤트를 날려주는 식으로 처리하시는 것이 올바른 방법이랍니다.

더욱 정확하게 확인을 하시기 위해서는 오실로스코프로 테스크 수행 틱을 정확하게 확인하면서 여러 방법을 시도하는 것이 좋지요 ㅋ

그럼 이번 강의는 여기서 줄이겠습니다.
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by J.Bear


티스토리 툴바