안녕하세요.
 
기본적인 Task 함수 구성법에 대하서
제가 사용하는 방법을 공유합니다.
 
많이들 사용하는 방법이라 새로울 것 없지만 모르시는 분들은 많은 도움이 되실겁니다.
 
LED를 500ms 로 껏다 켰다로 프로젝트를 많이 시작하시는데 다들 뻔하게 짭니다.
예제로 책에 그렇게 나와 있거든요.
 
[뉴비들]
while(1) {
led_on();
delay(500);
led_off();
delay(500);
}
 
근데 거기에서 하나만 더 들어가도 복잡해지면 코드가 산으로 가기 시작하죠.
여기서 부터는 책에 안나오죠.
 
처음 구조가 무서운게 책에 예제를 보고 짜기만 하면 , 그 다음 구현은 계속 그 구조에 얽매여 구현이 됩니다.
 
LED1 를 500ms 로 껏다 켯다 LED2는 250 ms 로 껏다켯다하기.
 
[뉴비들]
while(1) {
led1_on();
led2_on();
delay(250);
led2_off();
delay(250);
led1_off();
led2_on();
delay(250);
led2_off();
delay(250);
}
 
외부에서 보기에는 동작은 똑바로 합니다.
하지만 구현해야할 현실문제는 이거보다 수백배 복잡하죠.
 
LED1 를 500ms 로 껏다 켯다 LED2는 300 ms 로 껏다켯다하기
이거는 위와 같은 방식으로 구현은 되지만 정말 이상한 코드가 생성이 됩니다.
메인은 계속 복잡해지죠.
 
그럼 어쩌라고. 다 방법이 있습니다.
 
1. 문제를 단순화하자.
  1)  LED1 은 500ms 간격 on off /  LED2 은 300ms 간격 on off
  2)  LED1,2 은 초기 끄고 100ms 마다 확인한 뒤 특정 조건시 특정 LED off 도달
 
2. 기능을 함수 단위로 분리하자.
   1) 100ms 딜레이 
   2) LED1 on,off
   3) LED2 on,off
  
3. task 상태를 정의하자. 어짜피 외부 표출은 4가지 이다. 이 상태를 define 으로 정한다.
   1) led 모두 off
   2) led1 on , led2 off
   3) led2 on , led1 off
   4) led1 off , led2 off
 
 
복잡하고 필요없다고 생각할 수 있는 부분이 많으나, 수정이 편합니다.
시간 간격을 바꾸려면 define 문만 바꾸면 됩니다.
 
세세한 오류보다는 전체적인 구조 및 흐름을 이해해보려고 하세요.
그냥 머리속에서 나오늘 걸 짜다보니 별로 구조가 좋지는 못하는데
더 잘짜려면 임의의 LED 개수 대응까지 포함하면 될거 같습니다.
 
부족하지만 그래도 도움은 되실 겁니다.
그냥 영감만 얻으시길.
 
참고)
아래코드는 상상코딩으로 컴파일 여부는 장담못합니다.
깊게 생각 안하고 짠 코드라 그대로 적용 여부는 권장하지 않습니다.
단순 이해용입니다. 제대로 돌아갈런가 모르겠네요.
 
[아재들]
그냥 종이에 한번 끄적여 보고.

 

일단 main 부터 먼저 구현합니다.

아재들은 main 난잡한 걸 매우 싫어합니다.
 

 

TASK 상태를 정의

오타) #define TASK_LED_WAITING     4

 

초기화 함수도 만들어 주고

 

메인 TASK 를 구성합니다.

보시면 위에서 그림을 그린 5개의 TASK 가 state 변수를 보고 
해당 상태로 진입하도록 되어 있습니다.
각 case 문이 하나의 event 상태를 나타냅니다.

 

 

 

자 자그럼 아래 코드는 어떻게 구조를 잡아서 시작해야 될까요.

 
[뉴비들]
while(1) {
led_on();
delay(500);
led_off();
delay(500);
}
 
[아재들]
아니 이렇게 쉬운 예제 코드를 왜 이렇게 복잡하고 어렵께 짜지?
라고 생각할 수 있겠습니다만, 문제가 복잡해질 수록 이게 더 쉬워집니다.
 
산전수전 다 겪은 아재들은 고객이 다음에 분명 LED 를 더 복잡하게 킬 것을 요구를 예상하기 때문이죠.
예상을 잘 하고 다음 요구가 들어오면 며칠 헤메는 척 하다가
#define 정의변수 하나만 수정하고 고객의 요구사항이 너무 힘들다고 투덜거립니다.
(아 이런 영업기밀인 천기 누설을 하다니...)

 

저희 회사 신입사원 책상에 붙여놓은 겁니다.
10년동안 절대 떼지 말라고 했습니다. 노력하면 7년 뒤에 이룰 수도 있지만 어려울거라 이야기했습니다.
 
그때 잠시 끄적여서 준거라 지금보니 많이 부족하네요. 반도 못적은 거 같은데
더 쓰면 미리 좌절할거 같아요.
 
내가 어디쯤에 있는지 궁금할 때 쯤 쳐다보라고 했죠.
요즘은 네비가 남은 시간을 알려주는데 개발자라는 먼길을 가는데 대략이라도 알아야 되지 않겠습니까?
 
포기할 사람은 빨리 포기하고 
멀리 갈 사람은 꾸준히 한번쯤 하늘을 쳐다보며 앞으로 나아가야죠.
 
아무것도 모르는 신입은 절대적인 건 아니지만 도움이 되실겁니다. 
이제 시작하시는 분들은 참고하세요. 
 

+ Recent posts