메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

설계와 구현을 통한 임베디드 OS의 이해와 응용(3) - cuteOS의 시작 부분(3)

한빛미디어

|

2005-12-26

|

by HANBIT

17,524

저자: 서민우
출처: 임베디드월드

* 설계와 구현을 통한 임베디드 OS의 이해와 응용(1) - Overview
* 설계와 구현을 통한 임베디드 OS의 이해와 응용(2) - 개발환경 구성 및 부트로더 작성(1)
* 설계와 구현을 통한 임베디드 OS의 이해와 응용(2) - 개발환경 구성 및 부트로더 작성(2)
* 설계와 구현을 통한 임베디드 OS의 이해와 응용(3) - cuteOS의 시작 부분(1)
* 설계와 구현을 통한 임베디드 OS의 이해와 응용(3) - cuteOS의 시작 부분(2)


다음은 memsetup.S 파일의 내용이다. 

memsetup.S
#define BWSCON 0x48000000

.globl memsetup
memsetup:
    ldr      r0,=SMRDATA
    ldr      r1,=_start
    sub    r0,r0,r1
    ldr      r1,=BWSCON
    add    r2,r0,#13*4
0:
    ldr      r3,[r0],#4
    str      r3,[r1],#4
    cmp   r2,r0
    bne    0b

    mov    pc,lr

    .ltorg
SMRDATA:
    .word 0x221d4d20
    .word 0x00000700
    .word 0x00000700
    .word 0x00003f4c
    .word 0x00001f4c
    .word 0x00003f4c
    .word 0x00000700
    .word 0x00018009
    .word 0x00018009
    .word 0x008e0459
    .word 0x00000031
    .word 0x00000030
    .word 0x00000030

S3C2440A SOC는 총 8 개의 메모리 뱅크를 지원하며, 각각의 뱅크는 최대 128 MB의 크기를 가질 수 있다. 이 중 앞의 6 개의 뱅크에는 ROM이나 SRAM을 붙일 수 있으며, 마지막 2 개의 뱅크에는 ROM, SRAM, 또는 SDRAM을 붙일 수 있다. 본인이 사용하는 보드에는 첫 번째 뱅크에 1MB 크기의 NOR flash 롬, 7 번째 뱅크와 8 번째 뱅크에 각각 32MB 크기의 SDRAM이 있다. 

S3C2440A SOC의 메모리 뱅크는 다음의 13개의 레지스터를 이용하여 설정할 수 있다. 

BWSCON        (0x48000000)
BANKCON0     (0x48000004)
BANKCON1     (0x48000008)
BANKCON2     (0x4800000c)
BANKCON3     (0x48000010)
BANKCON4     (0x48000014)
BANKCON5     (0x48000018)
BANKCON6     (0x4800001c)
BANKCON7     (0x48000020)
REFRESH        (0x48000024)
BANKSIZE      (0x48000028)
MRSRB6         (0x4800002c)
MRSRB7         (0x48000030)

그럼 각각의 레지스터의 역할을 간략하게 살펴 보기로 하자. 

BWSCON 레지스터는 각각의 뱅크에 대한 데이터 버스 폭에 대한 설정(예를 들어, 8 비트로 접근할지, 16 비트로 접근할지, 32 비트로 접근할지), 데이터를 각각의 뱅크로부터 읽는 경우 그 시간이 길 경우에 WAIT 신호를 고려할 지 등을 결정한다. 

BANKCONn(n = 0,1,2,3,4,5) 레지스터를 이용하여 n에 해당하는 뱅크에 대한 메모리 접근 타이밍을 설정할 수 있다. 예를 들어 ROM이나 SRAM등을 접근할 때는 Address, Chip Selection, Data 등의 순서로 신호를 내 보낸다. 이 경우 각각의 신호간 적당한 시간 간격을 주어야 하며, 이러한 시간에 대한 설정을 이 레지스터를 이용하여 설정한다. 

BANKCONn(n = 6, 7) 레지스터는 n에 해당하는 뱅크에 ROM이나 SRAM이 있을 경우는 앞에 설명한 내용과 같은 역할을 하며, SDRAM이 있을 경우는 tRCD(RAS to CAS delay)나 컬럼 어드레스의 크기가 얼만지를 설정한다. 

SDRAM의 경우 데이터를 유지하기 위해 주기적으로 데이터를 새롭게 해 주어야 하는데, 이와 관련된 기능을 REFRESH 레지스터를 이용하여 설정한다. 

BANKSIZE 레지스터는 SDRAM을 접근할 때 하나 이상의 데이터를 읽어오는 burst operation이나, 뱅크6, 7에 대한 메모리 맵 등을 설정하기 위해 사용한다. 

MRSRBn(n = 6, 7) 레지스터는 burst length, CAS latency, burst type 등 SDRAM과 관련된 기능을 설정한다. 

이상에서 메모리 컨트롤러와 관련한 13개 레지스터의 내용을 살펴 보았다. 이 중 SDRAM과 관련한 구체적인 설명은 여기서 다루지 않기로 한다. 삼성전자에서 나온 다음의 문서를 참고하기 바란다. 

• SDRAM Device Operations
• SDRAM Timing Diagram
• 256Mb E-die SDRAM Specification
• S3C2440A 32-BIT CMOS MICROCONTROLLER USER"S MANUAL Revision 1

memsetup.S 파일에서는 BWSCON 레지스터부터 시작해서 13개의 레지스터에 SMRDATA 번지에 있는 13개의 32 비트 데이터를 써넣는 역할을 한다. 

다음은 head.S 파일의 내용을 살펴 보기로 하자. 

head.S
.globl _start
_start:
stack_setup:
    ldr       r0,=_start
    sub     sp,r0,#4

    ldr       pc,=kmain

여기서는 sp의 값을 (0x30100000-4)의 값으로 설정한다. 그리고 kmain 루틴으로 뛴다. kmain 루틴은 main.c 파일에 정의되어 있다. 

다음은 main.c 파일의 내용을 살펴보자. 

main.c
#define rGPFDAT (*(volatile unsigned long *)0x56000054)

void kmain(void)
{
    int i;

    while(1) {
        rGPFDAT = rGPFDAT|0x000000f0;
        for(i=0;i<0x10000;i++);
        rGPFDAT = rGPFDAT&~0x000000f0;
        for(i=0;i<0x10000;i++);
    }
}

여기서는 led를 껐다가 켰다가 하는 동작을 무한히 반복한다. 

일단은 cute-boot 부트로더에서 cuteOS로 뛰는 과정을 보이기 위해 cuteOS 부분을 최대한 간단히 작성하였다. 다음 기사부터 cuteOS 부분을 본격적으로 작성해 나갈 것이다.

이상에서 부트로더의 나머지 부분과 cuteOS의 시작 부분을 작성해 보았다. 다음 기사에서는 head.S 파일에 MMU와 cache 설정 부분을 작성해 보고, exception 벡터 테이블, software interrupt 처리 루틴, 하드웨어 인터럽트 처리 루틴 등을 작성해 보기로 하자.
TAG :
댓글 입력
자료실

최근 본 상품0