Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| cublocapp:an41002:index [2026/02/09 01:06] – admin | cublocapp:an41002:index [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== AN41002 - 타임루프 프로그래밍 기법 소개 ====== | ||
| - | 타임루프 프로그래밍 기법은 제가 아주 오래전부터 자주 이용해오던 프로그래밍 기법중 하나입니다. 아마 이미 알고 계신분도 있을겁니다. (타임루프 프로그래밍 기법이라는 이름은 제가 생각해낸 이름입니다.) | ||
| - | | ||
| - | 여러분이 일반적으로 C언어로 프로그래밍을 짜다보면, | ||
| - | |||
| - | <code c> | ||
| - | while (1) { | ||
| - | proc_rtn1(); | ||
| - | proc_rtn2(); | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | while(1) 문으로 이 루프를 감싸게되면, | ||
| - | |||
| - | 이 루프가 항상 일정한 시간간격으로 실행되게 하는것이 " | ||
| - | |||
| - | 바로 시간관리를 할 수 있다는 장점이 생기게 됩니다. | ||
| - | |||
| - | |||
| - | ---- | ||
| - | |||
| - | |||
| - | 설명을 위해 다음과 같은 프로그램을 작성해보도록 하겠습니다. | ||
| - | |||
| - | 포트0에 입력이 들어오면 포트10을 On하고, | ||
| - | 포트1에 입력이 들어오면 포트11을 On한다. | ||
| - | |||
| - | 아주 단순한 프로그램입니다. 아래처럼 작성해 보았습니다. | ||
| - | |||
| - | <code c> | ||
| - | |||
| - | #include " | ||
| - | int mainTm=0; | ||
| - | |||
| - | void processA(void); | ||
| - | void processB(void); | ||
| - | |||
| - | void cmain(void) | ||
| - | { | ||
| - | | ||
| - | |||
| - | | ||
| - | | ||
| - | | ||
| - | } | ||
| - | } | ||
| - | |||
| - | void processA(void) | ||
| - | { | ||
| - | if (portIn(0) == 1) | ||
| - | portOn(10); | ||
| - | else | ||
| - | portOff(10); | ||
| - | } | ||
| - | | ||
| - | void processB(void) | ||
| - | { | ||
| - | if (portIn(1) == 1) | ||
| - | portOn(11); | ||
| - | else | ||
| - | portOff(11); | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | 이 상황에서 아래 그림처럼, | ||
| - | | ||
| - | {{ : | ||
| - | |||
| - | 초보자라면 이런식으로 딜레이가 들어간 프로그램을 생각하셨겠죠? | ||
| - | |||
| - | portOn(10); | ||
| - | Delay(1000); | ||
| - | PortOff(10); | ||
| - | |||
| - | 이렇게 한다면 delay하는 1초동안 다른 입력을 못받게 됩니다. 그럼 어떻게 할까요? | ||
| - | |||
| - | ---- | ||
| - | |||
| - | 본격적으로 설명 드리기에 앞서, 모아콘에서 타이머 이벤트를 사용하는 방법부터 알아보겠습니다. | ||
| - | |||
| - | 모아콘에서 아래 프로그램을 실행시키면 0.1초마다 타이머 이벤트가 실행됩니다. | ||
| - | |||
| - | |||
| - | <code c> | ||
| - | #include " | ||
| - | int mainTm=0; | ||
| - | void cmain(void) | ||
| - | { | ||
| - | portInit(1, | ||
| - | startTimerEvent(100); | ||
| - | while(1) { // 무한루프 | ||
| - | } | ||
| - | } | ||
| - | | ||
| - | // 0.1초마다 이곳으로 옵니다. | ||
| - | void timerEvent(void) | ||
| - | { | ||
| - | mainTm++; | ||
| - | printf(" | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | 위 프로그램을 실행시키면 모아콘 스튜디오의 디버그창에 0.1초 마다 증가되는 숫자를 보실 수 있습니다. | ||
| - | |||
| - | |||
| - | ---- | ||
| - | |||
| - | |||
| - | 이제 " | ||
| - | |||
| - | 프로세스를 입력과 출력으로 나누고, processInput 에서는 입력이 들어오면 timerA 또는 timerB만 건드립니다. 출력프로세스인 processOutput에선 timerA, timerB가 0이 아닐 경우에만 해당 출력을 On시킵니다. | ||
| - | |||
| - | timerA, timerB는 0.1초마다 감소되는 타이머입니다. 0 이될때까지 감소시킵니다. | ||
| - | |||
| - | <code c> | ||
| - | |||
| - | #include " | ||
| - | int mainTm=0; | ||
| - | int timerA=0; | ||
| - | int timerB=0; | ||
| - | |||
| - | void cmain(void) | ||
| - | { | ||
| - | | ||
| - | | ||
| - | |||
| - | | ||
| - | } | ||
| - | |||
| - | void processInput(void) | ||
| - | { | ||
| - | if (portIn(0) == 1) timerA = 10; | ||
| - | if (portIn(1) == 1) timerB = 10; | ||
| - | } | ||
| - | | ||
| - | void processOutput(void) | ||
| - | { | ||
| - | if (timerA > 0) | ||
| - | portOn(10); | ||
| - | else | ||
| - | portOff(10); | ||
| - | | ||
| - | if (timerB > 0) | ||
| - | portOn(11); | ||
| - | else | ||
| - | portOff(11); | ||
| - | } | ||
| - | |||
| - | void timer(void) | ||
| - | { | ||
| - | | ||
| - | if (timerA > 0) timerA--; | ||
| - | if (timerB > 0) timerB--; | ||
| - | } | ||
| - | | ||
| - | // 0.1초마다 이곳으로 옵니다. | ||
| - | |||
| - | void timerEvent(void) | ||
| - | { | ||
| - | | ||
| - | | ||
| - | | ||
| - | } | ||
| - | |||
| - | </ | ||
| - | |||
| - | 이렇게하면, | ||
| - | |||
| - | 공장자동화 분야에서 입력조건이 잠깐 살아도, 어느정도 출력을 유지해주어야 하는일은 매우 빈번하게 나오는 상황입니다. 이 골격을 유지하면서, | ||
| - | |||
| - | 저는 지금도 상당수의 프로그램을 이 기법으로 짜고 있습니다. 이 기법의 장점은 노이즈에도 강한 프로그램이 된다는 것입니다. 모든 입력조건을 0.1초마다 반복적으로 검사를하고 처리를 하니까, 노이즈가 잠깐들어와서 잘못된 출력결과가 나온다 하더라도, | ||
| - | |||
| - | " | ||
| - | |||
| - | 1. 함수의 처리시간이 기준시간을 초과해선 안됩니다. 0.1초안에 모든처리가 끝나야합니다. | ||
| - | |||
| - | 2. 함수내부에서 프로세싱을 잡아두면 안됩니다. | ||
| - | |||
| - | 이게 무슨 말이냐면, | ||
| - | |||
| - | |||
| - | [[moacon: | ||
| - | |||
| - | |||
