자료구조를 다룰때 많이 사용되는 Iterator 패턴을 살펴보도록 하겠습니다. 보시다시피 8bit 자료형을 취급하는 iterator입니다. setup_iterator은 커스텀되어있는 자료형과 연결하는 함수입니다. 즉, 사용자가 만든 자료형과 인터페이스와 연결하는 부분입니다. /* iterator.h */typedef struct{ void (*init)(void); bool (*set_value)(uint8_t value); bool (*get_first_value)(uint8_t re_value); bool (*get_next_value)(uint8_t re_value); bool (*has_next)(void); uint8_t *(*get_current_buffer)(void);}iterator_t;..
이번장에서는 프로그램 전체적으로 한개의 자원을 사용하는 경우 적용할 수 있는 디자인 패턴 Singleton 패턴에 대해 알아보겠습니다. 예를 들면 GPS, G sensor, 온도센서와 같은 모듈은 보통 한개의 제품에 한개씩 들어있습니다. 각각의 모듈을 초기화하고 사용하는 C 언어 Class를 만든다면 다음과 같이 Singleton을 활용할 수 있습니다. #define null (void *)0 typedef struct { init_function_t init; open_function_t open; connect_function_t connection; //... (필요시 추가) }device_t; device_t *get_gps_instance() { static device_t *instance =..
Observer 패턴은 정말 많이 사용하는 디자인 패턴입니다. 자바 프레임워크에서도 쉽게 찾아 볼 수 있는데 흔히 Java C#에서 사용되는 Event Listener 들이 이 종류에 속합니다. 이번 장에서 만들 Observer pattern 예제에는 아래의 요소가 필요합니다. observer_t : 관찰자 구조체 calculate_temperature : 온도 측정 실행함수 display_degree_handler : 화면에 측정된 온도를 표시하는 함수 file_write_degree_handler : 파일에 측정된 온도를 기록하는 함수 우선 헤더를 보겠습니다. /* header.h */ typedef void (*observer_handler_t)(uint32_t degree, uint32_t par..
Strategy 패턴은 아주 단순하며 디자인 패턴 중에 가장 유용한 패턴입니다. 사용법은 아주 간단하며 interface를 만들고 원하는 곳에서 Concrete 코드를 치환해서 사용하면 됩니다. 적절한 예제일지는 모르지만, 특정한 상황에서 uart를 spi로 변경하는 드라이버 예제를 보도록 하겠습니다. 먼저 interface를 구현해보도록 하겠습니다. /* driver.h */ typedef struct { bool (*open)(void); bool (*close)(void); bool (*read)(uint32_t addr, uint8_t *value); bool (*write)(uint32_t addr, uint8_t *value, uint32_t len); }driver_t; open, clo..
RTOS를 사용하지 않는 베어메탈 Firmware에서는 각각의 기능 프로세스의 처리 시간을 적당히 잘 분배 해야 합니다. 처리 시간이 긴 프로세스는 여러개로 쪼개야 하며, 특히 인터럽트 발생시 인터럽트 인터럽트 루틴에 긴 처리시간을 요구하는(지연이 발생하는)코드를 넣으면 절대 안됩니다. 더욱이 애매한 처리 시간을 요구하는 코드를 넣는 경우는 더욱 위험합니다. 왜냐하면 불규칙적으로 에러를 발생되며 디버깅을 위해 많은 시간이 소요될 수도 있습니다. 인터럽트 서비스 루틴에서는 입력된 데이터를 적당한 자료구조에 적재해놓던가, 특정 플래그를 set하는 수준 혹은 메시지 큐에 쌓는 수준의 처리가 가장 좋습니다. 만약 전체 시스템이 1초단위로 어떠한 처리가 끝나야 한다면, 각각의 프로세스들이 최대 처리되는 시간의 합..
http://terms.naver.com/entry.nhn?docId=3532979 디자인 패턴중에 매우 사용도가 높고 매우 효율적인 State 패턴은 공부를 하다보면 좀 헷갈리는 디자인 패턴입니다. 대부분의 패턴은 if 문과 같이, 유지보수나 버그를 양산하기 쉬운 코드를 없애고 쉬운 확장을 목적으로 구조를 만듭니다. State 패턴은 각 상태가 바뀔 때 마다 늘어나는 if문을 없애는 패턴입니다. 즉, 상태들 끼리 서로의 상태를 바꿔가며 동작하기 때문에 유지보수도 쉽고 확장도 용이합니다. 그러나 상태변화에 대한 명확한 이해와 구조를 어떻게 할지에 대한 고민이 필요합니다. 다소 생소하고 복잡하게 보일지 모르지만 한번 구현해 보도록 하겠습니다. 예제는 단순한 Light를 On/Off하는 기능을 State 패..
자바의 Class와 C의 typedef는 많이 비슷해보입니다. 그러나 실제로 좀 차이가 있습니다. 자바 Class는 생산성과 효율성을 높이기 위해, 궁극적으로 객체지향을 목표로 만든 것이기 때문에 typedef보다 훨씬 사용하기 편리합니다. 가장 큰 차이점은 동적인 할당과 해제를 JVM에서 자동으로 해준다는 것이지요. 자바에서는 궁극적으로 Class를 통해 instance를 만들어 냅니다. 자바에서 다음 구문 Class class = new Class(); 는 무엇을 의미할까요? 이것은 class라는 이름의 메모리를 확보한 후 포인터를 넘겨준것과 같은 효과를 냅니다. new와 동시에 memory allocation이 발생한 것입니다. 메모리를 확보했으니 사용 후 반환을 해야 하는데, 자바는 가비지 콜렉션..
C언어에서 typedef 는 새로운 타입(type)을 만드는 키워드입니다. 예를 들어 bool 타입은 true, false를 가지고 있는 기본적인 타입인데, C언어에는 없습니다. typedef를 통해 아래와 같이 간단하게 bool타입을 만들 수 있습니다. typedef enum { false = 0, true = 1 }bool; 그리고 아래와 같이 코딩 할 수 있습니다. bool isRegistered = false; if(isRegistered == true) { printf("It is registered!"); } 좀 더 활용해 보겠습니다. typedef struct { uint8_t D0; uint8_t D1; uint8_t D2; uint8_t D3; }digit_t; 새로운 digit_t라는 ..