this는 객체지향 언어에서 class instance 자신을 나타냅니다. 자기 자신이기 때문에 별도의 이름을 갖는 다는 것도 좀 이상하기 때문에 this라는 키워드는 정말 잘 정한 것 같습니다. C언어 에서 this라는 것을 활용해서 사용해보도록 하겠습니다. 다음과 같은 main.c 코드가 있습니다. uart 드라이버 포인터를 얻어와 uart를 open하고 read, write, close하는 일을 절차적으로 진행하고 있습니다. /* main.c */ void main(void) { driver_t *uart = set_uart(); char value; uart->open(); uart->read(0, &value); uart->write(0, &value, 1); uart->close(); } 사용..
Java 같은 객체지향 언어에서 객체지향, 디자인패턴, Interface을 빼놓고는 설명할게 별로 없습니다. 이중 Interface는 객체지향의 근간이 되는 패턴으로 Interface를 이용해 언제든지 교체 가능한 모듈 형태의 프로그래밍과 더불어 외부 프로그램을 적절하게 통제 할 수 있습니다. 이러한 Interface의 필요성에 대해서는 따로 설명하지 않겠습니다. 우리는 C언어로 Interface를 만들어 보겠습니다. 이번에 만들 Interface는 UART입니다. UART는 MCU와 외부 Device간의 시리얼 통신으로 많이 사용됩니다. 예를 들면 MCU+GPS Module, MCU+RS232(PC)등에서 사용되며 Interface를 설명하기에 적합합니다. 아래 코드는 UART Interface의 원형..
자바의 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라는 ..
app 은 하나의 상태로 명명하기로 하였습니다. 예를 들자면 안드로이드 앱의 activity 처럼 시스템의 모든 이벤트를 받고 UI를 이루며 프로그램을 동작시키는 하나의 상태라고 이해하면 될 것 같습니다. Full src : https://github.com/soloungos/h7_state_machine 위의 예제에서 app states는 세가지의 상태를 가지고 있습니다. app_first.c : 시스템이 시작할 때 최초의 상태, 그 후 합계를 구하는 알고리즘을 계속적으로 수행하다 key 입력 이벤트를 받으면 app second로 스위칭 app_second.c : 평균을 구하는 알고리즘을 계속적으로 수행하다가 key 입력 이벤트를 받으면 app third로 스위칭 app_third.c : 하는 일 없이..
지난 포스트에서 app controller, app state들을 만들어 app의 역할 및 동작 방식에 대해 알아 보았습니다. 이번 포스팅에서는 main.c의 infinite loop에서 app initial 과 app의 loop등을 어떻게 호출하는지 확인해 보도록 하겠습니다. 아래 main.c의 일부분을 보도록 하겠습니다. int main(void) { ... /* USER CODE BEGIN 2 */ app_first_init(); app_second_init(); app_third_init(); app_start_app(APP_first); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { app_pro..
이번 포스트에서는 app state 중에 첫번째 first app을 만들도록 하겠습니다. 지난번에 말씀드린 대로 앞으로 만들어질 app states 들은 모두 app controller(app.c)에 등록되어 제어가 될 예정입니다. 그 중에 오늘은 첫번째 app이라서 의미가 있습니다. 사실 첫번째 app 만 이해한다면 두번째, 세번째는 비슷하기 때문에 별도의 설명이 필요없습니다. 지난 시간에 우리는 아래 코드 처럼 이미 세개의 app을 만들기 위해 app_id를 app.h에 미리 선언했었습니다. /* app.h */ typedef enum { APP_first, APP_second, APP_third, APP_COUNT, APP_NONE, }app_id_t; APP_first는 첫번째 app의 id가 되..
먼저 우리가 구현해야 할 app controller의 extern 함수들을 확인하겠습니다. extern int app_init_app(app_t *app); extern void app_process(void); extern int app_set_msg(msg_t msg, uint32_t param1, uint32_t param2); extern int app_start_app(app_id_t id); extern int app_switch_app(app_id_t id); extern app_t *app_get_current_app(void); 각각의 역할은 지난 포스트에서 기록한 대로입니다. app_init_app - app 등록 app_process - 현재 active app의 loop 실행, 메시..