音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

00,twentyone老兄幫我分析一下,真是百思不得其解啊!謝謝

作者:paulsimons 欄目:ARM技術(shù)
00,twentyone老兄幫我分析一下,真是百思不得其解啊!謝謝
一個arm7的remap過程,把ram映射到0地址處,rom搬移到0x7f00,0000處,實際是正確的,但是看代碼感覺怎么都不對,ROM_Start定義為0x7f00,0000.
沒有copy程序到ram,也就是說映射的同時pc地址也要轉(zhuǎn)移到相應的便宜地址,但是我按照程序看就是錯誤的,我知道是我的問題,但是請幫幫我,我實在看不出來了 呵呵,謝謝

;映射準備
         LDR    r2, =remap_temp
    MOV    r1, pc
    LDR      r3, =remap_EndSysMapJump
remap_temp
    MOV      lr, #0
    CMP    r2, r1
    LDRGT    lr, =ROM_Start  ;問題就是這里LDRGT應該沒有執(zhí)行,所以
                                   ;lr的基址就不是0x7f00,0000.
    SUB    r3, r3, r2
    ADD    r1, r1, r3
    ADD    lr, lr, r1
    
; Load in the target values into the CONTROL registers
       ADRL    r0, remap_SystemInitData
     LDMIA   r0, {r1-r6}
     LDR    r0, =EBI_Ctrl
    
; Now run critical jump code
     STMIA   r0, {r1-r6}
     MOV    pc, lr
remap_EndSysMapJump
      ;............
      ;............

remap_SystemInitData
     DCD    0x000520C1
    DCD    0xFE0100f0
    DCD    0x000010cd
    DCD    0x050010e3
    DCD    0x00000292
    DCD    0x0000014B
    DCB "@SYSTEM_INIT_CFG"            
    ALIGN


2樓: >>參與討論
twentyone
RE
我不知道你用是什么板子,也不清楚你的板子具體需要怎樣才能完成REMAP.
按我的理解,這樣嘗試一下:
1. 你的程序的起始地址設(shè)置為0x0
2. 板子上電后,存儲空間的分配應該是FLASH在地址0X0開始的地方.CPU從你的程序開始取指令執(zhí)行
3. 你的程序需要先完成一下工作:初始化你的CPU,把SDRAM給配置好,假設(shè)你的SDRAM配置好后,起始地址是0x40000000
4. 下一步需要做的是,把你的FLASH里的程序完整的拷貝到SDRAM里面去,開始地址是0x40000000.拷貝完成后,SDRAM里也有一份和你的FLASH里一樣的程序.
5. 拷貝完成后,你的FLASH里的程序應該執(zhí)行到REMAP這里,通過一條指令完成REMAP.你可以想象一下這個過程,REMAP指令執(zhí)行完后,SDRAM的起始地址變?yōu)?x0,FLASH的地址變?yōu)?X7F000000,這樣,程序開始執(zhí)行下一條指令.因為你的SDRAM里的程序和FLASH里的程序是一樣的,所以CPU取的下一條指令就是執(zhí)行完REMAP后的下一條指令.程序繼續(xù)執(zhí)行...

通過上面的過程,就可以完成REMAP,而且程序在SDRAM里面執(zhí)行.關(guān)鍵是REMAP這點,你可以想象一下,把REMAP當作是在瞬間完成的.不會影響程序的執(zhí)行.

希望上面的信息對你有幫助.

21



3樓: >>參與討論
computer00
你這個程序中沒有復制代碼吧?都沒看到一個循環(huán)。
 
4樓: >>參與討論
twentyone
RE
是的,沒看到代碼拷貝,應該是LZ的代碼的問題.

5樓: >>參與討論
paulsimons
ok
你說的對,關(guān)鍵問題是沒有copy FLASH的內(nèi)容到SDRAM中去,而是直接映射到高地址,同時pc偏移到高地址繼續(xù)執(zhí)行,我的問題就是便宜的時候地址計算的問題,我在程序中標明了,可能是匯編的理解問題但是我看了很多遍還是沒有進展,真是郁悶,謝謝啊

