|
|||||||||||
| 技術(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ù) |
謝謝進(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 于 2007/4/26 16:35:00 發(fā)布:
我覺得你說的有道理. 這個(gè)設(shè)置對代碼燒入FLASH以后的分布沒有關(guān)系。只是把code和data分段了一下. |
|
| 3樓: | >>參與討論 |
| 作者: sklar 于 2007/4/26 16:54:00 發(fā)布:
呵呵,進(jìn)來的都發(fā)表下看法吧 知道的說下,不清楚的也把自己的看法說說吧,大家交流啊,樓上的用什么ARM板?我用的是立YU泰的44B0 |
|
| 4樓: | >>參與討論 |
| 作者: luhuaren 于 2007/4/26 17:15:00 發(fā)布:
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 于 2007/4/26 17:20:00 發(fā)布:
RE 可以下在U-BOOT的源碼看一下,感覺很多開發(fā)板上流行的BOOT代碼都是從U-BOOT上改過來的 |
|
| 6樓: | >>參與討論 |
| 作者: pigjiang 于 2007/4/27 8:46:00 發(fā)布:
有個(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 于 2007/4/27 9:58:00 發(fā)布:
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 于 2007/4/27 12:28:00 發(fā)布:
to luhuaren 你的這些代碼我在44Binit.S文件里沒有,不過有點(diǎn)懂你說的意思了,ADS里設(shè)置的這些地址就是把代碼考到SDRAM里的地址? adr r0, ResetEntry ldr r1,BaseOfROM cmp r0,r1 //??這里沒怎么沒說跳到哪里? |
|
| 9樓: | >>參與討論 |
| 作者: luhuaren 于 2007/4/27 15:02:00 發(fā)布:
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 于 2007/4/27 16:09:00 發(fā)布:
收了 恩,還得多看了! |
|
| 11樓: | >>參與討論 |
| 作者: 時(shí)宗 于 2007/4/27 19:21:00 發(fā)布:
參考一下CPU datasheet 以2410\2440為例:SDRAM 一般用的是CPU的BANK6和BANK7(各64M),從BANK0到BANK6正好是0X30000000也就是所謂的0地址ResetEntry。 |
|
| 12樓: | >>參與討論 |
| 作者: luhuaren 于 2007/4/27 19:56:00 發(fā)布:
RE 沒搞懂樓上的說的意思。 |
|
| 13樓: | >>參與討論 |
| 作者: sklar 于 2007/4/27 21:22:00 發(fā)布:
11樓可以詳細(xì)點(diǎn)嗎 呵呵,11樓說的我也不明白! 期待詳細(xì)點(diǎn)! |
|
| 14樓: | >>參與討論 |
| 作者: pigjiang 于 2007/4/27 22:20:00 發(fā)布:
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 于 2007/4/27 22:51:00 發(fā)布:
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 于 2007/4/28 11:09:00 發(fā)布:
謝謝luhuaren的解釋。 還需進(jìn)一步參透:) |
|
| 17樓: | >>參與討論 |
| 作者: 瑤瑤 于 2007/9/3 10:08:11 發(fā)布:
可是為什么我把RObase的地址設(shè)置為0x0000時(shí),運(yùn)行程序時(shí)總是發(fā)生重啟的現(xiàn)象的,都沒有運(yùn)行到我的應(yīng)用程序,就連開發(fā)板中提供的ucos276版本的軟件都會(huì)有這個(gè)問題, 不知道上面的大俠有沒有遇到過這個(gè)問題,該如何解決?(改成0x0c008000就沒有問題了)
|
|
| 18樓: | >>參與討論 |
| 作者: saga 于 2008/4/16 18:54:06 發(fā)布:
to yaoyao 前面要留出0x8000的空間用來建立堆棧的
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |