<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    曙海教育集團(tuán)論壇DSP專(zhuān)區(qū)DSP5000技術(shù)討論 → 一種TI 5000系列DSP C/C++語(yǔ)言和匯編語(yǔ)言混合編程的方法


      共有7541人關(guān)注過(guò)本帖樹(shù)形打印

    主題:一種TI 5000系列DSP C/C++語(yǔ)言和匯編語(yǔ)言混合編程的方法

    美女呀,離線,留言給我吧!
    wangxinxin
      1樓 個(gè)性首頁(yè) | 博客 | 信息 | 搜索 | 郵箱 | 主頁(yè) | UC


    加好友 發(fā)短信
    等級(jí):青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊(cè):2010-11-12 11:08:23
    一種TI 5000系列DSP C/C++語(yǔ)言和匯編語(yǔ)言混合編程的方法  發(fā)帖心情 Post By:2010-11-22 8:52:54

    摘 要:首先介紹并比較了 TI 5000 系列DSP的三種主要軟件開(kāi)發(fā)方法的優(yōu)缺點(diǎn),提出了C/C++與匯編語(yǔ)言混合編程方法的優(yōu)越性所在。之后在比較了幾種典型混合編程方法的基礎(chǔ)上,提出了一種結(jié)構(gòu)化的混合編程方法并詳細(xì)闡述了其函數(shù)調(diào)用規(guī)則和寄存器規(guī)則。最后給出了一個(gè)經(jīng)過(guò)驗(yàn)證的混合編程程序,該程序?qū)SP軟件開(kāi)發(fā)有較大參考價(jià)值。
      關(guān)鍵詞:DSP;混合編程;函數(shù)調(diào)用規(guī)則;寄存器規(guī)則


    1引言
      
    TI 公司的5000系列低功耗16 b定點(diǎn)DSP,因其良好的性?xún)r(jià)比,在國(guó)內(nèi)獲得了很大的普及。如何對(duì)5000系列DSP進(jìn)行軟件開(kāi)發(fā)也一直是業(yè)界關(guān)注的熱點(diǎn)。5000系列DSP的軟件設(shè)計(jì)通常有3種方法。

    1.1用C/C++語(yǔ)言開(kāi)發(fā)
      TI公司提供了用于C/C++語(yǔ)言開(kāi)發(fā)的CCS平臺(tái)。該平臺(tái)包括優(yōu)化ANSI C/C++ 編譯器,從而可以在源程序級(jí)進(jìn)行開(kāi)發(fā)調(diào)試。這種方法大大提高了軟件的開(kāi)發(fā)速度和可讀性,方便了軟件的修改和移植。但是,C/C++代碼的效率還是無(wú)法與手工編寫(xiě)的匯編代碼效率相比,如FFT程序。因?yàn)榧词故亲罴训腃/C++編譯器,也無(wú)法在所有的情況下都能合理的利用DSP芯片提供的各種資源。此外,用C/C++語(yǔ)言實(shí)現(xiàn)DSP芯片某些硬件控制也不如匯編方便,有些甚至無(wú)法用C/C++語(yǔ)言實(shí)現(xiàn)。
    1.2全匯編語(yǔ)言開(kāi)發(fā)

      TI公司提供了用于匯編語(yǔ)言開(kāi)發(fā)的針對(duì)5000系列DSP的匯編語(yǔ)言。用戶(hù)可以用他進(jìn)行軟件開(kāi)發(fā)。這種方式可以更為合理的利用芯片提供的硬件資源,其代碼效率高,程序執(zhí)行速度快。但是用匯編語(yǔ)言編寫(xiě)程序是比較復(fù)雜的,一般來(lái)說(shuō),不同公司的芯片匯編語(yǔ)言是不同的,即使是同一公司的芯片,由于芯片的類(lèi)型不同(如定點(diǎn)和浮點(diǎn))、芯片的升級(jí)換代,其匯編語(yǔ)言也不同。因此,用匯編語(yǔ)言開(kāi)發(fā)基于某種芯片的產(chǎn)品周期較長(zhǎng),并且軟件的修改和升級(jí)較困難。而且匯編語(yǔ)言的可讀性和可移植性較差。

    1.3C/C++語(yǔ)言和匯編語(yǔ)言混合編程開(kāi)發(fā)
      為了充分利用DSP芯片的硬件資源,更好發(fā)揮C/C++語(yǔ)言和匯編語(yǔ)言進(jìn)行軟件開(kāi)發(fā)的各自?xún)?yōu)點(diǎn),可以將兩者有機(jī)的結(jié)合起來(lái),兼顧兩者優(yōu)點(diǎn),避免其弊端。因此,在很多情況下,采用混合編程方法能更好地達(dá)到設(shè)計(jì)要求,完成設(shè)計(jì)任務(wù)。

    2 C/C++語(yǔ)言和匯編語(yǔ)言混合編程方法討論
      
    C/C++語(yǔ)言和匯編語(yǔ)言混合編程的具體方法有以下幾種:
      (1)獨(dú)立編寫(xiě)C/C++程序和匯編程序,分開(kāi)編譯或匯編形成各自的目標(biāo)模塊,再用鏈接器將C/C++模塊和匯編模塊鏈接起來(lái),這是一種靈活性較大的方法。但用戶(hù)必須自己維護(hù)各匯編模塊的入口和出口代碼,自己計(jì)算傳遞參數(shù)在堆棧中的偏移量,工作量稍大,但能做到對(duì)程序的絕對(duì)控制,也能滿(mǎn)足軟件設(shè)計(jì)結(jié)構(gòu)化的要求。這是本文主要講述的方法。
      (2)在C/C++程序中使用匯編程序中定義的變量和常量。
      (3)在C/C++程序中直接內(nèi)嵌匯編語(yǔ)句。這種方法可以在C/C++程序中實(shí)現(xiàn)C/C++語(yǔ)言無(wú)法實(shí)現(xiàn)的硬件控制功能,如修改中斷控制寄存器、中斷標(biāo)志寄存器等。
      (4)在C/C++源程序中使用內(nèi)部函數(shù)直接調(diào)用匯編語(yǔ)言語(yǔ)句。
      后3種方法由于在C/C++語(yǔ)言中直接嵌入了匯編語(yǔ)言的成分,容易造成程序混亂,C/C++環(huán)境被破壞,甚至導(dǎo)致程序崩潰,而編程者又很難對(duì)不良結(jié)果進(jìn)行預(yù)期和有效控制。而如果采用第一種方法,只要遵循有關(guān)C/C++語(yǔ)言函數(shù)調(diào)用規(guī)則和寄存器規(guī)則,就能預(yù)見(jiàn)到程序運(yùn)行的結(jié)果,保證程序正確。下面分別講述函數(shù)調(diào)用規(guī)則和寄存器規(guī)則,最后給出編程實(shí)例。

    3函數(shù)調(diào)用規(guī)則
      
    C/C++編譯器對(duì)函數(shù)調(diào)用強(qiáng)加了一組嚴(yán)格的原則。除了特殊的運(yùn)行時(shí)間支持庫(kù)函數(shù)外,任何調(diào)用函數(shù)和被C/C++函數(shù)調(diào)用的函數(shù)都必須遵守這些原則。不遵守這些原則可能破壞C/C++環(huán)境并導(dǎo)致程序失敗。

      圖1說(shuō)明了典型的函數(shù)調(diào)用。在這個(gè)例子中,參數(shù)被傳遞到堆棧中調(diào)用者的參數(shù)塊,函數(shù)再使用這些參數(shù)調(diào)用被調(diào)用函數(shù)。注意,第一個(gè)參數(shù)是在A累加器中傳遞的。這個(gè)例子還說(shuō)明了匯編器對(duì)被調(diào)用函數(shù)的局部幀的分配。局部幀包括局部變量塊和局部參數(shù)塊兩部分,其中局部參數(shù)塊是局部幀中用來(lái)傳遞參數(shù)到其他函數(shù)的部分。如果被調(diào)用函數(shù)沒(méi)有局部變量并且不再調(diào)用其他函數(shù)或需要調(diào)用的函數(shù)沒(méi)有參數(shù),則不分配局部幀。對(duì)于混合編程而言,由于被調(diào)用函數(shù)是手工編寫(xiě)的匯編程序,則局部幀由編程者自己完成分配,也不需要在堆棧中進(jìn)行,而編譯器分配局部幀。

    圖片點(diǎn)擊可在新窗口打開(kāi)查看

      (1)函數(shù)如何調(diào)用
      函數(shù)(調(diào)用者)在調(diào)用被調(diào)用函數(shù)時(shí)執(zhí)行以下任務(wù)。
      ①調(diào)用者將第一個(gè)(最左邊)的參數(shù)值放進(jìn)累加器A。調(diào)用者將剩下的參數(shù)按相反的順序傳進(jìn)參數(shù)塊,剩下的最左邊的參數(shù)在最低的地址。
      ②若函數(shù)返回一個(gè)結(jié)構(gòu),則調(diào)用者為該結(jié)構(gòu)分配空間,然后用累加器A傳遞返回空間的地址給調(diào)用的函數(shù)。
      ③調(diào)用者調(diào)用函數(shù)。
      (2)被調(diào)用函數(shù)如何響應(yīng)。
      被調(diào)用函數(shù)執(zhí)行以下任務(wù):
      注意:如果被調(diào)用函數(shù)是C/C++函數(shù),則下面步驟都是由匯編器自動(dòng)完成。如果是混合編程,則如下步驟都是由編程者在被調(diào)用的匯編函數(shù)中完成的。
      ①若被調(diào)用函數(shù)修改AR1,AR2或AR7,則將他們壓入堆棧。
      ②被調(diào)用函數(shù)通過(guò)從SP減去一個(gè)常數(shù),為局部變量塊和局部參數(shù)塊分配存儲(chǔ)器。該常數(shù)按以下公式計(jì)算,即:
      局部變量塊的大小+局部參數(shù)塊的大小+padding
      padding值是為了保證SP對(duì)準(zhǔn)偶數(shù)邊界而可能要求補(bǔ)充的一個(gè)字。之所以SP要對(duì)準(zhǔn)偶數(shù)邊界,是因?yàn)?000系列DSP指令可一次讀寫(xiě)存儲(chǔ)器的32 b,例如DLD,DADD等。這樣,編譯器必須保證所有32 b的目標(biāo)都駐留在偶數(shù)邊界。
      對(duì)于混合編程而言可以在匯編函數(shù)中,按本步驟的方法在堆棧中分配局部幀,但本方法相對(duì)比較麻煩,尤其該匯編函數(shù)還要調(diào)用其他函數(shù)時(shí),所以,一般而言編程者通常用其他方法分配局部幀,比如用bss偽指令定義局部變量供函數(shù)使用。
      ③被調(diào)用函數(shù)為調(diào)用函數(shù)執(zhí)行代碼。
      ④若函數(shù)返回一個(gè)值,則被調(diào)用函數(shù)將該值放在累加器A中;若函數(shù)返回一個(gè)結(jié)構(gòu),則被 調(diào)用函數(shù)將該結(jié)構(gòu)復(fù)制到累加器A指到的存儲(chǔ)器塊;若調(diào)用者不返回函數(shù)值,則A被置0。
      ⑤被調(diào)用函數(shù)給SP上加上第二步計(jì)算的常數(shù),釋放為局部變量和局部參數(shù)分配的存儲(chǔ)空間。對(duì)混合編程而言,如果編程者沒(méi)有在堆棧中分配局部幀,則本步驟省略。
      ⑥被調(diào)用函數(shù)恢復(fù)所有保存的寄存器。
      ⑦被調(diào)用函數(shù)執(zhí)行返回。

    4寄存器規(guī)則
      
    (1)必須保存任何被函數(shù)修正的專(zhuān)用寄存器。專(zhuān)用寄存器包括:
      ①AR1,AR6,AR7
      ②堆棧指針(SP)
      若對(duì)SP正常使用,不需要明顯的保存。換句話(huà)說(shuō),只要任何壓入堆棧的東西在函數(shù)返回之 前被彈回(因而保存了SP),匯編函數(shù)就可以自由的使用堆棧。任何非專(zhuān)用的寄存器都可以自由地使用而無(wú)需將他們保存。
      (2)中斷函數(shù)必須保存他使用的所有寄存器。
      (3)ARP在函數(shù)進(jìn)入和返回時(shí),必須為0,即當(dāng)前輔助寄存器為AR0。函數(shù)執(zhí)行時(shí)可以為其 他值。
      (4)在默認(rèn)的情況下,編譯器總是認(rèn)為OVM為0。因此,若在匯編程序中將OVM置為1,則返回C/C++環(huán)境時(shí),必須將其恢復(fù)為0。
      (5)在默認(rèn)的情況下,編譯器總是認(rèn)為CPL為1。因此,若在匯編程序中將CPL清0,則在返回C/C++環(huán)境時(shí),必須將其恢復(fù)為1。
      (6)長(zhǎng)整數(shù)和浮點(diǎn)數(shù)存儲(chǔ)在存儲(chǔ)器中的方法是最高有效字在低位地址。
      (7)函數(shù)必須按前面有關(guān)被調(diào)用函數(shù)響應(yīng)中所述的方法返回值。
      (8)除了全局變量的初始化外,匯編語(yǔ)言模塊不能以任何目的使用cinit段。在boot asm中的C/C++啟動(dòng)程序假定cinit段完全由初始化表組成。將其他的信息放入cin it中將使初始化表產(chǎn)生混亂,并將產(chǎn)生不可預(yù)期的結(jié)果。
      (9)在匯編語(yǔ)言模塊中,對(duì)可以從C/C++中訪問(wèn)的變量和函數(shù)名需加上前綴“_”。對(duì)于僅用于匯編語(yǔ)言模塊中的標(biāo)識(shí)符,應(yīng)不得用下劃線開(kāi)始。
      (10)任何在匯編語(yǔ)言模塊中聲明的將要從C/C++訪問(wèn)或調(diào)用的對(duì)象或函數(shù),都必須在匯編語(yǔ)言中用global偽指令聲明為全局變量。

    5編程實(shí)例
      
    以32 b乘法運(yùn)算為例。雖然用C/C++語(yǔ)言表達(dá)32 b乘法運(yùn)算較為方便和明了,但由于C/C++語(yǔ)言無(wú)法很好利用DSP匯編語(yǔ)言為實(shí)現(xiàn)各種乘法運(yùn)算而提供的指令,而使得C/C++程序效率低下。所以這里用匯編語(yǔ)言完成32 b乘法運(yùn)算,再用C/C++程序調(diào)用他。

    5.1算法簡(jiǎn)介
      由于16 b定點(diǎn)DSP中沒(méi)有32 b乘法指令,所以一定要用幾種16 b乘法指令結(jié)合一定算法來(lái)進(jìn)行32 b乘法運(yùn)算。一個(gè)32 b數(shù)在存儲(chǔ)器中是分開(kāi)存儲(chǔ)的。高16位存放在低地址,他在進(jìn)行乘法運(yùn)算是可以看作一個(gè)16 b有符號(hào)數(shù);低16位存放在相鄰的低地址,他進(jìn)行乘法運(yùn)算時(shí)可以看作一個(gè)16 b無(wú)符號(hào)數(shù)。于是算式如下:  
      圖片點(diǎn)擊可在新窗口打開(kāi)查看
    其中:S代表符號(hào)數(shù);U代表無(wú)符號(hào)數(shù)。
      由上算式可見(jiàn),在32 b乘法運(yùn)算中,實(shí)際上包含了3種乘法運(yùn)算:U*U,S*U和S*S 。一般的乘法運(yùn)算指令都是兩個(gè)帶符號(hào)數(shù)相乘,即S*S。所以在編程時(shí),還要用到以下兩條乘法指令:
     圖片點(diǎn)擊可在新窗口打開(kāi)查看
    5.2C語(yǔ)言主程序

    圖片點(diǎn)擊可在新窗口打開(kāi)查看
      
    在主程序中進(jìn)行MPY32函數(shù)調(diào)用時(shí),函數(shù)傳遞情形如圖2所示。

    圖片點(diǎn)擊可在新窗口打開(kāi)查看

      從圖2可以看出,函數(shù)MPY32的第一參數(shù)存放在A累加器中,第二個(gè)參數(shù)在堆棧中,高16位在堆棧中的低地址,低16位在堆棧中的高地址。由于MPY32是匯編語(yǔ)言函數(shù),所以編譯器不為其分配局部幀,局部幀的分配在匯編程序中進(jìn)行。

    5.3匯編程序
      可以看出,在匯編程序中至少要為局部幀分配8個(gè)單元,其中4個(gè)單元用來(lái)存放參數(shù)值,4個(gè)單元用來(lái)存放運(yùn)算結(jié)果,如圖3所示。
      匯編函數(shù):
     圖片點(diǎn)擊可在新窗口打開(kāi)查看
     圖片點(diǎn)擊可在新窗口打開(kāi)查看
     圖片點(diǎn)擊可在新窗口打開(kāi)查看
     圖片點(diǎn)擊可在新窗口打開(kāi)查看
    

    圖片點(diǎn)擊可在新窗口打開(kāi)查看

    6結(jié)語(yǔ)
      本文介紹的混合編程方法不但適用于TI 5000系列DSP,同樣也適用于TI其他系列的DSP,如2000系列、6000系列,甚至對(duì)其他芯片,如51系列單片機(jī),實(shí)現(xiàn)混合編程也有很大參考價(jià)值。值得注意的是,為了使混合編程不破壞C語(yǔ)言的結(jié)構(gòu)性,在匯編語(yǔ)言中不要設(shè)置除函數(shù)名之外的任何全局變量。


    支持(0中立(0反對(duì)(0單帖管理 | 引用 | 回復(fù) 回到頂部

    返回版面帖子列表

    一種TI 5000系列DSP C/C++語(yǔ)言和匯編語(yǔ)言混合編程的方法








    簽名
    主站蜘蛛池模板: 无码国产乱人伦偷精品视频| 精品福利一区二区三区| 性色av一区二区三区| 亚洲人成人一区二区三区| 男女性潮高清免费网站| 国产成人一区二区动漫精品| av无码免费看| 尤物193yw在线看| 久青草中文字幕精品视频| 欧美日韩精品一区二区在线播放| 国产一卡二卡3卡4卡四卡在线| 18禁男女爽爽爽午夜网站免费 | a在线免费观看视频| 成年轻人网站色免费看| 亚洲三级视频在线观看| 欧美黄成人免费网站大全| 国产一区二区三区不卡在线观看| 18欧美乱大交| 国语自产少妇精品视频蜜桃| 中文字幕一区二区日产乱码| 日本伊人精品一区二区三区| 亚洲国产另类久久久精品黑人| 沉伦柳淑云漫画3d| 午夜电影在线看| 老鸭窝laoyawo国产精品| 国产欧美日韩综合精品二区 | ~抓码王57777论坛| 成人国产欧美精品一区二区| 久久精品成人一区二区三区| 欧美一区二区影院| 人气排行fc2成影免费的| 精品亚洲麻豆1区2区3区| 国产亚洲真人做受在线观看 | 性做久久久久久久久| 久久精品一区二区| 暖暖免费高清日本中文| 亚洲欧美一区二区三区孕妇| 永久免费毛片在线播放| 另类国产ts人妖视频网站| 老阿姨哔哩哔哩b站肉片茄子芒果| 国产手机在线αⅴ片无码观看|