GTK+ Hello World :: 2008/11/10 22:00   by 이슬희(17기)


안녕하세요. 한주동안 잘지내셨는지요?^ ^;
오늘은 Hello World를 출력하는(?) 화면을 만들어 볼 생각입니다. ^ ^

모든 Programming 언어의 책의 첫장을 보면 화면에 Hello World를 띄우는 것부터 연습를 하죠? ^ ^; 그래서 저도 오늘은 Hello World를 화면에 보여주려고 합니다. 가장 기초적인 부분부터 뼈대를 만들어 가볼까요? ㅋㅋㅋ

이번에는 Source를 분석할때는 시그널(이벤트) 함수와 시그널 핸들러 함수에 대해서 집중적으로 설명해 볼까 합니다.

1. Hello World를 들어가기에 앞서..

이번에는 여태까지 내용과는 달리 중요한 부분이 몇가지 나오는 것 같아요. 중요한 부분이라면, gtk프로그래밍에서 interface를 다루는 부분이죠. interface란 사용자와 컴퓨터(or 윈도우) 사이의 관계를 말하며, 사용자가 요구하는 대로 반응하는 환경을 구현하는 것이 interface 프로그래밍이라고 합니다.

어떤 식으로 Hello World를 출력해 볼까요? 일단, 버튼과 label을 하나 만들어 볼까해요~ 버튼을 누르면 label의 내용이 "Hello World Open"으로 바뀌었다가 다시 한번 더 누르면 "Hello World Closed"로 바꾸도록 만들어 보겠습니다. 그럼 여기서도 알 수 있듯이 오늘은 버튼을 누름에 따라 변화를 구현하는부분이 핵심이라는 것을 알 수 있죠?

2. Hello World


--------------------------------------------------------------------------------

#include <gtk/gtk.h>

GtkWidget *label;

void button_clicked ( gtkwidget *widget, gpointer data)
{

          static int toggle = 1;

          if (toggle == 1)
          {
                    gtk_label_set_text ( gtk_label(label) , "hello world opened");
                    toggle = 0;
          }
          else
          {
                    gtk_label_set_text ( gtk_label(label) , "hello world closed");
                    toggle = 1;
          }
}

void delete_event ( gtkwidget *widget, gdkevent *event, gpointer data)
{
          gtk_main_quit ();
}

int main( int argc,char *argv[] )
{
          gtkwidget *window, *button;
          gtkwidget *vbox;
          gtk_init (&argc, &argv);
          window = gtk_window_new (gtk_window_toplevel);
          gtk_window_set_title(gtk_window (window), "upgrade hello world");

          gtk_signal_connect ( gtk_object(window), "delete_event",
          gtk_signal_func ( delete_event), null);
          gtk_container_set_border_width ( gtk_container ( window), 10 );
          vbox = gtk_vbox_new ( false,0);
          gtk_container_add ( gtk_container ( window ), vbox);

          label = gtk_label_new ("hello world closed");

          gtk_box_pack_start (gtk_box(vbox), label, true, true, 0);
          gtk_widget_show ( label);

          button = gtk_button_new_with_label ("Click");

          gtk_signal_connect ( gtk_object (button), "clicked");
          gtk_signal_func ( button_clicked ), null);
          gtk_box_pack_start (gtk_box(vbox), button, true, true, 0);
          gtk_widget_show (button);
          gtk_widget_show (vbox);
          gtk_widget_show (window);

          gtk_main ();
          return(0);
}


--------------------------------------------------------------------------------

3. Hello World Source 설명

main()을 보면 보지못했던 새로운 함수들이 보이죠?

                    gtk_window_set_title();
                    gtk_signal_connect();
                    gtk_container_set_border_width();
                    gtk_vbox_new();
                    gtk_button_new_with_label();
                    gtk_box_pack_start();

gtk_window_set_title();
위의 함수는 메인 윈도우의 제목을 정해 주는 부분입니다. title!! 이 글자만 봐도 대충 감이 잡히죠? ^ ^;

gtk_container_set_border_width();
이 함수는 window 의 border 의 크기를 정의합니다.