6樓: >>參與討論
computer00
估計在其它某個地方,你還未找到.
 
7樓: >>參與討論
paulsimons
謝謝
應該沒有copy,因為這是是boot(我有兩個FLASH,一個裝bootloader,一個裝image)所以,跑boot的時候根本不需要copy到ram,問題是我貼出來的那段理解有沒有錯,lr沒有裝入ROM_Start的值,所以lr為0,然r1是整個程序當前的偏移值,如果這樣是對的話,lr就是0+當前的pc值,也就是按照你們所說的在ram的空間的范圍內(nèi)了,但是程序的確沒有拷貝.我可以貼出來看 呵呵

8樓: >>參與討論
paulsimons
這是remap之前的所有代碼,呵呵
 AREA    Init, CODE, READONLY

; --- STANDARD definitions of mode bits and interrupt (I & F) flags in PSRs

Mode_USR        EQU     0x10
Mode_FIQ        EQU     0x11
Mode_IRQ        EQU     0x12
Mode_SVC        EQU     0x13
Mode_ABT        EQU     0x17
Mode_UNDEF      EQU     0x1B
Mode_SYS        EQU     0x1F ; available on ARM Arch 4 and later

I_Bit           EQU     0x80 ; when I bit is set, IRQ is disabled
F_Bit           EQU     0x40 ; when F bit is set, FIQ is disabled


; --- SYSTEM MEMORY locations
RAM_Limit       EQU     0x8000              ; For unexpanded
UND_Stack        EQU                  ;RAM_Limit
Abort_Stack    EQU        RAM_Limit-256
IRQ_Stack       EQU     RAM_Limit-512     ; followed by IRQ stack
FIQ_Stack       EQU     RAM_Limit-768     ; followed by IRQ stack
SVC_Stack       EQU     RAM_Limit-1024    ; SVC stack at top of MEMORY
; add FIQ_Stack, ABT_Stack, UNDEF_Stack here if you need them
USR_Stack       EQU     0x400000           ; followed by USR(SYS) stack

ROM_Start       EQU     0x7F000000          ; Base address of ROM after remapping

Clk_Skew        EQU        0xFFF01F00            ; W90N740 clock skew CONTROL register
EBI_Ctrl        EQU 0xFFF01000            ; W90N740 EBI CONTROLe register
SDRAM_config0    EQU 0xFFF01008            ; W90N740 SDCONF0

CAHCON            EQU        0xFFF02000            ; W90N740 Cache CONTROL register

IDREG            EQU        0xFFF00000            ; W90N740 CHIP ID

AIC_MDCR        EQU    0xFFF82124            ; W90N740 AIC Mask Disable CONTROL Register

PLLCON            EQU        0xFFF00008            ; PLL CONTROL Register

    KEEP

    ENTRY
    EXPORT    Reset_Go
Reset_Go
    ; Disable Interrupt, This is for safe ...
    LDR    r0, =AIC_MDCR
    LDR    r1, =0x7FFFE
    STR    r1, [r0]
    MRS    r0, CPSR
    ORR    r0, r0, #0xC0
    MSR    CPSR_c, r0

    ; Disable cache, This is for safe ...
    MOV        r0, #0x0
    LDR        r1, =CAHCON
    STR        r0, [r1], #4
    MOV        r0, #0x87
    STR        r0, [r1]
11
    LDR        r0, [r1]
    CMP        r0, #0
    BNE        %B11

     ; Check if the SYSTEM had been initialized
    LDR   r0, =SDRAM_config0
    LDR   r0, [r0]
    LDR      r1, =0x800
    CMP   r0, r1
    BNE   %FT0

    ; Check version NUMBER of W90N740 to set the clock skew
    ; The clock skew of W90N740 version A should be 0x7A
    ; The clock skew of W90N740 version B should be 0x39
    LDR        r0, =IDREG
    LDR        r0, [r0]
    LDR        r1, =0x0F000000
    ANDS    r0,r0,r1
    BEQ        version0
    LDR        r1, =0x01000000
    CMP        r0, r1
    BEQ        version1
    B        unknow_version
