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

안녕하세요? 늘 질문만 드리네요..

컴파일 하는 시점에 스캐터의 text, data 안의 변수들.. 전역변수,로컬 변수등의 주소 영역이 결정이
나게 되는데요. 예를 들면 스택을 사용하는 로컬 변수의 주소 영역을 변경시킬 방법이 있는지요?

간단히 예를 들자면)
text의 시작주소를 0x0으로 잡게 되면 로컬 변수의 주소 영역도 0x0 번지 주변으로 컴파일 시 잡히게 되는데요
이것을 0xA0000000 만큼 더해서 0xA0000000 번지 주변에 잡히게 만들어 주고 싶습니다.
혹시 이렇게 해줄 방법을 알고 싶습니다.

왜 이렇게 할려고 하는지 말씀드리겠습니다.

0xA0000000 번지에 해당 RTOS 이미지를 복사하여 실행해보면 코드 영역은
0xA0000000 가 더해져(PC-Related address방식) 제대로 되는것 같은데 로컬변수
영역은 이상하게 0x0번지 대로 접근하게 되어 fail이 납니다.
실제 0x0번지에는 flash 메모리가 있습니다.

0xA0000000만큼 더해지면 문제없을것 같은데 왜 로컬변수(스택사용)은 절대주소(?) 방식처럼 진행하는지 궁금합니다.

그럼 좋은 하루되세요


고현철

2009.02.26 23:50:38
*.32.117.22

stack안에 잡히게 되어 있고, 그것은 컴파일러에서 생성된 코드대로 동작합니다.

즉, 변동사항이 많은 부분입니다. 손대지 않는 것이 훨 좋습니다.

함상화

2009.02.27 00:43:58
*.12.214.121

안녕하세요. 스캐터 파일을 사용하신다면, Stack, Heap 등의 위치를 원하시는 대로 설정하실 수 있습니다.
Stack, Heap의 Address들을 어떻게 설정하셨는지 모르겠네요..
만약 Realview를 사용하고 계신거라면, __user_initial_stackheap()의 구현내용을 살펴보시면 될듯 합니다.

한석준

2009.02.27 04:03:52
*.110.91.31

답변감사합니다. 많은 도움이 되었습니다.

그렇다면 STACK 영역의 기준 주소를 변경할려고 하는데
스캐터 파일 상에서 수정이 가능한지요?
현재 Real View Tool을 사용중입니다.

__user_initial_stackheap() 을 보고 이래저래 수정을 할려고 하는데 잘 안되네요..

VOID   *System_SP;
UINT64  __user_initial_stackheap(VOID)
{
    UINT64          rtn_val;
    static UINT8    heap[1024]
   
    /* Get start address of heap in lower 32-bits (register r0) */
    rtn_val = (UINT64)&heap[0];

    /* Put stack pointer in upper 32-bits (register r1) */
    rtn_val |=  ((UINT64)System_SP << 32) ; 

    /* Return start address of heap */
    return (rtn_val);
}

여기서 System_SP 의 포인터 주소 부분에다가 0xA0000000 만큼 더하거나 빼고 하는데 안 안되네요.
간단히 더하거나 빼는 예제를 부탁드려도 될까요?

좋은 저녁되세요.

함상화

2009.02.28 01:07:28
*.12.214.121

System_SP를 수정하면 될듯합니다만.. 일단
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0205gk/Cihhdahf.html
위 링크를 살펴보시면 될듯합니다. (Realview 3.0 이상 버전은 사용해본적이 없어서..^^.)

Realview 2.2환경에서 간략히 Asm으로 적어보자면,
__user_initial_stackheap
LDR r0, =0x80800000  ; Heap base
LDR r1, =0x80E00000  ; Stack base (upper address of stack)
MOV pc, lr
물론 Scatter 를 작성하실때
HEAP 0x80800000 0x00200000
{ }
STACK 0x80A00000 0x00600000
{ } 
등으로 넣으셨다면, Image$$ZI$$Base, Image$$ZI$$Limit 등의 linker symbol 을 사용하실 수도 있습니다.

PS 1. RTOS에서 Standard C library의 사용목적을 확인하시고 Heap, Stack을 조절하세요.. 
PS 2. RTOS의 Boot-up부분에서의 각 mode 별 stack pointer 들도 확인하셔야 할듯 합니다.
PS 3. Exception vector도 processor 설정을 살펴보시고 0x00000000 혹은 0xffff0000으로 할당되었는지 확인하시구요..

즐거운 주말되세요.

한석준

2009.02.28 05:02:36
*.110.91.31

주옥같은 예제까지 알려주시고 정말 감사합니다.
많은 도움이 될것 같습니다.  꼭 한번 해보겠습니다.
함상화님도 즐겁고 행복한 주말되십시오.

한석준

2009.03.14 20:31:59
*.110.91.31

이 부분은 우선 많은 문제가 있어서 그냥 로컬 스택 영역도 0x0으로 해주었습니다.
조언주신 많은 분들께 감사드립니다.
List of Articles
번호 제목 글쓴이 날짜 조회 수
408 LM480KF01용 FPC 커넥터 & 스테레오잭 커넥터.. [2] just4you 2009-03-26 1185
407 GStreamer관련 질문드립니다. 정장석 2009-03-26 1303
406 카메라 I/F 신호 레벨 관련.. [4] just4you 2009-03-26 989
405 u-boot소스에서 pxa255용 PCMCIA카드를 사용할려면? [2] 한석준 2009-03-25 1057
404 VirtualBox로 부팅하면 "HostMemoryLow" 에러만 납니다.. [1] just4you 2009-03-25 1239
403 LCD Backlight용 LED Driver 선택 중에... [4] just4you 2009-03-24 984
402 카메라 모듈 업체좀 알려주세요.. [1] just4you 2009-03-24 890
401 mkimage 옵션 중 -O(os type 선택) 파라메터 설정 문제. [2] 한석준 2009-03-20 1333
400 scheduler에서 아래의 BUG message는 어떤 상황에서 발생하나요? [3] 이현배 2009-03-17 1154
399 ARM 프로세서와 Peripheral 디바이스연결시 GPIO설정 방법 문의 [2] 한석준 2009-03-16 1327
398 ARM에서 modified virtual address와 process id가 왜 필요할 까요... [3] 이종진 2009-03-16 1872
397 LAN91C111 칩 메뉴얼의 Reset 부분에 관한 문의 [3] 한석준 2009-03-14 1394
396 ARM 보드 구입을 생각하고 있습니다만... [2] 안병희 2009-03-12 1051
395 U-boot상에서 Ping 테스트 에러(LAN91C111 이더넷 드라이브 사용) [2] 한석준 2009-03-11 2612
394 LAN91C111 이더넷 드라이버 핀과 GPIO 설정 문의 [4] 한석준 2009-03-10 1565
393 ssh와 serial terminal에서 busybox또는 signal등의 동작이 다른지요? [7] 이현배 2009-03-04 2231
392 cygwin을 사용하여 u-boot 컴파일 가능? [2] 한석준 2009-03-03 2648
391 driver install 관련 질문 [4] 최영진 2009-02-27 1125
» 로컬 스택 영역 수정 가능한가요? [6] 한석준 2009-02-26 1289
389 fpu가 들어있는 arm 은 어떤것이 있을까요? [4] 성진호 2009-02-26 1846

사용자 로그인