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

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

關(guān)于ADS1.2里設(shè)置RO Base 和RW Base的疑問?

作者:sklar 欄目:ARM技術(shù)
關(guān)于ADS1.2里設(shè)置RO Base 和RW Base的疑問?
  謝謝進(jìn)來解答!
  請問在ADS1.2里設(shè)置的RO Base和RW Base是做什么用的?
  我現(xiàn)在只能理解為:在ADS1。2里設(shè)置的RO Base和RW Base,是不是就是設(shè)置SDRAM的分布?跟代碼放哪里沒關(guān)系的?代碼具體放哪里是不是燒寫的時(shí)候設(shè)置的?
  比如開發(fā)板提供的BISO 在ADS工程里RO Base設(shè)置為0xc000000 RW Base設(shè)置為0xc5f0000,可是BIOS不是要放0X0000000的嗎?暈了 

2樓: >>參與討論
pigjiang
我覺得你說的有道理.
這個(gè)設(shè)置對代碼燒入FLASH以后的分布沒有關(guān)系。只是把code和data分段了一下.


3樓: >>參與討論
sklar
呵呵,進(jìn)來的都發(fā)表下看法吧
   知道的說下,不清楚的也把自己的看法說說吧,大家交流啊,樓上的用什么ARM板?我用的是立YU泰的44B0

4樓: >>參與討論
luhuaren
re
RO Base設(shè)置為0xc000000 RW Base設(shè)置為0xc5f0000,可是BIOS不是要放0X0000000的嗎

注意:如果是用44B0,那么44B0上電復(fù)位后PC的值是0,
    AREA    Init,CODE,READONLY

    ENTRY
ResetEntry
    b ResetHandler                ;for debug
    b HandlerUndef                ;handlerUndef
    b HandlerSWI                ;SWI interrupt handler
    b HandlerPabort                ;handlerPAbort
    b HandlerDabort                ;handlerDAbort
    b .                            ;handlerReserved
    b HandlerIRQ
    b HandlerFIQ

系統(tǒng)上電后第一條指令執(zhí)行的是b ResetHandler    (在0地址處)這是一條相對跳轉(zhuǎn)指令,也就是說,這條指令和RO的設(shè)置無關(guān)
跳轉(zhuǎn)到ResetHandler處,進(jìn)行一些初始化動(dòng)作后,就要進(jìn)行代碼拷貝,就是把FLASH里的代碼拷貝到RO指定的地址處,代碼拷貝是這樣實(shí)現(xiàn)的:


    ;****************************************************
    ;拷貝并粘貼 RW data/zero initialized data            *
    ;****************************************************
    adr    r0, ResetEntry        
    ldr    r1,BaseOfROM        
    cmp    r0,r1                
                                
    ldreq    r0, TopOfROM        
    beq    InitRamData            
    
    ;****************************************************
    ;計(jì)算拷貝程序在FLASH中的實(shí)際位置                       *
    ;****************************************************
    ldr    r2,=CopyProcBeg    
    sub    r1, r2, r1;r2-r1->r1
    add    r0, r0, r1    
    ldr    r3,=CopyProcEnd
    
    ;****************************************************
    ;將拷貝程序復(fù)制到ram中                                *
    ;****************************************************
0    
    ldmia    r0!, {r4-r7}        
    stmia    r2!, {r4-r7}        
    cmp    r2, r3
    bcc    %B0    
    
    ;********************************************************
    ;開始用ram中的拷貝程序復(fù)本將所有剩下的代碼復(fù)制到ram中    *
    ;********************************************************
    ldr    r3, TopOfROM        
    ;ldr    pc, =CopyProcBeg    ;裝入絕對地址(指到RAM中去的)
    b    CopyProcBeg
    ;********************************************************
    ;本段將代碼由實(shí)際燒入的地址拷貝到ro-base所指定的位置    *
    ;只拷貝CopyProcEnd以后的代碼                ;********************************************************
CopyProcBeg    
0    
    ldmia    r0!, {r4-r11}
    stmia    r2!, {r4-r11}
    cmp    r2, r3
    bcc    %B0    
CopyProcEnd
    
    sub    r1, r2, r3
    sub    r0, r0, r1        
    
InitRamData    
    ldr    r2, BaseOfBSS
    ldr    r3, BaseOfZero    
0
    cmp    r2, r3
    ldrcc    r1, [r0], #4
    strcc    r1, [r2], #4
    bcc    %B0    

    mov    r0,    #0
    ldr    r3,    EndOfBSS