version0
    LDR        r0, =0x0FF007A
    B        update_clkskew
version1    
    LDR        r0, =0x0FF0038
    B        update_clkskew
update_clkskew
    LDR        r1, =0xFFF01F00
    STR        r0,[r1]        
unknow_version

IF {FALSE}
; Set the SYSTEM clock to be 40MHZ (USB may fail at this clock rate)
    LDR        r1, =PLLCON
    LDR        r0, [r1]
    ORR        r0, r0, #32 ; set bit 5
    S
9樓: >>參與討論
paulsimons
呵呵 很郁悶
都是arm多變的存儲結(jié)構(gòu)讓人心煩意亂啊

10樓: >>參與討論
twentyone
RE
你最好用仿真器跟蹤一下,然后利用結(jié)果分析,看看在那個環(huán)節(jié)上出了問題.

11樓: >>參與討論
paulsimons
axd跑了一下
貌似和我的理解一樣,但是為什么pc值一開始就是7F00.0000 仿佛一開始就remap過了,現(xiàn)在唯一能說通的就是在編譯這個bootloader的時候用的是分散加載,只能這樣理解的,但是ads的分散加載沒有接觸過,感覺挺難懂的,我把那個文件也貼上來了

ROM_LOAD 0x7F000000
{
    ROM +0
    {
        init.o (Init, +First)
        anon$$obj.o
        __main.o(!!!)
        sh.o
        dhcp.o
        inflate.o
        infblock.o
        infcodes.o
        inftrees.o
        uprintf.o
        * (+RO)
        
    }
    RAM 0x0
    {
        vectors.o(Vect, +First)
        flash.o
        bib.o
        image.o
        TftpServer.o
        NetKernel.o
        PacketDriver.o
        xmodem.o
        * (+RW, +ZI)
    }

}


12樓: >>參與討論
twentyone
RE
看了你的分散加載文件,這里有一個問題:板子一上電,SDRAM在起始地址在那里?FLASH起始地址在那里?你用AXD調(diào)試的時候,AXD會按照你的加載文件來加載的。所以開始的時候,PC=7F00.0000 。

另外,你的板子的FLASH里面是不是有初始化程序,一上電后,就已經(jīng)做了REMAP?

現(xiàn)在有點糊涂,你這段程序應該是別人提供的吧?你能描述一下這段程序是用來干嗎的嗎?這樣分析起來才清楚點。

13樓: >>參與討論
paulsimons
回復21老兄
這個板子是標準的arm結(jié)構(gòu) 32MBSDRAM,4MB的norFLASH和512KB的FLASH復用總線形式掛接,我們不考慮4M的norFLASH因為那里存的是鏡像,是啟動好了以后一次copy到內(nèi)存運行的,想在只有512的小FLASHSDRAM,當然一開始小FLASH肯定是掛在0地址,然后基本初始化.....包括remap.....最后copy 4MnorFLASH的鏡像到內(nèi)存運行,就這么簡單,實際也是這樣但是我閱讀boot的時候發(fā)現(xiàn)remap有點不理解,也就出現(xiàn)了以上的問題.
我現(xiàn)在也很迷惑,其時這個cpu和S3C4510很像的,都是有幾個bank 可以設(shè)定地址等等,所以原理上不存在問題,我現(xiàn)在開始疑惑 ads在編譯前設(shè)置ro或rw,具體會對燒到FLASH中的code有什么影響?

謝謝 21和00老兄啊

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
誰能介紹下KEIL ARM 的啟動過程?
查過很多,還是不能理解透徹。
直接用MCU或ARM去對CF卡讀寫,最快速率是多少?哪位做過的說一下
想轉(zhuǎn)型使用arm用于工控!不知道哪個公司的arm易學,請指教!
緊急求助!!關(guān)于DM9000A
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號