기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

---------------arm-linux-gcc로 컴파일하는 ucos-ii용 링크디스크립터---------------------

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") //출력 파일 형식 지정
OUTPUT_ARCH(arm)        //출력 아키텍처 지정
ENTRY(reset)                //시작위치 지정 -> start_up.s 파일에 있음 reset 핸들러
SECTIONS
{
        . = ALIGN(4);        //“ . ”을 주소 값을 지정하기 위한 변수로 4바이트씩 묶어서 읽음.
        . = 0xA0000000;  //RAM의 주소가 0XA0000000 번지부터 시작이다.(하이버스에서)
        __btext = .;        //__btext라는 변수에 4바이트씩 묶어서 읽는 0xA0000000번지를 저장
        .text : { *(.text) } //text 부분 코드를 RAM의 0xA0000000 번지부터 적재
                __etext = .; //text 부분의 끝을 나타내는 __etext변수에 text의 주소 값을 넣음

        . = ALIGN(4);
        .rodata : { *(.rodata) } //.rodata 부분에 Read Only Data 부분을 적재, 즉 text 마지막 부분
                __erodata = .;    //부터 rodata를 적재, rodata의 마지막 주소를 __erodata에 저장

        . = ALIGN(4);
        .data : { *(.data) } //.data변수에 data부분을 저장
                __edata = .;  //__edata에 data부분이 저장된 마지막 주소를 저장

        . = ALIGN(4);
        .got : { *(.got) } //역시 마찬가지로 global offset table 이라고 들은 것 같음. 해당 부분을
                __egot = .; //메모리에 적재하고, __egot 변수에 got의 마지막 주소를 저장
}

하이버스 PXA255B SA1110 메모리 컨트롤러
0x0 번지부터 32M nor Flash.
0xA0000000 번지부터 64M SDRAM.

Memory Layout
Text part -> Rodata part -> Data part -> Got part        
0xA0000000 번지부터 시작( RAM 시작 번지 )

---------------------------------------------------------------------------------------

                < 처음 이숍보드용 ucos를 받아 들고서 >

이숍보드용 ucos는 RVDS로 컴파일되어 있어서, 보드에 올려보고자 어둠의 경로를 통해서

RVDS 2.2를 받았지만 ZI 영역이 지원이 되지 않는 관계로 사용이 불가 하다하여,

RVDS 3.0 버젼으로 다시 다운 받았지만, 라이센스를 구하지 못해서 gcc를 이용하여고 컴파일

하려고 보니, 링크 디스크립터와 보드 초기화 해주는 부분이 없었습니다.

그래서 ucos의 flash.scat, ram.scat 파일이 링크디스크립터와 비슷하게 생기긴 했고,

init.s와 vectors.s 파일이 start_up.s 파일과 비슷하였지만, 보드 초기화 부분이 없었습니다.

그리고 링크 디스크립터의 내용도 두개로 나누어져 있으며, 플레시와 램을 따로 적재하는

부분등 무언가 길이 보이지 않았습니다. 제가 공부한 부분 부터 보여드리겠습니다.

----------------< flash.scat 파일의 내용 >----------------------------------

이 scatterloading descriptor file이 정의하는 내용 : 1개의 로드 영역(ROM_LOAD)과 5개의 실행영역(ROM_EXEC, RAM, HEAP, STACK, UART0).
모든 프로그램(코드와 데이터)는 ROM의 ROM_LOAD영역에 놓은다.

Read Only(RO) code는 ROM_EXEC으로 부터 수행될 것이다. 그리고 그것은 실행 주소(0x0)은 로딩 주소(0x0)와 같다, 그래서 옴겨질 필요가 없다.
exception vector table은 반드시 0x0번지에 나타나야 한다. 그래서 이미지의 처음에 위치했다.

Read Write data는 ROM_LOAD영역에서 RAM에 0x28000000번지로 옴겨질(복사될) 것이다.
ZI data는 RAM에 만들어(초기화 되어) 질 것이다. RW data위에,

HEAPS 영역은 ZI코드 바로위를 heap의 끝으로하여 위치해있다. 그리고 heap은 그 주소부터 커져간다.
STACKS 영역은 각 모드의 스택을 저장하기 위해서 사용되는 메모리의 꼭대기를 위치시키기 위해서 사용된다.
stack들은 이 주소부터 아래로 자란다.