gtk_vbox_new();
gtk에서 윈도우 안의 여러가지 위젯들을 배열하기 위해서 box라는 위젯을 많이 씁니다. gtk는 window 안에 window를 삽입 할 수 가 없어서 이러한 도구를 앞으로도 많이 사용할 것입니다. table과 frame이 주로 사용되는 도구들 중의 하나이죠 ^ ^
box는 실제로 보여지는 위젯은 아니지만 다른 widget들을 배열하기 위해 사용하지요. box인데 vbox라고 사용한 것에 대해 의심이 가지 않아요? box는 두가지 종류가 있습니다. vbox와 hbox가 사용됩니다. 이것은 수직박스와 수평박스를 나타내지요. 물론 gtk_*_new()으로 정의할 수 있습니다. hbox와 vbox의 조합으로 위젯의 위치를 정해서 좀더 직관화된 인터페이스를 만들 수 있죠.
위의 "Hello World" source는 vbox를 정의하고 그곳에 레이블과 버튼을 올려놓습니다(packing). packing이라는 말은 widget들을 쌓아 넣는다고 보면됩니다. 예를들어 커다란 여행 가방에 여러가지 물품들을 차곡차곡 정리해야 한다면 vbox로 나눈뒤 수직 방향의 박스에 차곡차곡 widget을 넣어서 보기좋게 정돈되는 과정이라고 생각하시면 되죠 ^ ^ 머리속으로 그림을 그리면 좀더 쉽게 이해가 되실 겁니다.

gtk_button_new_with_label();
button을 정의하는데 label을 넣고 싶을 때 쓰는 함수입니다. 버튼에는 일반적으로 label이 보여서 사용자에게 어떤 역할을 하는지 알려주는 역할을 하죠. 

gtk_box_pack_start();
gtk_container_add와 비슷한데.(기억나시죠? container에 무언가 추가하는^ ^;) 여기서는 박스에 쌓기(packing) 위해서 위 함수를 쓴다. gtk_box_pack_start()는 hbox 위젯의 왼쪽에서 오른쪽, vbox부분에서는 위쪽에서 아래쪽의 순으로 쌓는다는 의미이며, 반대 역할을 하는 gtk_box_pack_end()함수도 있습니다. 뒤에 붙는 인자들은 expand, fill할 것인가에 대한 선택이며, 마지막이 padding의 크기를 정의합니다.

이제부터.. 가장 중요한 부분을 설명해 보겠습니다. 제가 처음에 말씀드렸죠. 오늘은 가~장 중요한 무언가가 나올것이라구요.
이제 나타날 때가 되었습니다. 짜~~~잔!!!^ ^*

gtk_signal_connect(   gtkobject *object,
                                gchar *name,
                                gtksignalfunc func,
                                gpointer func_data
                             );

위 함수는 interface , 즉 사용자가 뭔가를 행하였을(signal) 때 반응 하는 함수에 대해서 연결 (connect ) 시켜주는 역할을 합니다.


위의 예제(Hello World)중에서..
gtk_signal_connect ( gtk_object (button),
                                 "clicked",
                                 gtk_signal_func ( button_clicked ),
                                 null);

예로 들자면, 사용자가 button이라는 위젯을 눌렀(click)을 경우 'clicked' 라는 이벤트가 발생하며, button_clicked라는 함수를 불러 실행하라는 의미가 됩니다. 실제 button_clicked는 소스의 윗부분에 정의하였습니다.

두 번째 인수인 "clicked"는 임의로 정해지는 것이 아닙니다. 이것은 각각의 위젯에 대해서 사용자가 행한 행동 (event라고도 할수 있다)을 말하며, 버튼이라면 누르는 것이 있을 것이며, 메뉴에서는 선택하는 부분등이 예가 될 수 있습니다. 이 event는 각각의 위젯에 따라 다르며, 그 이름또한 틀립니다. 그 이름은 미리 정의되어 있습니다. 물론 사용자가 임의의 위젯을 만들고 임의의 이벤트를 만들수는 있지만, 그것은 좀더 고차원적인 기술이기에 다음 기회에 해보아야겠습니다.
사용자가 버튼을 눌렀더니, button_clicked이라는 함수가 불러집니다. 실제 위 소스에서는 버튼이 눌러지면 label 의 내용을 토글시키는 작용을 하게 해놓았습니다. c 프로그래밍을 접한 우리들은 쉽게 접근할 수 있겠죠. 여기에서 마지막 인수는 함수에 넘겨질 데이터입니다. 이 데이터는 대부분 프로그래밍에서는 null이지만 사용자가 필요에 의해 임의의 값을 넘겨주어야 할 때 적어주면 됩니다.
위에 또다른 gtk_signal_connect가 있죠? 'delete_event' 이며 이는 시스템 버튼 (오른쪽 위의 x모양의 버튼) 이 눌러졌을 경우 gtk 내부에 미리 정의된 기본 함수, gtk_main_quit을 부르게 되어 있습니다. 단순히 윈도우를 종료시키는 함수죠. 사용자가 만들지 않아도 되는 (일반적인 이벤트 함수) 함수들은 미리 정의된 것들을 쓰기도 합니다.


