久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区

Rss & SiteMap

曙海教育集團論壇 http://www.bjzhda.cn

曙海教育集團論壇
共1 條記錄, 每頁顯示 10 條, 頁簽: [1]
[瀏覽完整版]

標題:一種TI 5000系列DSP C/C++語言和匯編語言混合編程的方法

1樓
wangxinxin 發表于:2010-11-22 8:52:54
摘 要:首先介紹并比較了 TI 5000 系列DSP的三種主要軟件開發方法的優缺點,提出了C/C++與匯編語言混合編程方法的優越性所在。之后在比較了幾種典型混合編程方法的基礎上,提出了一種結構化的混合編程方法并詳細闡述了其函數調用規則和寄存器規則。最后給出了一個經過驗證的混合編程程序,該程序對DSP軟件開發有較大參考價值。
  關鍵詞:DSP;混合編程;函數調用規則;寄存器規則


1引言
  
TI 公司的5000系列低功耗16 b定點DSP,因其良好的性價比,在國內獲得了很大的普及。如何對5000系列DSP進行軟件開發也一直是業界關注的熱點。5000系列DSP的軟件設計通常有3種方法。

1.1用C/C++語言開發
  TI公司提供了用于C/C++語言開發的CCS平臺。該平臺包括優化ANSI C/C++ 編譯器,從而可以在源程序級進行開發調試。這種方法大大提高了軟件的開發速度和可讀性,方便了軟件的修改和移植。但是,C/C++代碼的效率還是無法與手工編寫的匯編代碼效率相比,如FFT程序。因為即使是最佳的C/C++編譯器,也無法在所有的情況下都能合理的利用DSP芯片提供的各種資源。此外,用C/C++語言實現DSP芯片某些硬件控制也不如匯編方便,有些甚至無法用C/C++語言實現。
1.2全匯編語言開發

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

1.3C/C++語言和匯編語言混合編程開發
  為了充分利用DSP芯片的硬件資源,更好發揮C/C++語言和匯編語言進行軟件開發的各自優點,可以將兩者有機的結合起來,兼顧兩者優點,避免其弊端。因此,在很多情況下,采用混合編程方法能更好地達到設計要求,完成設計任務。

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

3函數調用規則
  
C/C++編譯器對函數調用強加了一組嚴格的原則。除了特殊的運行時間支持庫函數外,任何調用函數和被C/C++函數調用的函數都必須遵守這些原則。不遵守這些原則可能破壞C/C++環境并導致程序失敗。

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

圖片點擊可在新窗口打開查看

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

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

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

5.1算法簡介
  由于16 b定點DSP中沒有32 b乘法指令,所以一定要用幾種16 b乘法指令結合一定算法來進行32 b乘法運算。一個32 b數在存儲器中是分開存儲的。高16位存放在低地址,他在進行乘法運算是可以看作一個16 b有符號數;低16位存放在相鄰的低地址,他進行乘法運算時可以看作一個16 b無符號數。于是算式如下:  
  圖片點擊可在新窗口打開查看
其中:S代表符號數;U代表無符號數。
  由上算式可見,在32 b乘法運算中,實際上包含了3種乘法運算:U*U,S*U和S*S 。一般的乘法運算指令都是兩個帶符號數相乘,即S*S。所以在編程時,還要用到以下兩條乘法指令:
 圖片點擊可在新窗口打開查看
5.2C語言主程序

圖片點擊可在新窗口打開查看
  
在主程序中進行MPY32函數調用時,函數傳遞情形如圖2所示。

圖片點擊可在新窗口打開查看

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

5.3匯編程序
  可以看出,在匯編程序中至少要為局部幀分配8個單元,其中4個單元用來存放參數值,4個單元用來存放運算結果,如圖3所示。
  匯編函數:
 圖片點擊可在新窗口打開查看
 圖片點擊可在新窗口打開查看
 圖片點擊可在新窗口打開查看
 圖片點擊可在新窗口打開查看


圖片點擊可在新窗口打開查看

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

共1 條記錄, 每頁顯示 10 條, 頁簽: [1]