UART0 역역은 UART0 레지스터들의 위치를 mapping 시키기 위해서 사용된다.

UNINIT이라고 표시된 영역들은 초기화 되지 않고 남겨질 것이다. 즉, 시작할때, 영역들은 0으로 초기화 되지 않을 것이다.

FLASH 0x24000000 0x40000000
{
    FLASH 0x24000000 0x4000000
    {
        init.o (INIT, +First)    
        * (+RO)    
    }
    32bitRAM 0x0000 0x0003BFFF
    {
        vectors.o (VECT, +First)
        * (+RW, +ZI)
    }
    ARM_LIB_HEAP    0x0003C000    EMPTY    0x00004000-0x00002000    {}
    ARM_LIB_STACK    0x00040000    EMPTY -0x00002000            {}
}

링크 디스크립터와 같은 용도로 보인다.
코드를 flash와 ram영역으로 나누어서 메모리에 적재 된다.
RO 코드는 flash에, RW, ZI 데이터는 ram에 적재된다.

FLASH Memory Layout
RO code -> . . .
                
RAM Memory Layout
RW code  . . . -> ZI code . . . ->  Heap-area . . . ->  Stack-area   . . .
    
이런 순서로 되어있는 것 같다.

--------------------------< ram.scat 파일 내용 >-----------------------------------
설명은 위와 동일

32bitRAM 0x0200 0x0003BFFF
{
    32bitRAM 0x0200 0x0003BFFF
    {
        vectors.o (VECT, +First)
        * (+RO)
        * (+RW, +ZI)
    }
    ARM_LIB_HEAP    0x0003C000    EMPTY    0x00004000-0x00002000    {}
    ARM_LIB_STACK    0x00040000    EMPTY -0x00002000            {}
}

RAM Memory Layout
RO code . . .  -> RW code . . . -> ZI code . . . -> Heap-area   . . . . . .   STACK-area <-

----------------------------------------------------------------------------------

                < 고도리님의 조언을 받고 나서 >

일단은 이숍용 ucos가 u-boot위에 올라가기 때문에 보드 초기화 부분이 없다는 설명을 들었습니다.

그리고 설계 방식이 두가지가 있는데,

1. u-boot에 ucos을 올리는 방법
2. ucos에 보드 초기화 루틴을 집어 넣는 방법.

제가 처음에는 첫번째 방식으로 계획을 잡고, 찾아보니 링크디스크립터와 start_up.s(보드초기화 하는 부분)이 없었습니다.

그래서 직접 작성하려 해보았지만 하이버스는 nor형 플레시인데 이숍보드는 nand형 플레시이기 때문에 어떻게 설계를 해야 하는지

어떤 부분을 참고해서 작성을 해야할지 막막했습니다.

저의 처음 계획은 하이버스의 링크디스크립터를 가져와서 그냥 사용하고, 이숍보드용 init.s와 vectors.s 파일과 하이버스용 start_up.s파일을 비교해서

없는 보드 초기화 부분을 u-boot에서 찾아서 넣으려 했습니다.

링크디스크립터는 어떤 부류의 코드를 어떤 메모리부터 어떤 순서로 적재를 시킬지를 결정하는 파일인데,

플레시 메모리의 형태가 다른데 그대로 사용해도 되는지?

보드 초기화 하는 부분을 보기위해서 cpu.s , lowlevel~.s , start.s부분을 보아도 하이버스의 start_up.s에 없는 부분이 있어서

보드가 다르니까 초기화 하는 부분이 다른것이라는 생각에 이숍보드는 어떤 부분을 초기화 해줘야하는지 그리고 초기화 하기위해서 어떤

자료를 참고해야하는지를 알고 싶습니다.

아참, 고수님들이라면 위에 2가지 설계방식중 어떤 방식을 선택하실 건가요?

그리고 선택하셨다면 어떤 부분을 어떤 자료를 보고 어떻게 작성하면 좋을까요?

제가 공부한 내용과 질문내용을 두서없이 올리다보니 질문이 길어 졌내요..

아참 혹시 저도 소모임에 참여할 수는 없을 까요?

박상협

2008.03.05 04:01:19
*.240.201.245

아참, 조언해주신대로 ucos gcc port로 구글링을 하니