그럼. 정리를 해볼까요? ^ ^;

(1) 우선 window을 생성하고, 박스를 만듭니다.
(2) label을 생성하고 초기 이름은 'hello world closed'이고 이것을 박스에 쌓아봅니다(packing).
(3) button을 만들고 초기 label은 '클릭해 주세요'이며, 버튼이 눌러질 경우 행하여질 이벤트 함수를 'button_clicked'라고 정의하였고 이벤트와 연결하였습니다. 버튼 또한 box에 packing시킵니다.
(4) 각각의 위젯을 보이게 합니다.

4. 결과 화면
 

사용자 삽입 이미지

오늘 저의 설명은 어떠하였는지요? ^ ^; 궁금한 사항이 있으면 댓글을 달아주세요 ^ ^
무언가 하나씩 해나아가는 듯한 느낌이 들지 않아요? ㅋㅋ 오늘은 무언가 설명 좀 한것 같아서 나름 뿌듯한걸요? ^ ^;
함수를 좀더 쉽게 설명하기 위해 책과 블로그들을 참고하였는데, 아직 많이 미흡-_-+ 이쁘게 봐주세요 ^ ^

☆ 글쓴이 소개☆
이슬희(17기)님의 글입니다.

Trackback Address :: http://blog.swssm.org/trackback/287
Name
Password
Homepage
Secret

About Spectrum, Logic Analyzer :: 2008/11/08 11:11   by 김민기(17기)

 이번 프로젝트는 오실로스코프 뿐만아니라 Spectrum Analyzer 와 Logic Analyzer 또한 추가 시킨 새로운 휴대용 오실로스코프를 만들어 내는 것이다. 오실로스코프는 시간에 따른 신호의 변화량으로 많은 사람들에게 익숙한 장비이다. 하지만 Spectrum Analyzer 와 Logic Analyzer 는 전문분야를 공부하는 사람에게는 익숙하지만 이쪽과 관련이 없는 사람에게는 생소한 장비일 것이다. 이번 글에서는 Spectrum Analyzer 와 Logic Analyzer 가 어떤 장비이며, 어떤 상황에 필요한지 살펴보겠다.

1. Spectrum Analyzer
 변조파를 수신하여 측파대를 분해, 그 주파수 스펙트럼 성분의 분포를 표시하는 브라운관(CRT)과 특수한 슈퍼헤테로다인 수신기를 조합한 측정기. 국부 발진기스위프(sweep) 발진기로 되어 있으며 입력 신호의 주파수 스펙트럼이 스위프 발진기의 주파수 변화에 대응하여 차례대로 수신되며, 그 출력이 CRT의 종축에 스위프 발진기를 스위프하고 있는 스위프 반복 신호가 수평축에 가해져 있다. AM, FM 등의 피변조 신호의 에너지 분포, 잡음의 주파수 분석, 신호의 고저조파 성분, 혼변조곱이나 전송 선로의 특성 등을 측정하는 데 사용된다. 말이 어렵지만 쉽게 말한다면 주파수별로 신호를 표시한 것이다. 아래의 그림을 본다면 어떻게 Spectrum Analyzer의 출력이 이루어 지는지 알 수 있다.

사용자 삽입 이미지

[ Oscilloscope 와 Spectrum Analyzer의 출력 형태 ]

 Spectrum Analyzer는 주파수별에 따른 파형의 크기를 보여 주게 되는데, 예를 들어 1khz사인파를 넣고 보면 Oscilloscope에서는 시간에 따라 오르락내리락하는 사인파를 보여주지만 Spectrum Analyzer에서 1khz(x축은 주파수축임)에 해당하는 부분에서 하나의 선이 삐쭉 나와 있게 된다. 이와 같은 Spectrum Analyzer는 특히 RF파형에서 고조파성분을 분석할때 매우 유용하다. 사실 기본계측기라기에는 워낙고가장비라서 조그만 회사에서는 별로 구경할수 없고, 최신의 Spectrum Analyzer라면 수천만원 이상 된다.