Copyright © 2000 - 2009 曙海教育集團
Powered By 曙海教育集團 Version 2.2
Processed in .03125 s, 2 queries.
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
中文字幕在线一区二区三区| 亚洲一区在线观看视频| 久久国产精品亚洲va麻豆| 美女性感视频久久| 国产精品乱人伦| 欧美色综合影院| 欧美日韩国产一二| 99麻豆久久久国产精品免费| 日韩中文字幕1| 中文字幕一区二区视频| 日韩色视频在线观看| 色综合色狠狠综合色| 国产伦精品一区二区三区照片| 国产毛片精品国产一区二区三区| 亚洲国产日韩综合久久精品| 国产精品女人毛片| 精品国产三级电影在线观看| 欧美无砖专区一中文字| 亚洲成人自拍视频| 精品欧美日韩在线| av在线不卡观看| 成人免费看视频| 黄色小说综合网站| 午夜精品123| 亚洲天堂福利av| 欧美经典三级视频一区二区三区| 欧美一级xxx| 欧美日本精品一区二区三区| 一本大道av伊人久久综合| 青青草原成人| 牛人盗摄一区二区三区视频 | 国产精品国产精品国产专区不蜜 | 国产亚洲美州欧州综合国| 欧美日韩精品欧美日韩精品一 | 欧美这里有精品| 日韩一区二区三区高清| 国产亚洲精品自在久久| 51国偷自产一区二区三区的来源| 国产成人免费视频网站| 韩国女主播成人在线观看| 奇米影视一区二区三区| 亚洲6080在线| 亚洲一二三专区| 夜夜嗨av一区二区三区| 亚洲免费资源在线播放| 亚洲美女电影在线| 亚洲视频狠狠干| 中文字幕亚洲视频| 国产精品国模大尺度视频| 国产精品视频你懂的| 中文字幕第一页久久| 久久综合色8888| 久久综合九色欧美综合狠狠| 欧美成人激情免费网| 精品剧情在线观看| 精品成人免费观看| 2020日本不卡一区二区视频| 久久天堂av综合合色蜜桃网| 国产三级欧美三级日产三级99| 久久午夜电影网| 国产女人18毛片水真多成人如厕| 国产日韩欧美电影| 国产精品日产欧美久久久久| 国产精品久久久久久久第一福利| 国产精品成人一区二区艾草| 亚洲视频你懂的| 亚洲一区二区在线免费看| 亚洲国产欧美一区二区三区丁香婷| 亚洲成人综合网站| 美腿丝袜亚洲色图| 国产精品一区二区在线播放| 成人激情图片网| 91丨九色丨蝌蚪丨老版| 国产精品久久久久免费| 免费中文日韩| 色综合久久中文综合久久牛| 欧美午夜片在线看| 日韩一区二区免费电影| 久久久五月婷婷| 中文字幕一区在线观看| 亚洲图片欧美色图| 九九精品一区二区| av电影天堂一区二区在线| 国产精品免费一区二区| 久久久久久久久四区三区| 亚洲精品9999| 欧美肥妇毛茸茸| 久久久久久久久97黄色工厂| 国产精品福利电影一区二区三区四区| 一区二区在线观看av| 免费人成精品欧美精品 | 黄色日韩三级电影| 99久久精品费精品国产一区二区| 国产精品免费一区二区三区在线观看| 免费在线成人av| 日本精品一级二级| 日韩精品一区二区三区在线| 国产精品丝袜一区| 日韩电影免费一区| 成人av手机在线观看| 久久99精品国产99久久| 91黄色在线观看| 26uuu国产电影一区二区| 综合久久久久久| 久久不见久久见免费视频7| av不卡一区二区三区| 欧美日韩精品综合| 欧美麻豆精品久久久久久| 国产日韩欧美综合一区| 亚洲成人你懂的| 懂色av一区二区夜夜嗨| 精品日产一区2区三区黄免费 | 美日韩一区二区三区| 91丨porny丨首页| 视频一区视频二区视频三区视频四区国产 | 欧美二区三区91| 国产免费久久精品| 性欧美疯狂xxxxbbbb| 国产精品一区二区果冻传媒| 国产精品二区在线观看| 在线视频一区二区三区| 久久综合色一综合色88| 五月综合激情婷婷六月色窝| 国产成人av一区| 色一情一乱一伦一区二区三区 | 国产91精品一区二区麻豆亚洲| 国产日韩二区| 欧美日韩国产综合视频在线观看| 欧美高清在线视频| 日韩av不卡在线观看| 99re这里都是精品| 亚洲一区二区三区在线观看视频| 欧美一级黄色片| 亚洲自拍都市欧美小说| 丁香婷婷综合网| 日韩理论片在线观看| 日韩一区二区电影在线| 亚洲久草在线视频| 成人综合婷婷国产精品久久免费| 欧美不卡1区2区3区| 日韩丝袜情趣美女图片| 亚洲精品福利视频网站| 国产91丝袜在线播放九色| 日韩不卡av| 久久精品视频免费| 奇米在线7777在线精品| 国产精品青青草| 欧美一区二区三区四区五区| 亚洲女人****多毛耸耸8| 国产不卡免费视频| 亚洲欧美日韩精品综合在线观看| 久久在线免费观看| 久色婷婷小香蕉久久| 欧美日韩国产免费一区二区三区 | 亚洲成人av中文| av一区和二区| 3d动漫精品啪啪1区2区免费| 亚洲午夜免费视频| 91精品天堂| 在线成人av影院| 天堂av在线一区| 精品乱码一区| 精品国产sm最大网站| 六月丁香婷婷色狠狠久久| 欧美成人免费在线| 欧美激情中文不卡| 国产成人亚洲精品狼色在线| 中文字幕av日韩精品| 亚洲色图.com| 91免费观看| 日韩欧美国产成人一区二区| 午夜精品福利一区二区蜜股av| 国产一区二区精品在线| 欧美刺激午夜性久久久久久久| 美女网站色91| 亚洲精品一区二区三| 一区二区三区高清在线| 成人免费91在线看| 欧美www视频| 国产一区二区三区高清播放| 国内外成人免费视频| 久久无码av三级| 成人免费观看av| 欧美丰满嫩嫩电影| 久久精品999| 欧美综合视频在线观看| 午夜精品久久一牛影视| 欧洲精品久久| 综合在线观看色| 国产欧美韩日| 国产精品视频一二三| 91免费在线观看网站| 欧美哺乳videos| 国产aⅴ综合色| 91精品国产综合久久精品图片| 国内一区二区视频| 色老汉av一区二区三区| 性做久久久久久免费观看欧美| 欧美日韩在线精品| 国产精品高潮呻吟|