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파일이 생긴다.

이것을 보드에 올리면 된다.

댓글 없음:

댓글 쓰기