사용자 삽입 이미지

[ 전압레벨(Volt), 주파수(Frequency), 시간(Time) 에 따른 측정 장비 차이 ]


2. Logic Analyzer
 Logic Analyzer이란 내부 Digital comparator가 입력되는 신호의 레벨을 분석하여 이를 1 과 0 으로 보여주는 장치이다. 물론 Osilloscope처럼 파형을 가지고 있고 움직있는 신호를 보여 줄 수 없지만 이보다 편리하고 막강한 기능을 가지고 있기도 하다.


사용자 삽입 이미지

[ Logic Analyzer 의 신호 출력 형태 ]


 사실 Logic Analyzer 는 그냥 단순히 디지털신호값을 보는 장비로 이해하기 쉬우나 이는 표면적일 뿐, 이 장비가 가지는 기능은 이를 훨씬 뛰어 넘는다. 심지어 Oscilloscope와 연계해 디지털 신호의 품질까지 확인할 수 있다. 하지만 이번 프로젝트에선느 디지털 신호의 품질을 확인하는 단계까지는 진행되지 않을 것이다. 가장 큰 장점으로는 디지털신호 값을 여러 채널로 빠르게 받아낼 수 있는 것이다. 예로 Serial 통신에서 데이터가 중간에 깨지는지 확인하고 싶은데 Osilloscope에서는 time step을 줄이면 파형은 정확히 보이는데 아주 조금의 시간밖에 보이지 않게 된다. 하지만 time step을 늘리면 파형이 잘 보이지 않게 된다. 이때 Logic Analyzer 를 쓰면 값은 디지털 값("1"or"0")이지만 좁은 time step으로 많은 데이터를 볼 수 있게 된다. Oscilloscope는 real time으로 화면에 보이는 값만 볼 수 있다면 Logic Analyzer 는 일정량의 데이타를 capture 한 후 사용자가 원하는 데이타를 보여주는 형태를 띠고 있다. 또한 Oscilloscope는 일반적으로 2개의 포트를 가지고 있지만 Logic Analyzer 는 일반적으로 32개의 포트를 가지고 있어서 32개의 디지털 line의 데이타를 한꺼번에 볼수 있기 때문에 다른 신호들과의 연관성이나 Timing check시 사용하게 된다. 일반적인 Logic Analyzer 는 32개의 포트이지만 이번 프로젝트에서는 8개의 채널을 계획중이다.
☆ 글쓴이 소개☆
김민기(17기)님의 글입니다.

Trackback Address :: http://blog.swssm.org/trackback/286
Name
Password
Homepage
Secret

RSA 알고리즘 이야기 :: 2008/11/08 02:01   by 엄은용(18기)

RSA 알고리즘은 인수분해 문제를 응용한 알고리즘이다. RSA 알고리즘에서 활용하는 이론적인 정리부터 살펴보기로 한다.

 

1. 기본 정리

1600년대 프랑스의 수학자인 페르마(Pierre de Fermat)는, p가 소수이고 p와 서로소인 양의 정수인 m에 대하여 다음 정리를 발견하였다.

 

스위스에서 출생한 1700년대의 수학자 오일러(Leonhard Euler)도 위 페르마의 정리와 유사한 정리를 발견한다. p와 q가 소수이고, m < n 인 m과 n은 서로소이며, n=p×q이면, 다음 오일러의 정리가 만족된다.

2. 기본 정리의 응용

(식2)의 양변에 m을 곱하면, 아래의 식이 구해진다.

위 (식3)의 모듈러 연산식을 음미하면, m에 대하여 {(p-1)×(q-1)+1}회 지수승하면 원래 값 m으로 되돌아오는 것으로 해석할 수 있다.

여기서, φ = (p-1)×(q-1)로 두고, φ+1을 다음과 같이 두수 e와 d의 곱으로 나타내기도 한다. 그러면 (식3)은 다음의 (식4)와 같다.


