<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è) > 嵌入式系統 > 設計應用 > 軟件Overlay:程序編寫(xiě)與調試

軟件Overlay:程序編寫(xiě)與調試

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

近幾年來(lái),SOC為了支持更大的硬件資源,及更精確的算法,很多應用中的軟件程序代碼越來(lái)越大,但是售價(jià)卻要越來(lái)越便宜。各家廠(chǎng)商無(wú)不絞盡腦汁尋找降低成本的方法。

SRAM在SOC上,是一個(gè)快速但單位面積較大的組件,而單位面積較大代表成本較高。有一個(gè)降低成本的方法,是將程序代碼放在較慢但單位面積較小的flash或ROM上,當系統需要執行里面的某些程序代碼時(shí),才加載到內存里執行。

如果用商店來(lái)比喻的話(huà),有一個(gè)小店租在都市里的黃金店面里,小店的展示柜很小,當客人想要看架上沒(méi)有的商品時(shí),店員才從后面較大的倉庫里,把商品拿出來(lái)放到展示柜上。這里的展示柜就像SRAM,昂貴但是有效率,倉庫就像flash,便宜容積大但是存取較麻煩。

本文介紹的是軟件overlay的技術(shù)。除此之外,晶心科技也發(fā)展了硬件overlay的技術(shù),使得overlay執行更快,操作更為簡(jiǎn)單。期望本文章能對使用者有所幫助,也希望讀者不吝指教提供您寶貴的意見(jiàn)。

1. 軟件Overlay技術(shù)介紹及操作

我們舉一個(gè)實(shí)際例子作為說(shuō)明,比方說(shuō)程序代碼的大小為210KB,RAM只有64KB,我們把RAM規劃成一格一格的大小,比方說(shuō)每4KB切成一塊。每4KB的大小可以在不同時(shí)間,更換成不同的程序代碼,可以重復利用RAM的空間。程序代碼儲存在ROM或flash里,只有在執行之前會(huì )將函數從ROM或flash里動(dòng)態(tài)加載SRAM里。當這個(gè)函數執行完成,下一個(gè)函數要執行前,再加載下一個(gè)函數。

值得注意的是,每一格SRAM里可加載的程序代碼是互斥的,比方說(shuō)有些不會(huì )同時(shí)使用的功能可以放在同一格里,比方說(shuō)mp3播放器,錄音和播放不會(huì )同時(shí)使用,就可以規劃重復利用同一格SRAM。

1.1 系統架構

請參考圖表1,右邊長(cháng)方形是flash的內容。0x0起1MB的空間,flash里存放了程序代碼和.data,及各個(gè)即將要被overlay的sections。

圖表1的左邊長(cháng)方形是SRAM規劃,地址從0x10000000開(kāi)始,我們切出三格提供overlay的SRAM,分別是0x10800000, 0x10804000及0x10808000。Overlay要規劃成幾格,或者每一格要切成多大塊,都是由使用者規劃。這里的SRAM與flash的地址是以通用型Andes FPGA開(kāi)發(fā)板作例子。讀者設計SOC時(shí),可以根據實(shí)際需求定義合理的地址。

程序執行時(shí),0x10800000可以加載.ovly0或是.ovly1。0x10804000可以加載.ovly3或是.ovly2。0x10808000可以加載.ovly4或是.ovly5。

QQ截圖20140110143431.jpg

1.2 overlay的sag文件編寫(xiě)

圖表2是范例sag文件。Sag文件是Andes linker script generator所需要的輸入文件,執行linker script generator后,輸出會(huì )產(chǎn)生GNU linker需要的linker script。詳細語(yǔ)法說(shuō)明可以參考Andes BSP v3.2.0 User manual第12章。

我們簡(jiǎn)單介紹圖表2的語(yǔ)法。第1行關(guān)鍵詞USER_SECTIONS表示后面接的這幾個(gè)sections都是由使用者自定義的sections。在后面的章節,筆者會(huì )介紹如何把函數指定為這些自定義sections。

QQ截圖20140110143533.jpg

1.3 sag文件轉成linker script

