본문 바로가기
ARM 프로세서에 uC/OS2 포팅을 위한 준비사항은?

뭘 알아야 이해를 하지

uC/OS2 포팅하기 위한 단계가 있답니다.
개발 환경 준비 - 크로스 컴파일 설치 및 환경 설정 - uC/OS 빌드
개발 보드의 플래시 메모리에 바이너리 넣기 - 어플리케이션 프로그램 개발 - 디버깅 - 개발 완료

첫 번째, 개발 환경 준비 단계부터 자세히 알아 보죠. 우선 다음과 같은 사항이 준비 되어야 한답니다.

1. 암 시피유(프로세서) 선정 및 개발 보드
2. 크로스 컴파일러
3. uC/OS2 소스
4. 개발 보드 BSP

암 시피유(프로세서) 및 개발 보드 준비는 어떤 암 시피유에다 uC/OS2를 포팅할지 결정해야 해요. uC/OS2는 많은 시피유에서 포팅된 OS라 결정하시는데 크게 어려움은 없을 것 같아요. 시피유는 ARM9 코어를 가진 ARM920T와 ARM11 코어를 가진 ARM1176JZF-S를 중심으로 포팅을 해 보도록 하죠. ARM920T 시피유는 여러 회사에서 만든 MCU 중에 가장 쉽게 구할 수 있는 것이 S3C2410이랍니다. 그럼 이제 S3C2410 MCU 가진 개발 보드를 구매해야 하죠. ARM1176JZF-S 시피유는 S3C6410 MCU를 가진 보드가 가장 쉽게 구할 수가 있답니다. 개발 보드는 많은 업체에서 보드를 만들기 때문에 우선 업체에 대해 알아보고 의뢰하시면 구매 할 수 있답니다. 보드 구매하실 때 주의사항 몇 가지 알려 드리죠잉~~!!
1. 그 보드가 단종된 제품인지 아닌지?
2. BSP가 있는가?
3. 기술지원은 받을 수가 있는가?

단종된 보드라면 매우 싼 가격에 구매할 수가 있지만, 만약 보드가 고장이 난다면 A/S 받기가 무척 힘들어 구매한 보드가 무용지물이 될 수가 있어요. 그래서 반드시 단종된 제품인지 아닌지 파악 해 보셔야 해요. BSP(Board Support Package)란 구매한 보드에 관련된 소스나 포팅된 RTOS 소스들을 들어 있는 구성 품목이라고 보시면 된답니다. 보통 개발 보드를 구매하시면 개발용 보드+CD+기타 소품들로 구성되어 있고, CD안에 BSP가 들어 있어요. BSP안에 어떤 RTOS가 포팅 되어 있는지, RTOS포팅하는 방법에 대한 문서는 잘 되어 있는지 등 잘 살펴봐야 해요. 그리고 제일 중요한 게 기술지원이랍니다. 문서대로 따라서 하면 잘 되겠지만 만약 개발 환경이 다르다면 문서처럼 할 수가 없을 때가 종종 있답니다. 이를 때 보드를 제작한 회사에다 문의를 하면 성의껏 답변을 해 주며 기술지원을 잘 해 주는 곳이 좋답니다. 그런 회사는 꾸준히 BSP도 업데이트를 해 주고 A/S도 잘 해 주죠. 이제 보드가 준비가 되셨다면 다음 단계로 가보죠.