대부분 ppc와 아트메가 였습니다 그중에 LPC용 하나를 찾았지만

제가 이렇게 해보면 되겠다는 느낌을 주지는 못했습니다.

꼭 슈더 코드 처럼 작성이 되어 있는거라..

그런 것이라도 만약 필요한분 있으시면

답글달아 주시구요..

아무튼 지식을 나누어 주시는 고수님들 감사합니다. ^^;

박상협

2008.03.05 04:06:54
*.240.201.245

아참 , 저도 ^^; 소모임에 참가 할 수는 없는지 궁금합니다.

지금 당장 않된다면, 어떤 조건을 갖추어야 할까요?

장병남

2008.03.05 04:20:33
*.131.127.180

오,, 드뎌 시작되었군요,,, ^^ 저도 집에가서 노트북 켜고 해봐야 할듯,, 박상협님 화이팅~!!

박상협

2008.03.05 05:47:50
*.240.201.245

감사합니다. - 같은 일에 관심을 가지고 계시는 분을 만나다니 ^^;

해보고 알게된 사항이 생기면 바로바로 업데이트 하겠습니다. ^^

고도리

2008.03.05 05:56:50
*.187.44.115

소모임 shutdown했지만.....^^

지금 저희가 하려는 일과 유사한 부분이 있고, 관심이 많으시네요...
소모임 게시판에 들어오실 수 있을겁니다.

이번주 토요일에 소모임이 있습니다.

고도리

2008.03.05 06:02:08
*.187.44.115

음.....두가지 방법 다 동일합니다만.....

궂이 ro data부분을 flash에 넣을 필요는 없습니다.
즉, 몽땅 ram으로 로딩하는 방식이 훨 편합니다.

ram이 작을 경우야 flash에 code영역을 넣어두는게 좋겠지만요

1. u-boot에서 device들을 초기화 한 후에 flash에 있는 ucos코드를 ram으로 적재하고 제어권을 넘겨줌...

2. u-boot코드를 ucos에 붙여넣고(실제로는 초기화 부분만) 초기화부분 끝에서 ucos의 코드를 ram으로 적재한 후 run....

이렇게 생각하신다면 동일한 방법이 될겁니다.

다르게도 할 수는 있지만요....ㅎㅎ
profile

김재훈

2008.03.05 06:16:16
*.46.174.24

두 가지의 선택 방식은 uC/OS의 이식 목적에 따라서 차이가 납니다.

첫 번째. uBoot에 uC/OS를 로딩하는 방법.
이 방법은 테스팅 목적에 많이 사용됩니다. 즉, uBoot에서는 다양한 운영체제를 부팅할 수 있습니다. (Linux,WinCE,uC/OS 등)
사실, 부트로더를 교체하는 것은 상당히 번거로운 방법이 수반 됨으로 간단하게 uBoot를 사용해서, 부트로더 교체 없이 다양한 운영체제를 사용할 수 있다는 장점이 있습니다. 그리고 uBoot에서 지원하는 상당히 많은 기능들을 이용할 수 있다는 것도 있겠죠. 한 마디로 기능의 다양성 때문에 선택하는 수단이라고 생각하시면 됩니다.

두 번째. uC/OS에 보드 초기화 루틴을 집어 넣는 방법
이 방법은 양산 목적의 장비에 많이 사용됩니다. 장비의 리소스의 여유가 없을 때, 빠른 부팅 시간을 요구 할 때, S/W의 개발 목적과 동작 방법이 정확하게 정의되어 있으며, 제작한 코드에 대해서 더이상 수정이 필요치 않을 때 이 방식을 사용 합니다.

참고로, 하이버스 XScale 계열의 스타트업 코드에 비해, MP2530F 용 uBoot의 스타트업 코드가 빠진 부분이 있는 것은, uBoot는 완전한 스타트업 코드를 가지고 있지 않기 때문 입니다. AESOP MP2530F의 경우 uBoot 이전에 NAND Boot라는 또 다른 부트로더가 존재하며, 이 부트로더에 의해 uBoot가 로딩 되는 것 입니다. 따라서 클럭이나 메모리 등의 중요한 설정들은 NAND Boot에서 이미 기본적인 것들이 초기화 하고 uBoot를 부팅 시켜주기 때문에, 하이버스 XScale 계열 장비에 비해 스타트업 코드가 없어 보이는 것 입니다. ^^