1    
    cmp    r2,    r3
    strcc    r0, [r2], #4
    bcc    %B1            
;===================================================================
    adr    r0, ResetEntry        
    ldr    r1,BaseOfROM        
    cmp    r0,r1    
請注意這幾條語句,尤其是adr    r0, ResetEntry,這條語句當(dāng)你反匯編后發(fā)現(xiàn)是一條這樣的指令
;[0xe24f0f5d]   sub      r0,pc,#0x174   ; #0xc008000
     也是一條與位置無關(guān)的指令,ResetEntry的值同PC的值相關(guān)聯(lián),
當(dāng)然,PC一上電的值為0,所以這里ResetEntry的值也為0,所以
    ldr    r1,BaseOfROM        
    cmp    r0,r1
比較的結(jié)果就是R0。。健。遥庇谑沁M(jìn)行代碼拷貝,將復(fù)制程序拷貝完后,就可以跳轉(zhuǎn)到RAM中去,執(zhí)
5樓: >>參與討論
luhuaren
RE
可以下在U-BOOT的源碼看一下,感覺很多開發(fā)板上流行的BOOT代碼都是從U-BOOT上改過來的

6樓: >>參與討論
pigjiang
有個(gè)疑問
IMPORT    |Image$$RO$$Base|    ; ROM code start    
IMPORT    |Image$$RO$$Limit|    ; RAM data starts after ROM program
IMPORT    |Image$$RW$$Base|    ; Pre-initialised variables
IMPORT    |Image$$ZI$$Base|    ; uninitialised variables
IMPORT    |Image$$ZI$$Limit|    ; End of variable RAM space
===============================================
這幾行的||里面的標(biāo)號是從哪里獲得的?
他們是不是就是設(shè)置linker的OUTPUT選項(xiàng)里面填入的RO和RW的值?

7樓: >>參與討論
wowow
RO/RW
RO/RW地址在debug/release設(shè)置不同的值,一個(gè)用于仿真器加載到ram運(yùn)行,一個(gè)用于FLASH中運(yùn)行。如果你用了中斷,并且ARM不支持REMAP,調(diào)ram程序時(shí)FLASH里必須也燒進(jìn)中斷向量表。


|Image$$RO$$Base| 之類是linker生成的,但有些情況下不生成。最好自己讀一讀關(guān)于linker的pdf

8樓: >>參與討論
sklar
to  luhuaren
   你的這些代碼我在44Binit.S文件里沒有,不過有點(diǎn)懂你說的意思了,ADS里設(shè)置的這些地址就是把代碼考到SDRAM里的地址?
    adr    r0, ResetEntry        
    ldr    r1,BaseOfROM        
    cmp    r0,r1      //??這里沒怎么沒說跳到哪里?

9樓: >>參與討論
luhuaren
re
當(dāng)然,PC一上電的值為0,所以這里ResetEntry的值也為0;
不好意思,這句話寫的不對..........ResetEntry的值得應(yīng)該是|Image$$RO$$Base|

如果RO的值和你程序燒錄起始地址的值不同,(如:你設(shè)置的RO=0xc000000,注意這個(gè)地址是在指向RAM,而你燒錄的代碼是在0地址處),這樣就需要你燒錄在0地址開始處的一小部分啟動(dòng)代碼把程序從燒錄地址搬運(yùn)到RO設(shè)置的地址中去,但要注意,連接器為你連接的地址是以RO為基準(zhǔn)的,這樣你可能會(huì)有個(gè)疑問,為什么程序的運(yùn)行域是以RO(0xc000000)為基準(zhǔn),但處于FLASH(0地址開始)里的一小部分啟動(dòng)代碼還能運(yùn)行呢,這就是因?yàn)槌绦蛑杏昧伺c地址無關(guān)的指令,使得一上電,能夠順利的執(zhí)行0地址處的啟動(dòng)代碼
注意
ENTRY
ResetEntry
    b ResetHandler                ;for debug
這條指令并不是跳轉(zhuǎn)到RO處,它還是跳到了FLASH里,
再注意以下幾句
adr    r0, ResetEntry        這里并不是把真正的ResetEntry的值裝入了R0,其實(shí)裝入R0的值是0,可以看看反匯編,你自然明白        
    ldr    r1,BaseOfROM        
    cmp    r0,r1    
