|
|||||||||||
| 技術(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ù) |
一個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 于 2006/8/1 10:37:00 發(fā)布:
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 于 2006/8/1 10:48:00 發(fā)布:
你這個程序中沒有復制代碼吧?都沒看到一個循環(huán)。 |
|
| 4樓: | >>參與討論 |
| 作者: twentyone 于 2006/8/1 10:49:00 發(fā)布:
RE 是的,沒看到代碼拷貝,應該是LZ的代碼的問題. |
|
| 5樓: | >>參與討論 |
| 作者: paulsimons 于 2006/8/1 10:51:00 發(fā)布:
ok 你說的對,關(guān)鍵問題是沒有copy FLASH的內(nèi)容到SDRAM中去,而是直接映射到高地址,同時pc偏移到高地址繼續(xù)執(zhí)行,我的問題就是便宜的時候地址計算的問題,我在程序中標明了,可能是匯編的理解問題但是我看了很多遍還是沒有進展,真是郁悶,謝謝啊 |
|
| 6樓: | >>參與討論 |
| 作者: computer00 于 2006/8/1 10:54:00 發(fā)布:
估計在其它某個地方,你還未找到. |
|
| 7樓: | >>參與討論 |
| 作者: paulsimons 于 2006/8/1 11:01:00 發(fā)布:
謝謝 應該沒有copy,因為這是是boot(我有兩個FLASH,一個裝bootloader,一個裝image)所以,跑boot的時候根本不需要copy到ram,問題是我貼出來的那段理解有沒有錯,lr沒有裝入ROM_Start的值,所以lr為0,然r1是整個程序當前的偏移值,如果這樣是對的話,lr就是0+當前的pc值,也就是按照你們所說的在ram的空間的范圍內(nèi)了,但是程序的確沒有拷貝.我可以貼出來看 呵呵 |
|
| 8樓: | >>參與討論 |
| 作者: paulsimons 于 2006/8/1 11:05:00 發(fā)布:
這是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 于 2006/8/1 11:06:00 發(fā)布:
呵呵 很郁悶 都是arm多變的存儲結(jié)構(gòu)讓人心煩意亂啊 |
|
| 10樓: | >>參與討論 |
| 作者: twentyone 于 2006/8/1 11:36:00 發(fā)布:
RE 你最好用仿真器跟蹤一下,然后利用結(jié)果分析,看看在那個環(huán)節(jié)上出了問題. |
|
| 11樓: | >>參與討論 |
| 作者: paulsimons 于 2006/8/1 13:57:00 發(fā)布:
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 于 2006/8/1 15:27:00 發(fā)布:
RE 看了你的分散加載文件,這里有一個問題:板子一上電,SDRAM在起始地址在那里?FLASH起始地址在那里?你用AXD調(diào)試的時候,AXD會按照你的加載文件來加載的。所以開始的時候,PC=7F00.0000 。 另外,你的板子的FLASH里面是不是有初始化程序,一上電后,就已經(jīng)做了REMAP? 現(xiàn)在有點糊涂,你這段程序應該是別人提供的吧?你能描述一下這段程序是用來干嗎的嗎?這樣分析起來才清楚點。 |
|
| 13樓: | >>參與討論 |
| 作者: paulsimons 于 2006/8/4 13:08:00 發(fā)布:
回復21老兄 這個板子是標準的arm結(jié)構(gòu) 32MB的SDRAM,4MB的norFLASH和512KB的FLASH復用總線形式掛接,我們不考慮4M的norFLASH因為那里存的是鏡像,是啟動好了以后一次copy到內(nèi)存運行的,想在只有512的小FLASH與SDRAM,當然一開始小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老兄啊 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |