기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요..
SMDK C100 WinCE 6.0 BSP를 기준으로 이솝의 보드를 테스트해보고 있는데..
테스트를 해본 결과 Steploader가 동작이 안됩니다.
(된다고 하시는 분이 계시긴 한데.. 제가 직접 테스트한 결과론...)
Main 함수에서 변수를 사용하지 않는 경우에는 정상 동작합니다만..
내부 변수를 사용하거나 함수를 호출하게 되면 리셋이 됩니다.
(리셋 핸들러는 제외한 나머지들은 루프를 돌기 때문에 동작을 반복하질 않습니다만.
메인 함수의 같은 동작을 반복하는게 리셋이 되는 것으로 보입니다.
왜 그런지를 아직 모르겠지만요..)
이런 증상들로 인해 결론은..
Startup에서 C 함수의 스택 초기화가 문제인 것으로 보입니다..
Steploader는 이전의 구조를 유지해서인지 아니면 메모리가 부족해서 인지..
DDR에다가 스택 메모리를 할당하도록 되어있는데요..
이때 DMC 초기화에서 이상이 생겨서 스택이 정확하게 초기화가 되지 않나 싶습니다..
Steploader의 DMC 초기화 코드와 u-boot의 초기화 코드가 약간 차이가 납니다.
DMC 초기화에 해당하는 코드와 관련된 파일만 첨부합니다..
- Steploader
: SMDKC100_WinCE60_FMD_REL_2.00_090611PLATFORMCOMMONSRCSOCS5PC100_SEC_V1OALSYSTEMS5PC100_InitSystem.c의 void InitLPCON(void) 함수
- u-boot
: u-boot-1.3.4-aesop.100428cpus5pc1xxs5pc100cpu_init.S의 mem_ctrl_asm_init: 루틴
C100의 데이터쉬트 iROM과 메모리맵을 참고해보면..
낸드 부팅시 iRAM이라는 곳에 BL1 로드되는 동시에 BL1의 스택으로 사용할 공간이 마련되어 있습니다..
작은 공간이긴 하지만 DMC를 초기화할 필요없이 이 영역을 스택으로 잡고 싶은데..
이렇게 하면 동작이 안되네요.
(제가 테스트한 코드는 아랫 부분 참조..)
=============================================================================================
;FIQStack_STEP EQU 0x00021000 ;(TOP_OF_STACKS_PHYSICAL - 0x0) ; 0x0002_1000 (0x100)
;IRQStack_STEP EQU 0x00020F00 ;(FIQStack_PA - FIQStackSize) ; 0x0002_0F00 (0x100)
;AbortStack_STEP EQU 0x00020E00 ;(IRQStack_PA - IRQStackSize) ; 0x0002_0E00 (0x100)
;UndefStack_STEP EQU 0x00020D00 ;(AbortStack_PA - AbortStackSize) ; 0x0002_0D00 (0x100)
;SVCStack_STEP EQU 0x00020C00 ;(UndefStack_PA - UndefStackSize) ; 0x0002_0C00 (0x400)
;UserStack_STEP EQU 0x00020800 ;(SVCStack_PA - SVCStackSize) ; 0x0002_0800 (0x800)
FIQStack_STEP EQU 0xD0021000 ;(TOP_OF_STACKS_PHYSICAL - 0x0) ; 0x0002_1000 (0x100)
IRQStack_STEP EQU 0xD0020F00 ;(FIQStack_PA - FIQStackSize) ; 0x0002_0F00 (0x100)
AbortStack_STEP EQU 0xD0020E00 ;(IRQStack_PA - IRQStackSize) ; 0x0002_0E00 (0x100)
UndefStack_STEP EQU 0xD0020D00 ;(AbortStack_PA - AbortStackSize) ; 0x0002_0D00 (0x100)
SVCStack_STEP EQU 0xD0020C00 ;(UndefStack_PA - UndefStackSize) ; 0x0002_0C00 (0x400)
UserStack_STEP EQU 0xD0020800 ;(SVCStack_PA - SVCStackSize) ; 0x0002_0800 (0x800)
;--------------------------------------------------
; Initialize Stack
; Stack size and location information is in "image_cfg.inc"
;--------------------------------------------------
mrs r0, cpsr
bic r0, r0, #Mode_MASK
orr r1, r0, #Mode_IRQ | NOINT
msr cpsr_cxsf, r1 ; IRQMode
ldr sp, =IRQStack_PA ; IRQStack
;ldr sp, =IRQStack_STEP ; IRQStack (by just4you's test)
bic r0, r0, #Mode_MASK | NOINT
orr r1, r0, #Mode_SVC
msr cpsr_cxsf, r1 ; SVCMode
ldr sp, =SVCStack_PA ; SVCStack
;ldr sp, =SVCStack_STEP ; SVCStack (by just4you's test)
=============================================================================================
1. 결국 스텝로더의 정상 동작을 위해서는..
iRAM에 스택을 잡던가 아니면 DRAM에 스택을 할당해야 하는데..
어떤 방법으로 해결을 하는게 좋을런지?..
2. 아무래도 DRAM에 스택을 잡는게 용량도 크고해서 u-boot의 코드를 기준으로..
스텝로더에서 참조하는 함수를 수정해서 테스트하고 있는데..
DRAM 초기화를 위해 참조할만한 자료가 있다면, 저에게 조언을 좀..