두 번째, 크로스 컴파일러를 설치해 보죠. 보드를 구매하셨다면 CD안에 크로스 컴파일러가 대부분 들어 있답니다. 하지만 보드 구매가 아니라 주변에서 보드만 달랑 구해서 가지고 계신다면 크로스 컴파일러를 구하셔야 해요. 컴파일러는 상용 컴파일러와 프리웨어 컴파일러가 있는데, 아무래도 쉽게 구할 수가 있는 프리웨어 컴파일러인 GCC를 사용하도록 하죠. ARM920T 시피유와 ARM1176JZF-S 시피유를 가지고 있으니 각각 시피유에 맞는 컴파일러를 구해보아요. ARM920T는 GCC-3.4.3을 추천해 드리며, ARM1176JZF-S는 GCC-4.1.1을 추천해 드립니다. 다운을 받으셨다면 호스트 피시에 설치를 해 주세요. 설치가 끝나면,
C:\ARMGNU 이라는 폴더로 구성이 된답니다.
이제 컴파일 설치가 끝났으니 uC/OS2 소스와 개발 보드 Bringup 소스를 준비해야 해요. 소스들은 웹에서 구하시거나 블로그, 카페 등에서 구하시면 돼요. uC/OS2는 학습용으로는 프리웨어 버전이라 쉽게 구할 수가 있답니다. uC/OS2는 계속해서 업데이트가 되기 때문에 가장 최신버전이나 안정된 버전을 구하시면 되는데, 여기서는 uC/OS2 2.52 버전을 사용하도록 할께요. uC/OS2 소스를 받아보시면 10개의 *.c 파일과 하나의 *.h파일로 구성되어 구성되어 있어요. 마이크로 커널이라서 소스가 그다지 많지는 안답니다. 이러한 RTOS는 컴파일 되고 나면 RTOS+Application 하나의 바이너리로 만들어 진답니다. 그리고 개발자가 uC/OS2 소스를 직접 수정하실 일은 거의 없답니다. uC/OS 소스만큼 중요한 소스가 바로 개발 보드 Bringup 소스랍니다. 이 소스에는 주로 Startup.s 파일과 uC/OS가 동작하기 위해 ARM9용으로 되어 있는 파일이 필요하고, 개발 보드 구매를 하셨다면 소스가 있겠지만 그렇지 않다면 직접 준비하셔야 해요. 우선 Bringup 소스가 없을 경우, 가지고 계신 보드와 가장 유사한 보드가 뭐가 있는지 알아보고 블로그나 카페를 통해서 가장 유사한 보드의 Bringup 소스를 다운로더 받고 개발자가 직접 소스를 수정해 가며 포팅을 하는 거랍니다. 다음으로는 컴파일 환경을 살펴보아요.
컴파일을 하기 위해서는 우선 필요한 파일이 makefile, linker script, uC/OS2 소스들, 개발 보드 Bringup 소스랍니다. makefile을 만들기 위해서는 우선 uC/OS2 소스와 개발 보드 Bringup 소스폴더 정리를 해 보도록 하죠.



이제 makefile을 만들어 보아요.

▶코드 Makefile

##### File Definition ####
PRJ = ucos_ii
INIT1 = startup
INIT2 = mmulib
INIT3 = Os_cpu_a
CM1 = consol
CM2 = mmu
CM3 = frmwrk
CM4 = Os_cpu_c
CM5 = OS_CORE
CM6 = OS_FLAG
CM7 = OS_MBOX
CM8 = OS_MEM
CM9 = OS_MUTEX
CM10 = OS_Q
CM11 = OS_SEM
CM12 = OS_TASK
CM13 = OS_TIME
CM14 = EX1
CM15 = Cache
CM16 = EX2
CM17 = again
CM18 = examples
CM19 = EX3_normal
#### Destination path Definition ####
SRC=.
INC=.
OBJ=.
ERR=.
BIN=.
PRE=arm-elf
S3C2410=./s3c2410/src/
COMMON=./common/src/
UCOS=./ucos_src/src/
EXAM=./exam/src/
#### ARM tool Definition ####
ARMASM = $(PRE)-as
ARMCC = $(PRE)-gcc
ARMLINK = $(PRE)-gcc
ARMSIZE = $(PRE)-size
ARMOBJDUMP = $(PRE)-objdump
ARMOBJCOPY = $(PRE)-objcopy

#### Option Definition ####
AFLAGS = -marm9tdmi -EL --gdwarf2
CFLAGS = -g -gdwarf-2 -O0 -c -marm -mcpu=arm9tdmi -mlittle-endian -mno-apcs-frame -mno-apcs-stack-check
LFLAGS = -eEVT -nostartfiles -Xlinker --script=linker.ld -lc #-L.

OBJS = $(INIT1).o $(INIT2).o $(INIT3).o $(CM1).o $(CM2).o $(CM3).o $(CM4).o $(CM5).o $(CM6).o $(CM7).o $(CM8).o $(CM9).o $(CM10).o $(CM11).o $(CM12).o $(CM13).o $(CM14).o $(CM15).o $(CM16).o $(CM17).o $(CM18).o $(CM19).o

all: clean $(PRJ).elf
$(PRJ).elf: $(OBJS)
$(ARMLINK) $(LFLAGS) -o $(PRJ).elf $(OBJS)
$(ARMSIZE) $(PRJ).elf
$(ARMOBJCOPY) $(PRJ).elf --output-target=binary $(PRJ).bin
@echo ----------------------------------------------------
@echo Finished ...

clean:
del -f *.o
del -f $(PRJ).bin
del -f $(PRJ).elf

$(INIT1).o: $(S3C2410)$(INIT1).s
$(ARMASM) $(S3C2410)$(INIT1).s $(AFLAGS) -o $(INIT1).o

