2009년 6월 9일 화요일
eCos configuration (i386)
현재사용하고있는보드: EPIA-M (i386 VIA)
$ ecosconfig new pc
$ configtool ecos.ecc //configuration tool을 연다.
* configuration tool에서 설정해주어야 할 사항 *
serial통신을 하기 위한 하드웨어 device driver
START UP code GRUB로 설정
저장하고 빠져나온다.
$ ecosconfig tree
$ make
2007년 12월 5일 수요일
eCos application 작성
eCos application을 작성해보자.
우선, c파일이든 cpp파일이든 하나 만든다.
코드작성법은 C와 유사하다.
C에 있는 stdio.h 라든가 하는 라이브러리를 사용할 수가 있고, eCos에서 제공하는 라이브러리들은 "cyg/kernel/"에 있다.
만약 thread에 관한 사항을 사용하고 싶으면 #include <cyg/kernel/kapi.h>를 포함시켜주면 된다. eCos thread에 관한 함수들이 있는 라이브러리이다.
C로 코딩을 할 경우 프로그램이 시작하는 곳은 main함수이다.
하지만 eCos의 경우에는 cyg_user_start함수이다.
간단한 hello world를 찍는 다음 예제를 보자.
=====================================================================================
#include <stdio.h>
void cyg_user_start(void)
{
printf("Hello, world\n");
}
=====================================================================================
C프로그래밍과 별반 다를게 없어보이지 않는가?
main함수의 이름만 바뀌었다는 것을 제외하면 말이다.
thread를 생성하여 Hello world 프로그래밍을 해보자.
=====================================================================================
#include <stdio.h>
#include <stdlib.h>
#include <cyg/kernel/kapi.h>
#define STACK_SIZE 4096
#define nTHREAD 2
cyg_thread threads[nTHREAD]; //thread object
char stack[nTHREAD][STACK_SIZE]; //thread's stack
cyg_handle_t myThread1, myThread2; //thread handle
cyg_thread_entry_t printout; //thread function
void cyg_user_start(void)
{
//two threads create
cyg_thread_create(
4, //thread priority
printout, //thread function
0, //message (function argument)
"myThread1", //thread name
(void *) stack[0], STACK_SIZE, //thread's stack
&threads[0]); //thread object
cyg_thread_create(
4,
printout,
1,
"myThread2",
(void *) stack[1], STACK_SIZE,
&threads[1]);
//thread resume
cyg_thread_resume(myThread1);
cyg_thread_resume(myThread2);
}
void printout(cyg_addrword_t data)
{
int message = (int) data;
while(1)
{
printf("myThread %d print.....: Hello, world\n", message+1);
}
}
=====================================================================================
이 프로그램은 두개의 thread가 돌아가면서 무한으로 hello world를 찍는 프로그램이다.
여기서 보듯이,
eCos에서는 thread를 생성할 때 priority를 줄 수가 있다.
현재는 두 thread 모두 priority를 4를 주었기 때문에 RR로 스케줄링 받아 동작하지만, 두 thread가 priority가 다르다면 높은 priority가 먼저 돌아가게 될 것이다.
또한 eCos의 특징을 볼 수 있는것이 바로 cyg_thread_resume이라는 함수이다.
보통 C프로그램에서는 thread를 create함과 동시에 thread가 수행되게 되는데, eCos에서는 그렇지 않다.
thread를 create하는 것은 단지 생성을 하는 것 뿐이고 thread를 수행시켜주기 위해서는 resume을 해주어야 한다.
때때로 필요없을 때 thread를 잠시 쉬게 할 수 있는데 그 함수는 suspend이다.
suspend를 해두었다가 다시 필요할 때 resume을 시켜 thread를 깨울 수 있다.
이러한 application을 만들었다면 컴파일을 해야한다.
Makefile을 만들어서 컴파일을 할 수가 있는데 Make file은 다음과 같다.
$ vi Makefile
=====================================================================================
INSTALL_DIR=/home/test/ecos/myThread/myThread_install
//eCos kernel configuration때 생성된 install파일의 경로를 잡아준다.
include $(INSTALL_DIR)/include/pkgconf/ecos.mak
XCC = arm-elf-gcc
//i386용으로 컴파일하고 싶으면 i386-elf-gcc로 하면 된다.
XCXX = $(XCC)
XLD = $(XCC)
CFLAGS = -I$(INSTALL_DIR)/include -I/opt/ecos/gnutools/arm-elf/arm-elf/include
CXXFLAGS = $(CFLAGS)
LDFLAGS = -nostartfiles -L$(INSTALL_DIR)/lib -Ttarget.ld
#RULES
.PHONY: all clean
OBJECTS = myThread.o
all : $(OBJECTS)
$(XCC) $(CFLAGS) $(LDFLAGS) $(ECOS_GLOBAL_LDFLAGS) -o myThread $(OBJECTS)
clean :
-rm -f $(OBJECTS) myThread
myThread.o : myThread.c
$(XCC) -c $(CFLAGS) myThread.c $(ECOS_GLOBAL_CFLAGS) $<
====================================================================================
그리고 나서 컴파일.
$ make
컴파일을 하면 실행파일이 만들어진다.
그러나 eCos에서 실행파일을 올릴 때는 .o 파일이나 .exe 파일을 올리지 않는다.
.srec파일을 올린다.
그러므로 object copy를 해주어야 한다.
$ objcopy -O srec myThread myThread.srec
하면 srec파일이 생긴다.
이것을 보드에 올리면 된다.
2007년 10월 29일 월요일
redboot configuration (in eCos)
eCos에서 redboot를 configuration 하는 것은, eCos가 지원하는 보드에 올린다면 매우 쉬운 일이다.
내가 사용하고 있는 보드는 trace32를 테스팅하기 위해 사용하던 IMO보드이다.
이름은 조금 다르지만, 일단 코어는 s3c2410이므로, eCos가 지원하는 smdk2410에 맞춰 주면 된다.
eCos에서 configration 방법은 두가지가 있다. tool을 사용하는 것과, command를 날리는 방법.
일단은 두가지 다 해보도록 하겠다.
우선, tool을 사용하는 것.
tool을 사용하는 것이 더 빠르고 쉽다.
하지만 tool을 사용해서 에러가 난다면 command를 추천한다; 왠지 tool은 불신감이 솟구쳐서-_-;;
1. tool 실행
$ configtool
의 command를 치면 조금 많이 심플한 tool이 하나 보인다.
2. hardware선택
tool의 메뉴에서 build->template를 클릭하면 하드웨어를 선택할 수 있다.
eCos에서 지원하는 하드웨어들이 죽 list로 보여지는데 거기서 Samsung의 smdk2410을 선택하고,
그 아래 보면 package라는 부분이 있다.
default라고 되어있지만, redboot를 configuration할 것이기 때문에 redboot를 선택해준다.
그리고 "확인"
그리고 나서 보면 tool의 configuration 옵션이 바뀌어 있는 것을 볼 수 있다.
확인해 주어야 할 것은 architecture와 redboot 부분이다. 활성화 된 내용을 확인하고, 바꿀 옵션이 있다면 바꾼다.
하지만, 그냥 save해도 잘 돌아간다.
옵션을 다 바꾸었다면 save.
3. 이미지 만들기
redboot 이미지를 만들어야 한다.
build->Gernerate Build Tree를 선택해서 우선 트리를 생성한 후에,
build->library를 선택한다. (컴파일과 비슷한 것.)
그러면 완성-_-)b 이 되는데-_-!
smdk2410에 올릴때 중요한 것이 하나 빠졌으니,
이렇게 만든 이미지를 flash에 구워 부팅을 시키면 jump vector가 엉뚱한데를 가르키며 부팅이 제대로 되지 않는다.
해서 삽질을 엄청나게 했지만,
file->import를 선택하고
/opt/ecos/eocs-2.0/packages/hal/arm/arm9/smdk2410/current/misc/smdk2410_redboot_ROMRAM.ecm 을 포함시켜주어야만 함을 알았다.
'왜?' 인지는 아직 알아내지 못했지만;
그럼 다음으로 terminal창에서 configuration 하는 법.
일단, 해주는 일은 같지만 interface에서 쉽게 하느냐 못하느냐의 차이다.
terminal창에서 다음 command를 순서대로 날리면 된다.
$ ecosconfig new smdk2410 redboot
(새로만드는데, architecture와 package를 지정해준다)
$ ecosconfig import /opt/ecos/ecos-2.0/packages/hal/arm/arm9/smdk2410/current/misc/smdk2410_redboot_ROMRAM.ecm
(역시 파일을 import 해준다)
$ ecosconfig tree
(tree 생성)
$ make OLDGCC=1
(책에는 'make'라고만 해도 된다고 했는데, OLDGCC는 뭘까요-_-;)
tool로 했든 command로 했든지 간에 아무튼 make가 성공한다면, 여러개의 파일이 생긴다.
그 중에서 install폴더를 찾아 들어가면 bin폴더 아래에 이미지 파일이 생성된 것을 볼 수 있다.
binary파일과 elf파일 srec파일 img파일.
img파일은 안써봤고-_-; srec파일은 eCos보드에 올릴 때 쓰는 것이다.
하지만 redboot은 부트로더니까, binary파일로 올렸다.
(trace 32로 올렸음; flash날려먹어서)
eCos 설치하기
우선, eCos 설치 메뉴얼은 http://ecos.sourceware.org 에 있다는 것을 밝히는 바이다.
하지만, 나같이 영어 울렁증 있는 사람은 절대 못본다-_-; 죄다 영어라서;
그리고 eCos 메뉴얼을 비롯 관련 서적들도 다 영어다-_-; 아놔.... ㅠㅡ
eCos설치는 매우 간단하다.
먼저 다운로드를 해야하는데,
$ wget --passive-ftp ftp://ecos.sourceware.org/pub/ecos/ecos-install.tcl 을 실행하면 자동으로 /opt/ecos 폴더 아래 받아진다.
폴더로 따라 들어가 보면 ecos-install.tcl 파일이 있을 건데, 그 파일을 실행시킨다.
$ sh ecos-install.tcl
이 명령이 실행되지 않으면 tcl을 지원하지 않는 것이므로 패키지를 인스톨한다.
(eCos를 깔다보면 자신의 리눅스 컴퓨터에 아직 설치되지 않은 pakage가 많음을 느낄 것이다.
나는 4개 정도의 페도라 패키지를 인스톨했다.
패키지 인스톨 명령은 "yum install (패키지 이름)" 이다.)
설치 중 첫번째로 물어보는 것은 어느 사이트에서 다운받을 것이냐 인데, 아무데서나 받으면 된다.
두번째로 설치 디렉토리를 물어본다. 기본 값은 /opt/ecos이다.
세번째로 타겟 보드의 코어를 물어본다.
그것은 타겟보드가 arm인지 pc인지 등을 물어보는 것인데, 그냥 전부다 체크해주면 된다.
언제 어떤 보드를 쓰게 될지 모르므로..
아니면 원하는 코어만 체크한다.
그리고 나서 eCos 명령어를 사용하기 위해서는 명령어가 필요하다.
$ . /opt/ecos/ecosenv.sh
eCos를 사용하게 될 때마다 (즉, 시스템이 부팅된 후) 매번 이 명령어를 실행시켜줘야 하는데, 그게 귀찮으므로 .bash_profile에 명령어를 넣는다.
.bash_profile에 넣을 경우에는
. /opt/ecos/ecosenv.sh 를 추가해주고 저장한다음, .bash_profile의 수정내용을 적용시킨다.
$ source .bash_profile
잘 설치가 되어 있는지 확인을 해보려면, 아무 경로에나 빈폴더를 하나 만들고 그 안에서 configtool 이라고 명령을 실행해 본다.
$ configtool
이 때 configtool 화면이 뜬다면 제대로 설치된 것이 맞다-_-)b