C언어에서 아주 중요한 static의 활용을 알아 보도록 하겠습니다. 여러 사람이 함께 작업하는 프로젝트에서는 static을 적절히 사용해야 합니다. static 으로 선언만하고 사용하지 않는 함수나, 변수를 컴파일러에서 warning해주기 때문에 아주 유용합니다. 여러분들도 아시겠지만 컴파일러에서 error를 발생하면 타킷 보드에 프로그램을 로딩할 수가 없습니다. 그러나 warning이 발생하도라도 로딩이 가능하기 때문에 무시하는 경우가 많은데, 이는 런타임시에 에러를 발생 할 수 있으므로 warning도 반드시 없애주는 것이 좋습니다. static은 여러개의 파일내에 해당 파일내의 scope로 동일한 이름의 함수를 각 파일별로 만들 수 있게 해줍니다. 예를 들어 보겠습니다. 여러개의 .c 파일을 만들..
디자인 패턴은 문법이 아니며 방법입니다. 하나의 패턴으로 프로그램 전체를 완성시킬 수는 없습니다. 그리고 완벽하게 룰을 지키는 것보다 유연하게 상황에 따라 여러 패턴들을 조금씩 응용해서 사용할 뿐입니다. 개인적으로 너무 복잡한 패턴을 굳이 사용할 필요가 없습니다. 오히려 유지보수 혹은 한 프로젝트에 다수의 개발자가 협업할 경우 코드를 이해하지 못하는 경우가 발생할 수 있습니다. 게다가 인수인계시에는 왜 이런 패턴을 구현했는지 잘 설명해줘야 합니다. 그렇지 않으며 좋은 구조로 잘 설계된 프로그램이 타인에 의해 조금씩 붕괴되는 광경을 목격할 수도 있습니다. 보통 알고리즘을 구현할 때 복잡한 절차가 있게 마련입니다. 대부분 메모리 할당이라든가, callback 할당, 이벤트 처리 등으로 복잡해지기 쉽습니다. ..
우리가 아주 끔찍하게 싫어하는 Hardfault를 임의로 만들어 보겠습니다. 아래 코드를 넣으면 PC가 수행할 수 없는 주소로 변경되면서 Hardfault로 Jump 하게됩니다. typedef void (*Function_Pointer)(void); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER..
이번 포스팅에서는 각각의 구현은 다르지만 기능은 같은 객체들을 관리하는 Builder 패턴에 대해 알아보겠습니다. 간단하게 예를 들면 사용자측 코드 즉, main 함수에서는 객체를 만들 뿐 기능을 사용하기 위해 기능 함수를 직접 호출하지 않고 관리자를 통해서만 일 처리를 합니다. Key(버튼) 처리하는 예제로 Builder 패턴을 상세히 들여다 보겠습니다. Key를 입력받아 처리하는 식의 기능은 firmware에서는 참 많이 쓰입니다. Key 처리 기능은 하드웨어적으로 참 많이 바뀝니다. 예를 들어 단순 1:1 GPIO를 사용할 수도 있고 ADC를 사용할수도 있으며 혹은 1:N 매트릭스 GPIO를 사용할 수도 있습니다. 아니면 세가지 다 사용할 수도 있겠지요. 주의할 점은 어떠한 하드웨어 Ke..
남이 작성한 코드를 내 코드에 적용해야 할 때가 아주 많습니다. 그러나 대부분 크기가 다른 볼트와 너트처럼 딱 맞아 떨어지지 않습니다. 이럴 땐 어떻게 해야 할까요? 중간에 양 쪽에 잘 맞는 나사를 하나 덧 대는 것으로 해결 할 수 있습니다. Adapter 패턴은 흔히 레거시 코드(Legacy Code)라고 불리는 예전에 작성된 코드들을 현재의 코드와 맞게 고치는 방법입니다. 다른 사람이 작성한 코드를 자신의 코드에 맞게 고쳐쓰는 방법으로도 좋습니다. 우리는 중간에 Adapter라는 Wrapper 함수를 만들어 Adapter패턴을 구현할 것입니다. 이번 예제에서는 display라는 콘크리트 코드를 driver라는 interface와 호환이 되도록 만들어 보겠습니다. 우선 display 콘크리트 코드부터 ..
예제1) http://dextto.tistory.com/140 예제2) http://kingoh.tistory.com/entry/Factory-Method-%ED%8C%A8%ED%84%B4 우선 위의 두가지 예제를 통해 Java에선 어떻게 Factory method를 구현했는지 보고 오시면 더 좋을 거 같습니다. C언어에선 class라는 개념이 없기 때문에 어떻게 보면 이전 글들에서도 알게 모르게 계속해서 Factory method를 써왔습니다. 이번엔 다시 한번 Factory method를 살펴 보도록 하겠습니다. 이번 예제는 display를 구현해 보도록 하겠습니다. MCU 기반 Firmware에선 display하기 위한 데이터는 프레임 버퍼라 불리우는 메모리에 RGB color를 쌓아 놓고 한번에 ..
오늘 포스팅할 내용은 소프트웨어 Timer입니다. 소프트웨어 Timer는 MCU의 페리페럴 중 하나인 하드웨어 타이머와 다르며 오히려 PC 소프트웨어의 Timer에 가깝습니다. 구현하고자하는 소프웨어 Timer는 설정한 주기가 되면 자동으로 등록한 Callback 함수를 실행시켜 줍니다. 소프트웨어 Timer이기 때문에 Tick을 증가시켜줄 MCU의 하드웨어 Timer가 하나 필요합니다. 먼저 자주 사용하는 주기를 파악 합니다. 최소단위를 10ms으로 정하고 10ms 주기의 하드웨어 Timer를 하나 만들어 인터럽트에서 소프트웨어 Timer의 Tick을 증가시켜 줍니다. 먼저 헤더파일로 전체 윤곽을 만듭니다. Timer 핸들러의 typedef도 선언되어 있습니다. #ifndef SRC_TIMER_H_ #..
Template method(템플릿 메소드) 디자인 패턴도 매우 유용한 패턴입니다. 기능은 같으나 구현방법이 다른 메소드들의 구조를 제시하고 기능과 구현방법이 같은 메소드는 대표로 하나만 제시되는 방법입니다. 예를 들어 도형을 그리는 것을 생각해보도록 하겠습니다. 도형에는 삼각형, 사각형, 원 등이 있습니다. 넓이와 높이(원의 경우 지름)을 통해 도형을 설정하는 것은 모두 똑같습니다. 그러나 구체적으로 모양은 다 다릅니다. 도형을 그릴 때 메모리라는 사상위에 비트를 역상시켜 해당 도형을 그리는 방법을 사용하는데 이는 어느 도형이나 이미지를 그리든 동일합니다. 따라서 도형의 모양을 만드는 기능은 개별 구현이 가능하도록 추상 메소드로 하고 그리는 부분은 모두 같으므로 하나만 구현하면 됩니다. 설명이 약간 어..