고도리님이 게재한 내용을 다시 간략하게 정리해 보았습니다.
Link : http://kelp.or.kr/korweblog/stories.php?story=06/10/18/5755631&topic=45


1. 임베디드 리눅스의 개요

  - Embedd와 Linux 둘다 잘해야 한다.

  0> 무조건 프로그래밍은 기본

  1> 리눅스 환경에 익숙해 질 것, 즉 세팅을 잘해야 함.

  2> 네트워크에 대한 기본 지식을 공부해 둘 것.

  3> 리눅스 시스템 프로그래밍을 공부해 둘 것.

  4> 하드웨어 동작에 대한 기본을 공부할 것.

  5> 타겟을 정함. cpu 뿐만 아니라 공부에 대한 목표를 정해야 함. (무엇을, 어디까지)

  6> 부트로더 소스등을 충분히 분석해 볼 것.

  7> 넘 성급하지 말 것.


2. 개발 환경
 
 - 리눅스가 설치되어야 한다.

 - 타겟보드 (개발하고자 하는 보드)가 있어야 한다.

 - 호스트와 타겟 보드간의 네트워크가 연결되어 있어야 한다.

 - 호스트 시스템에는 타겟보드 개발용 cross toolchain이 설치되어 있어야 한다.

 - 타겟 보드용 부트로더를 작성하던가 지존의 부트로더를 수정해야 한다.

 - 타겟 보드용 커널이 있어야 한다.

 - 타겟 보드용 root filesystem이 있어야 한다.


 마지막 3개는 직접 개발해야 할 가능성이 높다.