如圖表3,在cygwin下執行nds_ldsag軟件,將sw-ovly.sag轉成sw-nds32.ld文件。參數-o sw-nds32.ld為指定輸出文件名。nds_ldsag軟件可以在A(yíng)ndeSight 2.0.1 MCU或是BSP v3.2.0里取得。

QQ截圖20140110143631.jpg

1.4 程序里指定函數或變量放在自定義的sections

GNU ld (linker)可連結目標文件為可執行文件,排列上的最小單位是section,基本的sections為.text,.data及.bss這3個(gè)sections。為了達成分區overlay的功能,必須指定函數或是變量在自定義的sections上。在前一節里我們介紹了我們切出3個(gè)區域可以做overlay,分別是OVLY0(從0x10800000起),OVLY1(從0x10804000起)及OVLY2(從0x10808000起)三個(gè)區域。指定函數overlay0放在自定義section .overlay0里,要使用__attribute__((section(".overlay0")))語(yǔ)法,完整寫(xiě)法請參考圖表4a。圖表4b.是另外一種寫(xiě)法。

QQ截圖20140110143718.jpg

1.5 各sections的LMA與VMA

圖表6,是各個(gè)section的LMA和VMA。在這個(gè)表上,可以看.andes32_init到.sdata_w的LMA從0x0~0x29dc,這些section的LMA是連續的。.overlay0與.overlay1做overlay,所以有共同的VMA 0x10800000。同樣的,.overlay2和.overlay3,具有共同的VMA 0x10804000。.Overlay4和.overlay5,也有同樣的VMA 0x18008000。

QQ截圖20140110143810.jpg

1.6 overlay程序的加載

前面已經(jīng)介紹overlay section的sag文件寫(xiě)法。那么如何加載用戶(hù)想要用的overlay程序呢?

請看圖表7,這是overlay的執行程序代碼。第5行OverlayLoad(0)表示載入section .overlay0。第6行OverlayLoad(4)表示載入section .overlay4。第7行在.overlay0被加載后,執行overlay0(),可以正常工作。

QQ截圖20140110143918.jpg

再來(lái)我們介紹一下Overlay manager的程序運作,Overlay manager即為圖表7中的函數OverlayLoad。圖表8列出Overlay manager代碼段,主要做了兩件事。一,修改mapped table _ovly_table,標示overlay section是mapped或是unmapped。_ovly_table的用途是讓gdb知道目前加載的是哪一個(gè)section,使得gdb在debug時(shí),能自動(dòng)切換為正確的調試信息。

二,在程序執行時(shí)期將函數加載,函數ovly_copy是一個(gè)memcpy函數,將函數從LMA復制到VMA上。當OverlayLoad(0)執行完后,overlay0函數主體便存在于VMA上,可正確的執行。

QQ截圖20140110144058.jpg

圖表9為_(kāi)ovly_table的內容,要標示每一個(gè)overlay section的vma, size, lma,和是否mapped。必須要注意的一點(diǎn),_ovly_table要位在一個(gè)lma等于vma的區域里。

QQ截圖20140110144229.jpg

2. 調試Overlay的程序

開(kāi)啟自動(dòng)overlay調試功能的gdb命令是overlay auto。當overlay auto開(kāi)啟后,對于使用者來(lái)說(shuō),與一般程序的調試方法相同。

圖表8的最后一行_ovly_debug_event()的用途是讓gdb能把斷點(diǎn)加在正確的地址上,這一行要寫(xiě)在OverlayLoad的后面。必須要有這一行,gdb的自動(dòng)overlay調試才能正常。

當用戶(hù)加一個(gè)斷點(diǎn)在被overlay的區域,gdb會(huì )在函數被加載之后(即為執行完OverlayLoad),遇到_ovly_debug_event時(shí),自動(dòng)的把斷點(diǎn)加到overlay的地址上。

3. 參考數據

Overlay Commands https://sourceware.org/gdb/onlinedocs/gdb/Overlay-Commands.html

Automatic Overlay Debugging https://sourceware.org/gdb/onlinedocs/gdb/Automatic-Overlay-Debugging.html#Automatic-Overlay-Debugging

Debugging Programs That Use Overlays

http://davis.lbl.gov/Manuals/GDB/gdb_11.html

Andes BSP v3.2.0 User Manual

Chapter 12 “Linker Script Generation”

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(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>