<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > S3c2410軟件調試總結

S3c2410軟件調試總結

作者: 時(shí)間:2013-12-05 來(lái)源:網(wǎng)絡(luò ) 收藏

硬件平臺介紹
我的硬件平臺主要是 + FPGA(cyclone EP1C6),出于成本的考慮,我買(mǎi)了一塊2410的核心板,然后自己畫(huà)了一塊底板,主要的模塊有:

arm920 CORE RISC CPU
EP1C6 Altera cyclone series Fpga
AT89S52 atmel 51
RTL8019as 10M network device
Sdram x2 total: 64M byte
K9F5608 Nand flash 32M byte
AM29LV160D x2 NOR flash total: 4M byte
64LV25616 SRAM 512K byte
UDA1341 IIS Interface
24C256 EEPROM
USB Host 1, Dev 1
SD interface
UART x2

ADS下C語(yǔ)言的入口方式和ROM鏡像文件的生成
這部分介紹下ADS下如何生成可以運行的ROM鏡像文件,我們知道當程序下載到flash中運行的時(shí)候,對于RW、ZI數據就存在著(zhù)兩個(gè)環(huán)境,一個(gè) load環(huán)境,一個(gè)是exec環(huán)境,有時(shí)候由于速度的需要RO數據也要重新加載,那么對RO數據也是有兩個(gè)環(huán)境。編譯器產(chǎn)生ROM鏡像文件時(shí)候,這三塊數據的存放依次為RO、RW、ZI,并且地址空間時(shí)連續的。但是到了運行的時(shí)候,RW數據必須被拷貝到SDRAM(SRAM)中以支持讀寫(xiě),這就是我們所謂的運行環(huán)境。那么就要有一段代碼去完成這個(gè)任務(wù),在本章中我們介紹如何生成這段代碼。

玩過(guò)2410的朋友都知道2410初始化代碼中有一段搬運RW和ZI初始化的代碼,沒(méi)錯,它確實(shí)能夠在一定程度上完成上面所說(shuō)的任務(wù),只要我們在生成二進(jìn)制可執行代碼的時(shí)候在編譯器鏈接項的地方填寫(xiě)正確的RO&RW地址,(比如RO = 0, RW = 0x30000000), 那么將程序下到 NOR flash的零地址并從nor flash啟動(dòng),啟動(dòng)代碼會(huì )將RW&ZI數據弄到0x30000000,程序就能跑起來(lái)了。

但是各位有沒(méi)有想過(guò),怎么把RO代碼弄到SDRAM中(有時(shí)候這是必須的,比方后面我將提到用nor flash的bootloader燒寫(xiě)nor flash)?如果直接設RO=0x30000000,那么這段代碼下載到0地址肯定跑不起來(lái),除非是ROPI,這個(gè)要求就高了。這里我們有必要從介紹 ADS中規定的C語(yǔ)言入口開(kāi)始,ADS中從初始化匯編代碼跳到main函數有兩種方式,main和__main:

1,在__main入口的模式下,匯編代碼的指令為 b __main, 編譯器在跳轉到main之前還要作一系列的工作,這其中就包括對運行環(huán)境的初始化,在A(yíng)DS COMPILE GUIDE>中提到: copies nonroot(RORW) execution regions from load addr to exec addr, and Zeros ZI region. 借助編譯器,我們就可以定義更為復雜的運行環(huán)境,這里要用到scatter文件(.scf),比如我們要的目標運行環(huán)境是:將啟動(dòng)代碼以外的所有代碼都拷貝到SDRAM的初始地址中運行,比且把RW段設在0x30800000,那么對應的scf文件如下:

FLASH 0x0 0x200000
{
EXEC1 0x0 0x200000
{
2410init.o(Init, +First)
__main.o(+RO) ; copy code
* (Region$$Table) ; RO/RW addresses to copy
* (ZISection$$Table) ; ZI addresses to zero
}
EXEC2 0x30000000 0x00800000
{
*(+RO)
}
SDRAM 0x30800000 0x00800000
{
*(+RW,+ZI)
}
}
;Sections named Region$$Table and ZISection$$Table which contain the addresses of the code/data to be copied.

當然,在這種模式下,有些入口函數必須自己重定義,比如__user_initial_stackheap,具體參見(jiàn)ADS文檔。

2, main入口模式即簡(jiǎn)單的跳轉,這里起始不用“main”這個(gè)名字也無(wú)所謂。那么編譯器不會(huì )作任何的初始化,所有運行環(huán)境的建立都要* 我們自己,這就是大家看到的那段搬運代碼存在的理由。但是它實(shí)現一些簡(jiǎn)單的運行環(huán)境是可取的,如果用scf定義的復雜環(huán)境,雖然我相信是可以做到的,但是可能會(huì )比較麻煩。我還沒(méi)深究。

另外,這里提一下semihost,因為我們在看ADS的東西的時(shí)候經(jīng)常出現這個(gè)詞,我也一直受其困擾。這里我簡(jiǎn)單說(shuō)一下自己的見(jiàn)解,semihost 僅僅是一種調試手段,它的機理就是利用MULTI_IDE等工具捕捉目標環(huán)境運行過(guò)程中產(chǎn)生的值為0x123456的SWI中斷,然后向上位機的ADS 軟件發(fā)送對應的調試信息。對于我們最后的應用代碼來(lái)說(shuō),都是nonsemihost類(lèi)型的。如果我們在調試中使用semihost,那么只要在最后重定義 ADS中的一些使用到的庫函數(比如fputc),代碼就可以從semihost向nonsemihost的類(lèi)型轉變。不過(guò)到目前為止,我還沒(méi)體會(huì )到 semihost的威力。


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: S3c2410 軟件調試

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>