<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一種基于TI TMS320 DSP的軟件動(dòng)態(tài)鏈接技術(shù)

          一種基于TI TMS320 DSP的軟件動(dòng)態(tài)鏈接技術(shù)

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

          摘要:介紹了的概念和特點(diǎn),提出了 系列。該解決了可重配置的系統(tǒng)中關(guān)于二進(jìn)制目標(biāo)代碼的加載和卸載的問(wèn)題。采用該技術(shù)的軟件重配置方案已成功運(yùn)用于某多功能通信系統(tǒng),為其他系列的可重構(gòu)數(shù)字處理系統(tǒng)提供了一定的參考,在無(wú)人值守設(shè)備、多功能信號(hào)處理設(shè)備方面具有一定的應(yīng)用價(jià)值。
          關(guān)鍵詞:動(dòng)態(tài); DSP;COFF文件;重定位

          數(shù)字信號(hào)處理器(DSP)的多功能自適應(yīng)通信系統(tǒng)在軟件無(wú)線電領(lǐng)域正變得日益普遍,如何使DSP系統(tǒng)在運(yùn)行期間自適應(yīng)的改變通信協(xié)議是實(shí)現(xiàn)這種系統(tǒng)的關(guān)鍵。當(dāng)前,DSP開發(fā)人員采用了重配置、層疊(overlay)等技術(shù)來(lái)實(shí)現(xiàn)通信協(xié)議自適應(yīng)功能,但作為運(yùn)行時(shí)改變或擴(kuò)展功能的最有效方式,基于DSP的動(dòng)態(tài)鏈接技術(shù)尚未有文獻(xiàn)提及。
          動(dòng)態(tài)鏈接技術(shù)是相對(duì)于靜態(tài)鏈接而言,它是指編譯器在編譯程序時(shí)并不將程序所需的庫(kù)文件代碼復(fù)制到程序的可執(zhí)行文件,而只是在程序中保留庫(kù)文件的調(diào)用標(biāo)記。在程序運(yùn)行時(shí),由鏈接器將庫(kù)文件代碼加載到系統(tǒng)內(nèi)存,并與程序鏈接為一個(gè)整體。在大多數(shù)DSP系統(tǒng)中,采用動(dòng)態(tài)鏈接技術(shù)可以節(jié)省系統(tǒng)對(duì)片上存儲(chǔ)器大小的要求,此外,由于動(dòng)態(tài)鏈接庫(kù)函數(shù)對(duì)外提供的是函數(shù)的接口,而不是函數(shù)的入口地址,因此動(dòng)態(tài)鏈接函數(shù)可同時(shí)提供多個(gè)版本,使系統(tǒng)的升級(jí)變得更為方便。
          通過(guò)研究和分析 DSP目標(biāo)代碼的生成過(guò)程和目標(biāo)代碼的結(jié)構(gòu),提出了針對(duì)該系列DSP代碼動(dòng)態(tài)鏈接的方法。將本文提出的方法應(yīng)用到某通信系統(tǒng)中表明,該方法具有占用片上內(nèi)存小、系統(tǒng)配置時(shí)間短、系統(tǒng)有較強(qiáng)的可擴(kuò)展性等優(yōu)點(diǎn),在此后的DSP開發(fā)過(guò)程中會(huì)得到廣泛的應(yīng)用。

          1 DSP目標(biāo)代碼生成流程
          TI DSP系列開發(fā)工具包為開發(fā)人員提供了一套完整的軟件開發(fā)工具鏈,包括C/C++編譯器,匯編器,鏈接器等。利用這套開發(fā)工具包,DSP開發(fā)人員可以完成程序的編寫、編譯、鏈接,直到目標(biāo)代碼的生成。其中,C/C++編譯器將C語(yǔ)言轉(zhuǎn)換為匯編語(yǔ)言,匯編器匯編語(yǔ)言翻譯為機(jī)器語(yǔ)言,以COFF目標(biāo)文件的形式輸出給鏈接器。鏈接器將匯編器生成的COFF文件與庫(kù)文件鏈接成一個(gè)完整的程序,以可執(zhí)行的COFF文件輸出到磁盤,生成DSP可執(zhí)行程序。

          2 DSP動(dòng)態(tài)鏈接器的設(shè)計(jì)
          文中設(shè)計(jì)的DSP系統(tǒng)軟件架構(gòu)如圖1所示。DSP應(yīng)用程序被劃分為一個(gè)或多個(gè)可加載模塊,動(dòng)態(tài)鏈接器作為DSP軟件系統(tǒng)架構(gòu)中的一個(gè)重要的軟件模塊,其作用主要是在DSP系統(tǒng)改變功能時(shí),按需將匯編器生成的目標(biāo)文件按需加載到系統(tǒng)中,與系統(tǒng)已有程序結(jié)合成為一個(gè)整體,并將卸載系統(tǒng)中不需要的模塊。

          本文引用地址:http://www.ex-cimer.com/article/148648.htm

          a.JPG


          2.1 模塊的定義
          圖1中所示的可加載模塊文件主要包括DSP應(yīng)用程序的機(jī)器代碼,此外包括模塊的名稱、大小、版本,模塊所包含的函數(shù)聲明,模塊所依賴的函數(shù)接口,模塊的入口函數(shù)信息,模塊被引用信息等。這些信息是在匯編器生成DSP應(yīng)用程序的機(jī)器代碼后,由模塊生成程序?qū)⒏郊拥男畔⑻砑拥紺OFF文件中,生成最終的可加載模塊文件。本文設(shè)計(jì)的可加載模塊的文件格式如圖2所示。

          b.JPG


          2.2 模塊的加載和卸載
          2.2.1 COFF文件格式
          DSP動(dòng)態(tài)鏈接器設(shè)計(jì)的關(guān)鍵是解析匯編器生成的目標(biāo)文件,將目標(biāo)文件中包含的代碼根據(jù)模塊的加載地址進(jìn)行重定位后,完成與系統(tǒng)已有程序的鏈接。匯編器生成的目標(biāo)文件是以COFF文件格式保存在磁盤上,其通常包括代碼段、數(shù)據(jù)段、用戶自定義段、符號(hào)表和重定位信息等數(shù)據(jù),格式如圖3所示。

          c1.jpg


          如圖3所示,COFF文件主要包括一個(gè)文件頭部和多個(gè)段信息,以及段重定位信息和符號(hào)表等。COFF文件缺省的包含3個(gè)段:. text段、.data段和.bss段。匯編器將匯編程序的代碼部分放到.text段中,將全局變量放在.data或.bss段中,同時(shí)在符號(hào)表中寫入該文件包含的符號(hào)(函數(shù)或變量)名稱和對(duì)外引用的符號(hào)名稱等信息。此外,每段的重定位信息表中都包含重定位信息項(xiàng),根據(jù)重定位信息項(xiàng),可以確定可重定位指令在段中的偏移量,表1給出了重定位信息項(xiàng)的結(jié)構(gòu)。
          重定位信息項(xiàng)的0—3字節(jié)表示可重定位指令以0作為起始地址,在當(dāng)前段中的偏移量。4—5字節(jié)是符號(hào)索引表,它代表了該重定位指令索引的符號(hào)在COFF文件中符號(hào)表中的索引號(hào)。8—9字節(jié)表示重定位類型,它指出了如何將定位后的地址信息添加到該可重定位指令上。表2是重定位信息項(xiàng)的一個(gè)例子,這里假設(shè)該重定位信息項(xiàng)屬于.text段。

          c.JPG


          該重定位信息項(xiàng)說(shuō)明在.text代碼段偏移20個(gè)字節(jié)處存在一條重定位語(yǔ)句,該語(yǔ)句所指向的符號(hào)在符號(hào)表中的位置是第20項(xiàng)(從0開始計(jì)),該語(yǔ)句的重定位類型是PC跳轉(zhuǎn)指令重定位。
          2.2.2 DSP機(jī)器代碼的識(shí)別
          匯編器生成的是DSP機(jī)器代碼,因此動(dòng)態(tài)鏈接器需要分析重定位指令格式,以便將指令引用地址添加到該指令中。根據(jù) DSP指令手冊(cè),TMS320 DSP指令格式包括如圖4所示。

          d.JPG


          文中通過(guò)分析指令格式的低位比特位,可以判斷出指令屬于上述指令中的哪一類。以指令0x0200007E為例,將指令表示為二進(jìn)制:(0000 0010 0000 0000 0000 0000 0111 1110)b,指令的2~3位為11,在圖4中查找2~3位為11的指令,可以發(fā)現(xiàn)該指令是一條STW存儲(chǔ)指令,指令的ucst15比特域表示了其需要重定位的地址。
          2.2.3 模塊動(dòng)態(tài)鏈接的實(shí)現(xiàn)
          動(dòng)態(tài)鏈接器的功能主要包括模塊的動(dòng)態(tài)鏈接和動(dòng)態(tài)卸載,模塊動(dòng)態(tài)鏈接的主要流程如圖5所示。動(dòng)態(tài)鏈接器在收到加載模塊請(qǐng)求時(shí),首先檢查模塊文件的完整性,并根據(jù)加載模塊的依賴信息在系統(tǒng)符號(hào)表中查找對(duì)應(yīng)的函數(shù)和變量。當(dāng)模塊通過(guò)完整性和依賴性檢查后,動(dòng)態(tài)鏈接器首先根據(jù)模塊大小聲明,在系統(tǒng)的存儲(chǔ)空間中分配空間,將模塊文件加載到系統(tǒng)存儲(chǔ)空間。接著動(dòng)態(tài)鏈接器根據(jù)COFF文件信息,搜索COFF文件代碼段中的重定位語(yǔ)句,并根據(jù)指令格式確定指令中地址域信息,最后將綜合模塊被加載的地址和指令索引的符號(hào)的地址,計(jì)算地址信息,并將此信息填入可重定位指令的地址域,完成指令的重定位。在代碼段重定位完成后,動(dòng)態(tài)鏈接器將模塊名稱、模塊對(duì)外提供的函數(shù)名稱、模塊入口地址等信息注冊(cè)到系統(tǒng)符號(hào)表中,并調(diào)用模塊加載函數(shù),完成模塊對(duì)系統(tǒng)資源的申請(qǐng)。最后,如果該模塊所提供的函數(shù)或者變量替換了系統(tǒng)已有的函數(shù)或者變量,動(dòng)態(tài)鏈接器還需要將所有引用該函數(shù)或變量的其他模塊進(jìn)行重定位,以反映系統(tǒng)狀態(tài)的更新。

          e.JPG


          2.2.4 模塊動(dòng)態(tài)卸載的實(shí)現(xiàn)
          模塊動(dòng)態(tài)卸載是加載過(guò)程的逆過(guò)程,動(dòng)態(tài)鏈接器在收到卸載模塊請(qǐng)求時(shí),首先在系統(tǒng)中搜索是否有模塊引用了將要被卸載的模塊,若存在則警告用戶,并等待用戶確實(shí)是否強(qiáng)制卸載。若是,動(dòng)態(tài)鏈接器將卸載模塊對(duì)外提供的函數(shù)和變量從系統(tǒng)符號(hào)表中刪除,并收回卸載模塊占用的系統(tǒng)空間。完整的模塊動(dòng)態(tài)卸載流程如圖6所示。

          f.JPG



          3 結(jié)論
          文中設(shè)計(jì)的DSP動(dòng)態(tài)鏈接器為傳統(tǒng)的DSP系統(tǒng)帶來(lái)新的應(yīng)用功能,已在某多功能通信系統(tǒng)中獲得了成功的應(yīng)用。動(dòng)態(tài)鏈接技術(shù)作為DSP系統(tǒng)的重配置技術(shù)之一,其應(yīng)用要比傳統(tǒng)的DSP全系統(tǒng)重構(gòu)技術(shù)或疊加技術(shù)更為靈活和高效。同時(shí),本文提出的動(dòng)態(tài)鏈接技術(shù)相對(duì)于文獻(xiàn),文獻(xiàn)提出的函數(shù)查找表的實(shí)現(xiàn)方式更加富有效率。盡管目前動(dòng)態(tài)鏈接技術(shù)在DSP領(lǐng)域的應(yīng)用很少,但隨著DSP應(yīng)用向多功能發(fā)展,相信動(dòng)態(tài)鏈接技術(shù)在DSP領(lǐng)域的應(yīng)用會(huì)越來(lái)越廣泛。

          c++相關(guān)文章:c++教程




          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();