3. 공부해야 하는 순서
 
 1> 일단 C를 잘해야 한다.
 
 2> 타겟을 정한다. (리눅스 : x86, 임베디드 리눅스 : STLinux - STI7105)

 3> ARM 기초

    - ARM 강좌 : ARM Core, 명령어, arm startup code

    - ARM architecture reference manual

    - STI7105 CPU Menual

    - U-Boot ( http://sourceforge.net/projects/u-boot )

    - 리눅스 커널 / 디바이스 드라이버
        -> 커널을 공부할 때 제일 좋은 것은 커널 소스와 커널 소스에 포함되어 있는 Documentation 디렉토리이다.
        -> Porting device drivers to the 2.6 kernel ( http://lwn.net/Articles/driver-porting/ )

    - 임베디드 리눅스 커널 분석 ( http://wiki.kldp.org/KoreanDoc//html/EmbeddedKernel-KLDP/ )

    - Root filesystem 및 packaging 자료 ( http://www.netmanias.com )

'[Z-01] 참고 ' 카테고리의 다른 글

네트워크, 파일시스템 용어 모음  (0) 2010.04.02
Embedded Linux study 목표  (0) 2010.03.26
今臣戰船尙有十二  (0) 2009.12.28
__attribute__((packed))  (0) 2009.12.28
[UTIL] FileZilla  (0) 2009.12.21
Posted by eoseontaek

<이충무공전서>에 수록된 행장록의 유명한 장계 일부분입니다.


今臣戰船尙有十二 出死力拒戰則猶可爲也,
지금 신에게 아직 12척의 전선이 있으니,
죽을 힘을 다하여 막아 싸운다면 능히 대적할 방책이 있사옵니다.

戰船雖寡 微臣不死則不敢侮我矣.
전선이 비록 적다고 하더라도 미천한 신이 죽지 아니한 즉,
적이 감히 우리를 가볍게 여기지 못할 것이옵니다.

'[Z-01] 참고 ' 카테고리의 다른 글

Embedded Linux study 목표  (0) 2010.03.26
Embedded Linux 공부에 대해서  (0) 2010.03.26
__attribute__((packed))  (0) 2009.12.28
[UTIL] FileZilla  (0) 2009.12.21
[UTIL] EASEUS Partition  (0) 2009.12.21
Posted by eoseontaek
Link : http://sw-programming.blogspot.com/2006/06/attributepacked.html

프로그래밍중 가끔 실수하는것이 구조체의 바이트 정렬이다.
보통 시스템이 32비트이므로 4바이트로 정렬이 된다. 같은 머신에서 돌아가는 소프트웨어일 경우는 문제가 생기지 않으나 다른 머신과 통신하는 프로그램일 경우 문제가 발생한다.

typedef struct {
struct color{
uchar blue;
uchar read;
uchar black;
}
int made_in;
} apple;


위 구조체의 경우 __attribute__((packed))을 사용하지 않았으므로 8바이트가 할당된다.
color구조체는 3바이트만 사용했지만 바이트 정렬문제로 4바이트가 되서 총 8바이트다. 이런 문제를 사전에 방지하기 위해 __attribute__((packed))를 사용해야 한다.

typedef struct {
struct color{
uchar blue;
uchar read;
uchar black;
}
int made_in;
}__attribute__((packed)) apple;


윈도우의 비주얼씨에서는 #pragma pack(1)을 선언한다.

'[Z-01] 참고 ' 카테고리의 다른 글

Embedded Linux 공부에 대해서  (0) 2010.03.26
今臣戰船尙有十二  (0) 2009.12.28
[UTIL] FileZilla  (0) 2009.12.21
[UTIL] EASEUS Partition  (0) 2009.12.21
SAMPLE 전자에서 판매되는 각종 센서 모음 사이트  (0) 2009.12.08
Posted by eoseontaek
2009. 12. 21. 20:49

무료 FTP 프로그램







'[Z-01] 참고 ' 카테고리의 다른 글

今臣戰船尙有十二  (0) 2009.12.28
__attribute__((packed))  (0) 2009.12.28
[UTIL] EASEUS Partition  (0) 2009.12.21
SAMPLE 전자에서 판매되는 각종 센서 모음 사이트  (0) 2009.12.08
Kernel을 Porting 한다는 것  (0) 2009.12.04
Posted by eoseontaek

무료 파티션 툴







'[Z-01] 참고 ' 카테고리의 다른 글

__attribute__((packed))  (0) 2009.12.28
[UTIL] FileZilla  (0) 2009.12.21
SAMPLE 전자에서 판매되는 각종 센서 모음 사이트  (0) 2009.12.08
Kernel을 Porting 한다는 것  (0) 2009.12.04
DPC(Deferred Procedure Call)  (0) 2009.12.04
Posted by eoseontaek

'[Z-01] 참고 ' 카테고리의 다른 글

[UTIL] FileZilla  (0) 2009.12.21
[UTIL] EASEUS Partition  (0) 2009.12.21
Kernel을 Porting 한다는 것  (0) 2009.12.04
DPC(Deferred Procedure Call)  (0) 2009.12.04
Call Back Function  (0) 2009.12.04
Posted by eoseontaek

Link : http://recipes.egloos.com/5100880


임베디드 시스템에 입문해서 kernel을 포팅한다는 말을 많이 사용했던 것 같다.
그런데 막상 생각해보니 그 의미를 정확히 알고 있지 못했다.
친절한 임베디드 시스템 개발자 되기 강좌에서 간단하게 그 의미가 정리되어 있었다.
아래는 스킵한 내용이다.



Porting을 한다는 것은 이미 만들어져 있는 Software를 우리가 만들려는 Target에 동작할 수 있도록 잘 수정을 한다던가, 특정 Routine을 만든다던가 해서 Target에서 잘 동작할 수 있도록 만드는 걸 Porting이라고 부르더군요. 그러니까, Kernel을 만들기에는 시간이 부족하고, 돈도 많이 들고 하니까, 이미 만들어져 있는 Kernel을 우리의 Target에 제대로 동작하도록 만들고 있다는 뭐 그런 의미였던 것이었었던 것이죠.
 
그러면 만들어져 있던 Kernel을 우리의 Target에 제대로 동작하게 한다는 건 또 어떤 의미냐 하면, Linux Kernel을 예를 든다면, Linux Kernel은 Software  그 자체로서 어느 CPU든지 Compile만 새로 한다면 동작할 수 있도록 구성되어 있는데 고로 범용성이 높은 C로 짜여져 있는 경우가 대부분이에요. C는 많은 CPU들에서 C compiler를 제공하니까, 그냥 가져다가 우리 Target에 맞는 Compiler로 다시 Compile만 하면 되는 거죠. 그러면 어느 부분을 작업을 해야 Porting한다고 제대로 말할 수 있는 걸까요.
 
뭐 크게 예만 든다면,
ⓐ Interrupt Lock/ Unlock을 하는 방법은 CPU마다 다르겠죠.
ⓑ Context Switching 할 때 Backup 해야 하는 Context는 CPU마다 다르겠죠. (Register들이 CPU마다 다 천차만별일 테니까요.)
ⓒ Stack이 자라는 방향은 CPU마다 Compiler option마다 다르겠죠.
ⓓ SWI를 호출하는 방법이 CPU마다 다르겠죠.
ⓔ Interrupt가 걸린 후 처리 되는 방법도 CPU마다 틀리겠죠.
ⓕ 특히나 ARM같은 경우에는 Mode마다 사용되는 Stack도 따로 있으니 이 부분도 수정되어야 하고요.
ⓖ Watch dog Timer도 MCU마다 다른 시간 설정일 테니 이 부분도 잘 봐줘야 할 것이고요
.
 
뭐 이런 부분들이 따로 새로 만들어 지거나, 우리 Target에 맞도록 수정되어야 기존에 만들어져 있던 Kernel을 우리가 Target으로 하는 CPU에서 동작할 수 있도록 할 수 있는 것이죠. Kernel을 Porting하는 작업은 쉬운 작업이 아니에요. Kernel이 어떻게 동작하고 있는 지와, 우리가 Target으로 생각하는 CPU가 어떻게 동작하는지를 잘 알아야 가능한 일인 게죠.
 
어떤 특정 Kernel을 잡아서 어떻게 Porting 한다는 걸 보여주는 건 의미가 있을지도 모르겠습니다만, 저 같은 경우에는 관심 없는 Kernel 잡아서 보여주는 건 별로 흥미도 재미도 없더라고요. 위의 ⓐ~ⓖ 같은 것들을 들여다 봐야 한다만 알아도 Porting을 할 수 있는 기본 자세가 되었다고 보시면 무리 없다고 봐야 하지 않을까 싶습니다요.
Posted by eoseontaek

'[Z-01] 참고 ' 카테고리의 다른 글

SAMPLE 전자에서 판매되는 각종 센서 모음 사이트  (0) 2009.12.08
Kernel을 Porting 한다는 것  (0) 2009.12.04
Call Back Function  (0) 2009.12.04
친절한 임베디드 시스템 개발자 되기 강좌  (0) 2009.12.03
MOSFET  (0) 2009.12.02
Posted by eoseontaek

콜백의 기본 개념

일반적인 의미에서 콜백이란 호출자(Caller)가 피호출자(Callee)를 호출하는 것이 아니라 피호출자가 호출자를 호출하는 것을 말한다(<그림 1> 참조). 콜백이 많이 사용되는 전형적인 예는 WIN32 API이다. 대개의 경우 응용 프로그램이 WIN32 API를 호출하는 거서이 일반적이지만 때때로 윈도우 시스템이 응용 프로그램을 호출해야 할 때가 있다. 이때 응용 프로그램은 콜백 함수를 윈도우 시스템에게 알려주고 어떤 조건이 만족되면 윈도우 시스템이 콜백 함수를 호출해 준다. WIN32 API의 EnumWindow, SetTimer 함수 등이 콜백을 사용하며 윈도우 프로시저(window procedure) 역시 콜백 개념을 사용한다.

 

 

<그림 2>는 전형적인 콜백 메커니즘을 보여주고 있다. 콜백 메커니즘의 순서로써

(1) 호출자는 콜백 메서드의 참조(함수 포인터)를 매개 변수로 하여 피호출 메서드를 호출한다.

(2) 피호출 메서드는 매개 변수로 전달된 콜백 메서드에 대한 참조를 필드와 같은 곳에 기록해 둔다.

(3) 이제 콜백을 수행할 어떤 조건(이 조건은 다양할 수 있다)이 만족되면 ...

(4) 기록해 둔 콜백 메서드 참조를 이용하여 콜백 메서드를 호출하게 된다.

물론 모든 콜백이 <그림 2>와 같은 순서를 따르는 것은 아니지만 많은 경우 이와 같은 시나리오를 따르는 것이 일반적이다. 콜백을 수행할 조건을 만족하는지 지속적으로 검사하는 과정이 필요하기 때문에 별도의 스레드를 이용하는 경우가 대부분이며, 콜백 메서드를 호출하는 스레드 역시 조건을 검사하는 스레드이기 때문에

 콜백 메서드는 서로 다른 스레드에서 호출되는 것이 일반적이다. 이렇게 다중 스레드를 사용하기 때문에 비동기(asynchronous) 작업을 수행할 때 비동기 작업이 완료되었음을 알리기 위한 방법으로 콜백 메커니즘이 많이 사용되곤 한다.

 

참조: http://imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=29268

 

 

OS에 의해 직접 불려지는 함수를 CALLBACK 함수라고 한다. 예를 들면 WndProc 콜백 함수는 EVENT 발생시 OS에 의해 직접 호출되며, 이때 Message 종류와 내용을 Parameter로 전달 받는다.

 

Callback routines are defined by the user program, instructing the graphic system to call a specific function when a specific event occurs. Normally they are used to automatically redraw a window when its content has changed.

 

CALLBACK 함수는 메시지를 처리한다. 윈도우즈 자체가 메시지 기반으로 작동하기 때문에 우리가 아무것도 안하면 혼자  놀고 있다가 버튼이라도 하나 누르면 그 버튼 ID에 따른 처리를 해준다. 이런 처리를 해주는 부분이 CALLBACK 함수이다.

 

CALLBACK으로 선언된 함수는 윈도우 운영체제에서 특정한 사건이 발생될 때 운영체제로부터 호출돼는 함수이다. 예로 Timer가 있다. Timer는 사용자가 프로그램에서 얼마 간격으로 SetTimer를 설정하면 운영체제가 그 시간이 돼면 OnTimer 함수를 호출한다.

 

 

CALLBACK 함수는 불려지는 쪽에서 부르는 쪽의 데이터를 참조하거나 핸들링 하는 함수이다. 윈도우는 data segment와 code segment가 분리되어 있다. code는 공유를 하나 data는 공유 하지 않는다. 공유하게 되면 심각한 문제가 발생할 것이다. 그래서 나온 것이 CALLBACK 함수이다.

 

예를 들어 설명하면,
'A'라는 DLL이 'B'라는 DLL을 불러 쓰고 'A'라는 DLL에는 동적으로 메모리를 할당 받을 변수와 메모리를 할당하고 해제하는 함수가 있다고 가정하고 'B'라는 DLL에서 이 변수에 동적으로 메모리를 할당하고 처리하려 한다고 할 때 'B'에서 'A'의 변수를 인자로 받아 메모리를 할당하고 처리하는 것은 무의미 하거나 위험하다. 앞에서 말했듯이 'A'와 'B'는 서로 독립된 DATA SEGMENT를 갖기 때문이다. 그렇다면 B는 A의 메모리 할당 함수를 이용해서 A의 변수에 메모리를 할당하고 해제 해야한다. 여기에서 A에서 B로 넘겨주는 메모리 할당 함수를 CALLBACK 함수라고한다. 다시말해서 불려지는 쪽에서 부르는 쪽의 DATA를 참조하기 위한 교량 역할을 하는 것이 CALLBACK 함수인 것이다. WNDPROC가 CALLBACK 함수인 이유도 여기에 있다. 애플리케이션에 의해 불려지는 운영체제에서 디폴트 윈도우 프로시져의 위치에 부르는 함수이기 때문이다.

 


Posted by eoseontaek

'[Z-01] 참고 ' 카테고리의 다른 글

Kernel을 Porting 한다는 것  (0) 2009.12.04
DPC(Deferred Procedure Call)  (0) 2009.12.04
Call Back Function  (0) 2009.12.04
MOSFET  (0) 2009.12.02
네이버 블로그/카페에서 우클릭 및 내용 선택하기  (0) 2009.12.01
Posted by eoseontaek
2009. 12. 2. 10:22
Posted by eoseontaek

'[Z-01] 참고 ' 카테고리의 다른 글

Kernel을 Porting 한다는 것  (0) 2009.12.04
DPC(Deferred Procedure Call)  (0) 2009.12.04
Call Back Function  (0) 2009.12.04
친절한 임베디드 시스템 개발자 되기 강좌  (0) 2009.12.03
MOSFET  (0) 2009.12.02
Posted by eoseontaek
이전버튼 1 2 3 이전버튼