이것은 NOR Flash 부팅 방식과 NAND Flash 부팅 방식의 큰 차이점 중에 한가지 입니다. 따라서 NOR Flash 부팅 방식에 비해 NAND Flash 부팅 방식이 구현 난이도가 높습니다.

박상협

2008.03.05 06:38:02
*.240.201.245

아 감사합니다. - 그저 감탄사만이 나오네요

저도 게시판을 읽어보면서 uart -> nand -> uboot -> 운영체제 이렇게

로딩 순서라는 것은 알았지만, 왜 스타트업 코드가 적인지에 대한 의문도

풀렸고, 방법론에 따른 장점도 배울수 있는 기회가 된것 같네여 ^^

일단은 그럼 제가 시도해 보려는 방식은 RAM에 모든 코드를 적제하는

방식으로 하고 ucos에 모든 스타트업 코드를 넣어 보려고 합니다.

일단은 cpu나 ram 초기화는 데이터 시트를 한번 찾아 볼 계획이구요.

^^; 한참 땅을 파야겠내요 ..

그럼 성과나 질문사항이 생길때만다 경과 보고및 질문을 올리도록

하겠습니다.

김광준

2008.03.05 08:02:44
*.236.89.106

MMU를 설정하여 메모리 맵을 적절하게 설정해 주어야 할것 같습니다.
아니면 ro_base를 다른 주소로 사용하려 한다면 인터럽트 벡터부분의 코드를 LDR pc,address 형식으로 사용해야 할 필요가 있습니다.

박상협

2008.03.05 17:43:09
*.240.201.245

조언해주셔서 감사합니다 ^^.

조언해주신 내용을 기반으로 u-boot의 start.s와 lowlevel_init.s 부분을

자세히 읽어 봐야 겠네요 ^^;
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
5388 arndale board 구입후 포팅 여부 판단 방법 [3] monad 2012-12-20 1529
5387 Arndale Board용 linaro Kernel Build 방법? [1] Supsupi 2014-08-05 1528
5386 프레임 버퍼 픽셀 값 쉬프트 연산하는 방법 [1] 박용순 2012-05-17 1527
5385 ODROID X2 codec 지원 리스트? [3] 신현호 2013-05-21 1527
5384 [AESOP 관리자님께]터치스크린 컨트롤러 IC 에 대해 문의드립니다... [3] 구진호 2008-03-08 1526
5383 [도움요청] S3C6400 [7] 이준호 2008-09-02 1525
5382 [CGI 관련 질문] 웹 페이지에 이상한 글자가 표시되요.. file [2] 허경 2012-02-10 1524
5381 [ALL-100] ALL-100 롬 라이터 사용법 질문 드립니다. [완료] [4] 김유석 2007-02-06 1523
» 제목 : gcc로 ucos 이숍보드에 포팅하기 관련 질문 - 하이버스용 링... [10] 박상협 2008-03-05 1523
5379 Alsa record 관련 질문 드립니다. [9] jaeokbr 2012-08-06 1523
5378 aesop v210보드 안드로이드 소스 [2] 김정중 2013-04-25 1523
5377 CHIP ID 가 안읽어지는 경우 [3] lveritas 2014-07-15 1523
5376 진저브레드에서 이동식 디스크(UMS) 2개 연결하는 방법? [2] 텡구 2011-06-18 1522
5375 제가 만든 어플리케이션을 보드가 부팅했을 때 자동으로 실행 되게하... [7] 혜민아빠 2012-03-27 1522
5374 c100 보드, 커널 및 안드로이드 관련 소스 [2] 김정중 2013-04-10 1521
5373 해외사이트에서 임베디드 보드 구매시 관세, 부가세, 배송료, 배송기... [3] howwow20 2010-07-31 1520
5372 directfb + gtk2 + webkit 1.2.7 (without X11)관련 문의 [3] laconicblue 2012-03-13 1520
5371 S5pv310의 GPL2(0)를 인터럽트로 사용 하려면 어떻게 해야 되지요.? [3] GloomyDay 2013-01-27 1520
5370 리눅스 응용프로그램 자동 실행 [3] jclab 2012-06-08 1519
5369 회로도 관련 질문이 있습니다. [7] sonbong 2012-03-27 1519

사용자 로그인