想必應(yīng)該可以理解了,如果再不理解,那建議多看看書.

10樓: >>參與討論
sklar
收了
    恩,還得多看了!

11樓: >>參與討論
時(shí)宗
參考一下CPU datasheet
2410\2440為例:SDRAM 一般用的是CPU的BANK6和BANK7(各64M),從BANK0到BANK6正好是0X30000000也就是所謂的0地址ResetEntry。

12樓: >>參與討論
luhuaren
RE
 沒搞懂樓上的說的意思。

13樓: >>參與討論
sklar
11樓可以詳細(xì)點(diǎn)嗎
   呵呵,11樓說的我也不明白!
期待詳細(xì)點(diǎn)!

14樓: >>參與討論
pigjiang
to luhuaren還有個(gè)疑問
    ;****************************************************
    ;計(jì)算拷貝程序在FLASH中的實(shí)際位置                       *
    ;****************************************************
-->ldr    r2,=CopyProcBeg    
    sub    r1, r2, r1;r2-r1->r1
    add    r0, r0, r1    
    ldr    r3,=CopyProcEnd

如你所說,前面比較r0和r1結(jié)果自然是不等,所以直接運(yùn)行到這里來了。
請問:CopyProcBeg  是44binit.s里面的一個(gè)標(biāo)號,它所代表的地址到底應(yīng)該是在FLASH里還是在ram里?如果在FLASH里,那么r2應(yīng)該小于r1,因?yàn)閞1=BaseOfROM,那么sub    r1, r2, r1這個(gè)減法是不是有問題?

主要是覺得這個(gè)時(shí)候標(biāo)號CopyProcBeg  應(yīng)該是在FLASH里的某一個(gè)地址。
今天看了一天這段代碼也沒明白,謝謝指點(diǎn)!

15樓: >>參與討論
luhuaren
RE
ldr    r2,=CopyProcBeg    
注意用的是LDR指令

由ADS生成的代碼的標(biāo)號是以設(shè)置的RO為基準(zhǔn)的,也就是說CopyProcBeg是RAM中的一個(gè)地址 。


但是如果你用ADR    r2,=CopyProcBeg    
這條指令就不一樣了,具體怎么不一樣,看看指令的解釋,但很多地方只是一筆帶過,沒有很詳細(xì)的解釋,我是看了匯編后代碼才明白的
它會(huì)生成一條類似下面的指令
sub      r0,pc,#0x174   ; #0xc008000

以上我理解的應(yīng)該沒有錯(cuò)誤,因?yàn)槲乙呀?jīng)在板子上驗(yàn)證過。

在我不理解這些的時(shí)候,到網(wǎng)上搜索過很多資料,但是沒有誰確切的解釋過這些東東,后來等我弄明白了以后,在LINUX論壇上發(fā)現(xiàn)有討論U-BOOT的帖子對這些做了很明確的解釋。
為什么程序的運(yùn)行域和加載域不同,但啟動(dòng)代碼還能在加載域運(yùn)行,并將加載域的代碼拷貝到運(yùn)行域中去,然后將PC指到運(yùn)行域中去,在運(yùn)行域中執(zhí)行代碼,可能是每一個(gè)初學(xué)者看啟動(dòng)代碼時(shí)最難理解的地方。理解了這些,其他的,都相對好弄一些/

16樓: >>參與討論
pigjiang
謝謝luhuaren的解釋。
還需進(jìn)一步參透:)

17樓: >>參與討論
瑤瑤

可是為什么我把RObase的地址設(shè)置為0x0000時(shí),運(yùn)行程序時(shí)總是發(fā)生重啟的現(xiàn)象的,都沒有運(yùn)行到我的應(yīng)用程序,就連開發(fā)板中提供的ucos276版本的軟件都會(huì)有這個(gè)問題, 不知道上面的大俠有沒有遇到過這個(gè)問題,該如何解決?(改成0x0c008000就沒有問題了)

 

18樓: >>參與討論
saga

to yaoyao

前面要留出0x8000的空間用來建立堆棧的

 

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請教一個(gè)DMA的問題
關(guān)于switch...case的級聯(lián)返回問題!請各位大蝦指導(dǎo)!
用USB調(diào)試ARM大家都用什么?keil+ulink還是IAR+jlink或其他...?
緊急求助LM393在3.3V電源下的問題
想找一個(gè)復(fù)位芯片,可以監(jiān)視3.3V和1.8V
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


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