$(CM1).o: $(S3C2410)$(CM1).c
$(ARMCC) $(CFLAGS) $(S3C2410)$(CM1).c -o $(CM1).o

$(CM19).o: $(EXAM)$(CM19).c
$(ARMCC) $(CFLAGS) $(EXAM)$(CM19).c -o $(CM19).o


▶코드 linker.ld

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
__TEXT_START__ = 0x00000000;
__DATA_START__ = 0x00020000;
__BSS_START__ = 0x30030000;

SECTIONS
{
.text __TEXT_START__ :
{
*startup.o(.text)
*(.text)
*(.text.*)
}
PROVIDE (__etext = .);

.rodata :
{
*(.rodata)
*(.rodata.*)
}

. = ALIGN(4);
__INIT_DATA_START__ = .;
.data __DATA_START__ :
{
*(.data)
*(.data.*)
SORT(CONSTRUCTORS)
}
. = ALIGN(4);
PROVIDE (__DATA_END__ = .);

__bss_start__ = .;
.bss __BSS_START__ :
{
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN(4);
}
. = ALIGN(4);
__bss_end__ = . ;

PROVIDE (end = .);
}



세 번째, 이제 make를 해서 빌드를 해 보죠.
CMD> make
......
arm-elf-size ucos_ii.elf
text data bss dec hex filename
62876 1996 58064 122936 1e038 ucos_ii.elf
arm-elf-objcopy ucos_ii.elf --output-target=binary ucos_ii.bin
----------------------------------------------------
Finished ...

이 모든 과정이 끝나고 나면 생성된 파일들이랍니다.

ARM11에 포팅을 하시려면 ARM9에서 하는 것과 동일하며 대신 컴파일러를 GCC-4.1.1로 설치하셔야 한답니다. 그런데 GCC-4.1.1을 설치하시고 make를 하시면 다음과 같은 에러가 발생해요.

ARM11은 floating 연산을 Hardware하지 않고 Software적으로 한답니다. GCC-4.1.1에는 Hardware적인 라이브러리로 만들어져 있기 때문에 컴파일러를 설치하실 때 Software적으로 처리된 컴파일러를 구해서 설치하시기 바래요.

네 번째, 개발 보드의 플래시 메모리에 바이너리 넣는 과정이랍니다. 일반적으로 이러한 과정을 "플래시 프로그램" 이라고 불려지고 있지요. 플래시 프로그램 하기 위해서는 개발 보드에 어떤 플래시 메모리가 있는지 제일 먼저 확인을 해야 해요. 일반적으로 노어 플래시 메모리 또는 낸드 플래시 메모리가 많이 사용되고 있는데, 컴파일된 바이너리 용량이 크지 않다면 보통 노어 플래시 메모리를 사용하죠. 플래시 메모리에 아무것도 없다면 하드웨어 디버거인 JTAG 장비를 통해서 노어 플래시 메모리에 ucos_ii.bin 파일을 간단히 올릴 수가 있답니다.
JTAG 장비를 이용해서 노어 플래시 메모리에 올리려면 스크립트가 필요하답니다.


▶코드 Nor_flash.cmm


B::
SYS.RES
SYS.CPU ARM920T
SYS.U
FLASH.res
FLASH.Create 1. 0x000000--0x00FFFF 0x2000 TARGET word
FLASH.Create 1. 0x010000--0x3FFFFF 0x10000 TARGET word
FLASH.TARGET 0x30000000 0x30001000 0x1000 ~~\demo\arm\FLASH\WORD\AT49F100.bin
FLASH.Erase ALL
FLASH.Program ALL
d.load.elf c:\uc-os2\ucos_ii.elf /nosymbol /word
FLASH.Program OFF

ENDDO

다음은 어플리케이션 프로그램 개발 단계랍니다. 다음 유닛에서 보다 자세히 다루어 보도록 할게요.


Makefile – “302” Linker.ld – “303” 노어 플래시 메모리 - "203" 제이텍 – “207”

Linked at 친절한 임베디드 시스템 개발자.. at 2010/08/09 01:02

... nbsp; 401 임베디드 오에스(OS) 용어정리 402 ARM Processor에 uC/OS2 포팅을 위한 준비사항은? 403 uC/OS2 포팅 완료까지의 절차가 어떻게 되죠? &n ... more

친절한 임베디드 시스템 개발자 되기 강좌 글 전체 리스트 (링크) -



댓글





친절한 임베디드 개발자 되기 강좌 글 전체 리스트 (링크) -