한명이 프로그램하는데 느려서 한명을 더 투입하면 왜 2배로 안빨라지고
게다가 더 느려질까? 에 대한 과학적 고찰에 대한 책입니다.
 

 
 
개발자 1명에서 2명으로 늘이는데 왜 더 잘안되지라고 고민하시는 분들은 필독해보세요.
개발 문화가 바탕이 되어야 원하시는 결과가 나옵니다.
 
반드시 읽어보시길. 
1975년도판이니 인류가 이 고민을 한지 43년이 흘렀습니다.
 
[맨먼스의 미신]
 

https://en.wikipedia.org/wiki/The_Mythical_Man-Month

안녕하세요.
 
기본적인 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 정의변수 하나만 수정하고 고객의 요구사항이 너무 힘들다고 투덜거립니다.
(아 이런 영업기밀인 천기 누설을 하다니...)

 

+ Recent posts