φ(파이)기호는 오일러 φ 함수 (Euler's phi function)를 뜻한다. 1부터 n까지의 양의 정수 중에 n과 서로소인 것의 개수를 나타내는 함수이다. 양의 정수 n에 대하여 정의되며 함수로 φ(n)으로 표기한다.

(식4)로부터 가상의 값 c를 통해, 다음의 두 식을 표현해 낼 수 있다.

(식5)의 c값인 좌변항을 (식6)에 대입하고, (식4)의 e×d를 (p-1)×(q-1)+1로 치환하면, 원래의 (식3)이 구해진다.

그리고 (식2)와 (식3)으로부터, 다음의 관계식을 얻을 수 있다.

이제 (식7)을 고려하여 (식4)의 두 수 e와 d의 곱 e×d가 가질 수 있는 값을 일반화하면, e×d는 다음의 값을 가질 수 있다.

- φ+1을 확장한 iφ+1 또는

- x mod φ=1을 만족하는 x값

(식5)와 (식6)에서 m과 c를 각각 다음과 같이 두기로 하자.

- m : 암호화하기 전의 메시지(원문 또는 평문, plain text)

- c : 암호문(cipher text)

그러면, (식5)는 암호화 과정, (식6)은 복호화 과정으로 활용하여, 다음과 같이 원문 m에 대한 암호문 c와 암호문 c를 복호화한 m을 구할 수 있다.

RSA 알고리즘의 공개키 (n, e)로 생성된 암호문 c에 대하여, 개인키 (n, d)를 모르는 상황에서 복호화 하여 m을 알아내려면 다음의 과정을 거치게 될 것이다.

 

마지막 단계까지 가더라도, n이 큰 소수의 곱으로 이루어진 합성수라면, 인수분해 문제로 인해 소인수 분해를 효과적으로 계산할 수 없다. 따라서 현실적으로 n을 1024 bits이상 크기로 구성한다면, 복호화 키(key) 없이 p와 q의 값을 알아내어 암호문을 복호화하기가 현실적으로 불가능하다.

- 참고 문헌
 윤한성, '정보보안과 암호화' 21세기사, 2004

☆ 글쓴이 소개☆
엄은용(18기)님의 글입니다.

Trackback Address :: http://blog.swssm.org/trackback/285
Name
Password
Homepage
Secret

Background & Point of the Project :: 2008/11/07 13:53   by 김민기(17기)

저번 프로젝트는 ARM을 기반으로 오실로스코프를 제작하였으나 ARM 으로만 구성되였기 때문에 여러가지 문제가 동반되었다.

@ ARM 기반 Oscilloscope 단점

1. Low Resolution, Low Frequency
 - 외부 ADC 없이 ARM 내부의 ADC 만을 이용하여 신호를 측정하였기 때문에 모든 신호 분석을 ARM에 의존하게 되었다. ARM 자체의 ADC 또한 속도가 기대에 못미치고 있는 상황에서 신호분석 및 LCD 출력 또한 시행하고 있기 때문에 낮은 분해능을 가질 수 밖에 없었다.

2. Real Time Display
 - 오실로스코프에는 Auto Set 이라는 기능이 있다. 자동으로 사용자가 보기 편하게 Display를 해주는 기능이다. 사용자가 장비에 익숙하지 않거나 여러 신호를 여러 번 측정할 시 필요한 기능으로 Display 자체를 Auto Set 상황으로 해주었다. 이는 사용자가 신호를 보기 편하다는 장점이 있는 방면에 신호가 발생 도중 의도하지 않는 값을 측정할 수 없다는 단점을 가지고 왔다.

3. User Interface
 - 사용자에게 어떤 버튼 조차 제공하지 않았다. Auto Set 기능으로 사용자가 신호를 맞출 필요가 없었기 때문이다. 하지만 Auto Set 기능을 주가 아닌 부가적인 기능으로 한정한다면, 사용자에게는 신호를 출력하는데 그 시간이나 양을 조절할 수 있는 버튼을 제공해햐 한다.

 주요한 이런 문제점으로 이번 FPGA 기반의 오실로스코프는 단점을 보완하고 단지 오실로스코프만이 아닌 Spectrum Analyzer, Logic Analyzer 을 추가시킨 새로운 개념의 오실로스코프를 제작하려고 한다.

사용자 삽입 이미지

[ Point of the Portable Oscilloscope Based on FPGA ]

@ FPGA 기반 Oscilloscope 장점

1. High Resolution, Sampling Frequency
 - 외부 ADC가 사용되기 때문에 Resolution, Sampling Frequency는 더이상 ARM 혹은 FPGA의 일이 아니다. ADC에서 신호에 대한 결과값을 뽑아내게 되고 FPGA는 그 값을 받아와서 분석만을 하게 되는 것이다. 이로써 모듈마다 일을 분할하게 되어 모듈자체가 받은 작업에만 신경을 쓸수있게 된다. 현재 60MHz의 분해능을 갖게 설계중이나, 외부 ADC 에 따라서 그 성능은 충분히 높아질 수 있다.

2. User Interface
 - 사용자에게 출력에 대한 Display를 조절할 수 있도록 버튼 등이 주워진다. 이로써 사용자는 자신이 원하는 방식으로 출력 방식을 결정할 수 있다. 또한 오실로스코프의 기능만을 하는 것이 아니고 Spectrum Analyzer 나 Logic Analyzer 의 기능도 발휘할 수 있기 때문에 모드를 바꾸어 주는 사용자 버튼또한 추가가 될 것이다.

3. FPGA 설계기술
 - FPGA 로 설계를 하는 덕분에 FFT 등 여러기술들을 추가적으로 구현할 수 있게 되었다. 이를 이용하여 단지 오실로스코프를 만들어 내는 것이 아니라, Spectrum Analyzer 와 Logic Analyzer 도 같이 구현하려 한다. 이 세가지 장비의 가장 근본적인 원리는 똑같다. 신호를 받아와 분석하여 출력하는 것이다. 하지만 분석하는 방법이 다른뿐 신호를 받고 출력하는 것을 근본적으로 같다. 이를 이용하여 그 모드에 따라 분석을 달리 한다면 한가지 장비로 세가지 장비의 효과를 볼 수 있는 것이 되는 셈이다.
☆ 글쓴이 소개☆
김민기(17기)님의 글입니다.

Trackback Address :: http://blog.swssm.org/trackback/284
Name
Password
Homepage
Secret

GTK+ widget, Object Class hierachy :: 2008/11/03 22:00   by 이슬희(17기)

저의 글을 열심히 읽어주신 분이 부탁하셔서, 이번주에는 GTK+ Widget 들을 보충하기 위한 class 계층 구조 트리를 올려드리겠습니다. 저도 widget이 많은 관계로 자주 사용하는것만 외우고 있을 뿐, 아래의 표를 참고하고 있습니다. GTK+를 정말 능숙하게 사용한다면, 전부 외우고 있겠죠? ㅋㅋㅋ 앞으로 그런 날이 올거라 믿고 열심히 포스팅 하겠습니다.ㅋ
사실은 공부를 하면서 widget을 올린 window를 하나씩 만들어 보려고했지만, 아래의 계층구조 트리를 보면서 하나씩 제작하는것도 괜찮다는 생각이 드네요 ^ ^;

GtkObject
   +GtkData
   | +GtkAdjustment
   | `GtkTooltips
   `GtkWidget
     +GtkContainer
     | +GtkBin
     | | +GtkAlignment
     | | +GtkEventBox
     | | +GtkFrame
     | | | `GtkAspectFrame
     | | +GtkHandleBox
     | | +GtkItem
     | | | +GtkListItem
     | | | +GtkMenuItem
     | | | | `GtkCheckMenuItem
     | | | |   `GtkRadioMenuItem
     | | | `GtkTreeItem
     | | +GtkViewport
     | | `GtkWindow
     | |   +GtkColorSelectionDialog
     | |   +GtkDialog
     | |   | `GtkInputDialog
     | |   `GtkFileSelection
     | +GtkBox
     | | +GtkButtonBox
     | | | +GtkHButtonBox
     | | | `GtkVButtonBox
     | | +GtkHBox
     | | | +GtkCombo
     | | | `GtkStatusbar
     | | `GtkVBox
     | |   +GtkColorSelection
     | |   `GtkGammaCurve
     | +GtkButton
     | | +GtkOptionMenu
     | | `GtkToggleButton
     | |   `GtkCheckButton
     | |     `GtkRadioButton
     | +GtkCList
     |  `GtkCTree
     | +GtkFixed
     | +GtkList
     | +GtkMenuShell
     | | +GtkMenuBar
     | | `GtkMenu
     | +GtkNotebook
     | +GtkPaned
     | | +GtkHPaned
     | | `GtkVPaned
     | +GtkScrolledWindow
     | +GtkTable
     | +GtkToolbar
     | `GtkTree
     +GtkDrawingArea
     | `GtkCurve
     +GtkEditable
     | +GtkEntry
     | | `GtkSpinButton
     | `GtkText
     +GtkMisc
     | +GtkArrow
     | +GtkImage
     | +GtkLabel
     | | `GtkTipsQuery
     | `GtkPixmap
     +GtkPreview
     +GtkProgressBar
     +GtkRange
     | +GtkScale
     | | +GtkHScale
     | | `GtkVScale
     | `GtkScrollbar
     |   +GtkHScrollbar
     |   `GtkVScrollbar
     +GtkRuler
     | +GtkHRuler
     | `GtkVRuler
     `GtkSeparator
       +GtkHSeparator
       `GtkVSeparator

계층구조 트리 부분중 굵은 글씨로 표기한 것은 제가 이전에 포스팅했던 내용입니다. 겨우 2개밖에 하지 못했네요,
앞으로 하나씩 하나씩 굵은 글씨로 만들어 볼 생각입니다. ^ ^ 아! 위의 계층구조는 window와 관련된 widget입니다.

GTK+를 하다보면 window가 없는 Event를 종종 사용해야 할 것입니다. window와 무관한 widget을 몇가지 설명할까합니다.EventBox widget은 전혀 쓸모없을 수도 있습니다. 이것은 스크린에 아무것도 그리지 않으며 이벤트에도 응답하지 않습니다. 하지만 이것은 자신의 child widget으로 X윈도를 제공하는 한 함수를 지원하게됩니다. 이것은 많은 GTK widget들이 관련된 X윈도를 가지지 않는다는 점이 중요합니다. X윈도를 가지지 않는 것은 메모리를 절약하고 퍼포먼스를 증대합니다. 완벽할 수 없기에몇가지 약점도 가지고 있습니다. X윈도가 없는 widget은 이벤트를 받을 수 없고, 그리고 그의 항목들에 대한 클리핑도 하지 않습니다. EventBox라는 이름은 이벤트를 다루는 함수라는 의미도 있지만, widget들이 클리핑될 수도 있다는 것을 의미하기도 합니다.

GtkAlignment
GtkArrow
GtkBin
GtkBox
GtkImage
GtkItem
GtkLabel
GtkPaned
GtkPixmap
GtkScrolledWindow
GtkSeparator
GtkTable
GtkViewport
GtkAspectFrame
GtkFrame
GtkVPaned
GtkHPaned
GtkVBox
GtkHBox
GtkVSeparator
GtkHSeparator

우리는 window에 무언가의 widget을 올릴때마다 위의 Event widget을 사용할 것입니다. 각각의 widget을 차례로 시험하고 보여줄 수 있는 간단한 함수를 만들어 GTK+에 관한 공부를 해볼 생각입니다. 하나의 Project를 할때마다 Event widget을 최대한 넣어서 보여줄 생각입니다.

다음주에는 window에 버튼을 올려볼까 합니다. 간단히 만들어 보는 GTK+ 버튼 Widget!!!!

위의 계층 구조는 앞으로 계속 사용할 듯 합니다. SIG가 끝나기 전에 위의 widget을 전부 사용해보는게 목표로 잡고 열심히 만들겠습니다. 이번 한주도 열심히 열심히 공부하세요 ^ ^*

☆ 글쓴이 소개☆
이슬희(17기)님의 글입니다.

Trackback Address :: http://blog.swssm.org/trackback/283
Name
Password
Homepage
Secret

임베디드 제품의 업그레이드 이야기 :: 2008/11/02 20:32   by 구도훈(17기)

fota가 업데이트에 관련된 내용이다 보니 업데이트 방법에 대해서 생각해 보게 되는군요.

 

상용 임베디드 제품의 소프트웨어 업데이트 방법에 대해서 몇가지 적어봅니다.

 

 

[업그레이드 대상]

우선 대상을 몇가지 적어볼까요?

32비트 프로세서 기준으로 보면 아래와 같겠죠.

 

1. 부트로더

2. 커널

3. 어플리케이션영역(+라이브라리,+파일시스템)

 

[업그레이드는 누가?]

32bit 프로세서를 가진 시스템의 업데이트는 대부분 업그레이드 모듈이 따로 존재하죠.

네트웍을 이용한 업그레이드나 USB 메모리 스틱을 이용한 업그레이드가 흔한 기법입니다.

 

네트웤을 이용한 업그레이드는 부팅할때 서버에 업그레이드 이슈가 있는지 확인해서 업데이트를 하겠죠.

USB 메모리 스틱을 이용하는 경우는 시스템에서 해당 USB 에 약속된 파일이 있는지 검사해서 업데이트를 하는 방법이 많이 쓰이죠.

 

 

 

[업그레이드 시 고려사항]

그러면 업그레드시 무엇을 고려해야 할까요? 몇가지 적어보죠.

1. 신뢰성

2. 시간

3. 효율성

 

 

[각각의 대상에 대한 이야기]

1. 부트로더

사실 부트로더는 성격상 업데이트할 일이 거의 없습니다. 부트로더가 하는 대부분의 일을 커널에서도 할수있다는 점에서 말이죠. 만약 수정할 게 있다면 화면 출력을 갖는 시스템의 이미지 파일 정도이겠죠. 시스템을 키고 부팅 시간이 너무 길게 되면 이미지 라도 사용자에게 보여 줘야 하는 일이 있겠죠?^^ 하지만 이미지 파일도 부트로더에 포함시키보다는 특정 영역에 위치 시키기 때문에 거의 수정할 일이 없습니다.

 

2. 커널

커널업그레이드의 경우 대부분 드라이버를 커널 이미지에 포함시켰는데, 드라이버 수정이 있을 때 발생하겠죠.

 

-간단한 방법으로는 플래시에 똑같은 크기의 커널 영역을 두 개 잡아 넣고 서로 스위칭 하는 방법이 있죠. 현재  A 영역의 커널을 쓰고 있으면 B 영역에 새 커널 이미지를 덮어 씌우고 부트로더에서 커널로 점프 하는 위치를 스위칭 하는 방법이죠. 하지만 항상 안 쓰는 영역이 있게 되므로 공간 낭비가 큰 단점이 있죠.

 

위의 방법은 리눅스 커널이미지인 경우 요즘 플래시 값이 싸져서 할 수 있다고 쳐도 windows CE 이미지인 경우 용량이 상당히 커서 참 곤란합니다.  다른 방법을 알아보죠.

 

-업그레이드만 수행하게 하는 커널 이미지를 만듭니다. 사용자 어플리케이션에서 업그레이드 완료 전에 시스템이 비정상 상태가 될 경우 업그레이드만 수행하게 하는 영역으로 부팅하게 해놓고 시작하는 거죠. 앞서의 방법과 같이 영역을 두 개 잡는건 동일 하지만 업그레이드만 담당하게 함으로서 용량을 최소화 할 수 있는 것이 앞서의 방법에 비해 장점이죠.

 

-마지막으로 커널 생성시 변경이 예상되는 부분에 패딩 영역을 둬서, 바뀐 부분만 바꾸는 방법이 있다고 합니다. 저도 해보지 않아서요.^^ 앞서의 방법들은 커널 이미지 전체를 바꾸는 것에 비해 이것은 바뀐 부분만 변경 하니 효율적일수 있겠죠. 패딩 크기도 예측하는 수고가 필요하겠네요. 그리고 부분 수정을 해야 하니 버젼 관리가 상당히 중요하겠군요.

 

 

3. 어플리케이션 영역

어플리케이션 영역의 경우는 업그레이드 실패가 발생하더라도 부트로더나, 커널에 비해 되돌리기가 쉬워서 수월할 수 있는데요. 특성상 다른 프로그램과 유기적으로 돌아가는 경우가 있어서 버젼 관리가 중요하죠. 업그레이드가 단계적으로 될 수 있는 환경이면 바뀐 부분만 그때 그때 적용하면 되지만, 사용자가 버젼 1.0에서 3.0으로 바로 업그레이드 하는 수도 있으니 이런 것을 고려해서 업데이트를 해야겠죠. ! 플래시 파일 시스템을 사용하면서 빈번하게 rw 하는경우  wear leveling이 중요하니 어플리케이션 롬 이미지