TMS320LF240x DSP控制器的應用實踐
TI公司在1982年成功推出其第一代DSP芯片之后,相繼推出了多種適合不同應用、不同規格的DSP系列。TMS320F240x DSP是為了滿足控制應用而設計的,屬于TMS320C2xx系列。通過把一個高性能的DSP內核和微處理器的片內外部設備集成在一個芯片的方案,TMS320LF240x DSP成為傳統微控制器和昂貴的多片設計的一種廉價替代產品。3OMIPS的處理速度,使TMS320IF240x DSP可以遠遠超過傳統的16位微控制器和微處理器的性能。筆者曾用該系列芯片中的TMS320F2406開發過電動執行機構,得到了滿意的結果。結合自己的開發經驗,筆者簡要介紹TMS320LF240xDSP的硬件結構、C程序開發過程中若干關鍵的問題。其中很多包括筆者的心得和體會。
1 TMS320LF240X DSP硬件結構特點
TMS320LF240x DSP有以下一些特點:采用高性能靜態CMOS技術,使得供電電壓降為3.3V,減少了功耗;基于TMS320C2xxDSP的CPU核,保證與TMS320系列DSP代碼兼容;片內有高達32K字的Flash程序存儲器,544字的雙口RAM(DARAM)和2K字的單口RAM(SARAM);兩個事件管理器模塊EVA和EVB,適用于控制各類電機;看門狗定時器模塊(WDT);控制器局域網絡(CAN)2.0B模塊;串行通信接口(SCI)模塊;16位的串行外設接口(SPI)模塊;JTAG接口,使得在系統編程(ISP,)很容易實現;10位A/D轉換器最小的轉換時間為500ns,可選擇由兩個事件管理器來觸發2個8通道輸入A/D轉換器或1個16通道輸入A/D轉換器,而每次要轉換的通道都可通過編程來選擇。需要說明的是,TMS320LF240x DSF是定點l6位芯片,存儲數據的最小單位是16位的字,每個地址(包括程序地址、數據地址及I/O地址)所存的數據都是16位。
1.1 改進的哈佛結構和流水線操作
DSP采用程序空間和數據空間完全分開的哈佛(Havard)結構,允許同時取指令和操作數,而且允許在程序空間和數據空間之間相互傳遞數據,即改進的哈佛結構。TMS320LF240x DSP的cPu核心具有獨立的內部數據和程序總線結構。數據和程序總線分為6條l6位的總線,分別為:PAB,程序地址總線,為讀寫程序空間提供地址;DRAB,數據讀地址總線,為讀數據空間提地址;DWAB,數據寫地址總線,為寫數據空間提供地址;PRDB,從程序空間向c.PU傳送代碼、立即操作數和表信息的程序讀總線;DRDB,從數據空間向中央算術邏輯單元(CALU)和輔助寄存器算術單元(ARAU)傳送數據的數據讀總線;DWEB,可以傳送數據到程序空間和數據空間的數據寫總線。數據讀地址總線(DRAB)和數據寫地址總線(DWAB)是相互獨立的地址總線,CPU 在相同的機器周期內可以同時進行數據讀寫操作。
TMS320LF240x DSP流水線具有四個獨立的階段:取指令、指令譯碼、取操作數以及指令執行。一般情況下,取指令占用PAB和PRDB;指令譯碼不占用任何程序和數據總線;取操作數占用DRAB和DRDB;指令執行包括將執行結果寫回數據存儲器,將占用DWAB和DWEB。可見,TMS320LF240x DSP獨特的總線結構大大減少了流水線沖突,極大提高了指令的運行速度。
1. 2事件管理器模塊
事件管理器模塊提供了許多適用于運動控制和電機控制的功能。每個240x器件都包括兩個事件管理器模塊:EVA和EVB。每個事件管理器模塊包括兩個16位69通用定時器、比較單元、捕獲單元、8個16位的脈寬調制(PWM)通道以及正交編碼脈沖輸入電路。它們能夠實現:三相反相器控制;PWM的對稱和非對稱波形;編程的PWM死區控制以防止上下橋臂同時導通而引起短路。事件管理器模塊適用于控制交流感應電機、無刷直流電機、開關磁阻電機、步進電機、多級電機以及逆變器。
2 C0FF目標文件
TI公司匯編器所創建的目標文件采用的是一種稱為COFF(Common Object File Format)的文件格式,即共同目標文件格式。目的是提高編程和程序執行的效率,同時也有利于使用TI公司的BIOS(Basic Input Output System)。
COFF文件格式的核心概念就是使用代碼段、數據段編程,而不是指令或數據簡單的順序編寫。代碼段和數據段的概念不僅是現代軟件編制的重要技術概念,同時也是嵌入式系統的重要編程技術。使用這種技術的優點是:程序具有良好的可讀性;程序具有良好的可移植性;能與系統存儲單元充分配合。
在COFF目標文件中,段(section)是其最小的單位。所謂“段”就是最終在TMS320 DSP的存儲器映像中占據連續空間的一塊代碼或數據。這些段在目標文件中是相互獨立的。由于大多數系統都包含有不同類型的存儲器(ROM、RAM、EEPROM),所以使用段可使用戶更有效地利用目標存儲器;所有段都能夠獨立進行重定位,因此可以將不同的段分配至不同類型的存儲器中去。
通常,一個COFF目標文件中都包含三個缺省段:text段(通常包含可執行代碼)、.data段(通常包含已初始化數據)和.bss段(通常為未初始化的數據保留所需的空間)。除了這三個缺省的段之外,編程人員可使用匯編器指示符(.sect和usect)自定義段。
TMS320LF240x DSP C編譯器產生可重定位的數據段和代碼段。這些段以不同方式分配到內存中,以滿足不同的系統配置。編譯器創建兩種基本的段:初始化段和未初始化段。
初始化段包括數據表和可執行代碼。C編譯器創建下初始化段:
◆.text段一包含所有的可執行代碼和浮點常數;
◆.cinlt段一包含用于初始化全局變量和靜態變量的表:
◆.const段一包含字符常量以及用關鍵字const聲明的全局和靜態變量:
◆.switch段一包含switch語句的跳轉表。
未初始化段在內存(通常是RAM)中保留空間。程序在運行時用這些空間創建和保存變量。編譯器創建以下未初始化段:
◆.bss段一為全局變量和靜態變量保存空間,在程序開始運行時,C初始化boot程序將數據從.Clnlt拷貝到bss段中;
◆.stack段――為系統堆棧分配存儲空間,用于將變量傳遞至函數以及為局部變量分配空間;
◆.system段一為動態內存分配保留空間,為動態存儲函數malloc、callo和realloc分配存儲空間。當然,若C程序沒有用到這些函數,那么編譯器就不用創建system段了。
3 C程序運行環境
TMS320LF240x DSP提供兩種編程語言:匯編語言和C語言。如果源程序為C語言,需調用TMS320LF240x DSP的C編譯器將其編譯成匯編語言,然后送匯編器進行匯編。匯編后產生COFF格式的目標文件,再用鏈接器進行鏈接(鏈接過程包括將編譯器的運行支持庫相關代碼鏈接進來以及代碼段和數據段的重定位),生成在TMS320LF240x DSP上可執行的COFF格式的目標代碼(如有必要,可使用目標代碼格式轉換工具),并調用下載程序將目標代碼下載到目標芯片上。
TMS32OC2xx DSP(當然包括TMS320LF240x DSP)C語言編譯器包含兩個庫:rts2xx.1ib和rts.src。
(1)rts2xx.Ii b
rts2xx.1ib運行支持目標庫。具有COFF文件格式。運行支持目標庫(即rts2xx1ib)是由rts.src中的C和匯編源程序通過編譯和匯編而得到的。rts2xx lib包含三部分內容:ANSI C標準庫、系統啟動程序c int00、允許C訪問特殊指令的函數和宏。
鏈接程序時,必須指明具體的目標庫并把該庫作為鏈接輸入文件之一,這樣對目標庫所包含的運行支持函數的引用就得到了解決。鏈接運行目標庫時,鏈接器只是將目標庫中被引用部分加進目標文件。這里所說的目標庫指的就是rts2xx.lib。由于運行支持函數符合函數調用規約,可以直接被C訪問。
(2)rts.src
rts.src運行支持源文件庫,由c和匯編源程序組成,可在集成開發環境(CCS)下打開,任何一個運行支持函數的源代碼都可以在rts.src找到。
rts.src中包含有用匯編語言編寫的算術程序。由于這些函數的特殊調用規約,它們不能從C中被訪問:但可以對它們作擴展或修改以作為自己的程序。只要修改后的程序遵循函數特定的調用規約和保護規約,它們就可以被C直接訪問。
算術程序中包含浮點運算函數。浮點數采用IEEE754單精度浮點數格式為
浮點數由3部分組成,即符號位(“S”)、指數和尾數。指數是有+127偏置的無符號整數。一個浮點數占有32位,占用TMS320LF240x DSP兩個字的空間。32位規格化數的值由值(規格化)=(-1)3l.尾數2(指數-127)給出。這樣,浮點數O.5的單精度浮點數為3F000000h,格式為
例如,源庫rts.src中的匯編函數F$$ITOF是將16位有符號整形數轉換為浮點數,只要在匯編程序中加入“ref F$$ITOF”指令,即可直接調用該函數。查看F$$ITOF函數的說明文檔可知,該函數不遵循C子程序調用規約,所以它不能直接被C調用。
下面介紹C程序的系統初始化。
在運行C程序之前,必須創建C運行環境。這個程序由C引導程序使用名為c_intO的函數來執行。運行支持源庫(rts.src)在名為boot.asm的模塊中包含這個程序的源程序。c_intO執行如下初始化C環境的任務:
①為系統堆棧定義一個名為stack的段,并設置初始化指針;
②初始化全局變量,將.Clnlt段中的初始化表中的數據復制到bss段中;
③調用函數main來運行C程序。
運行堆棧(即.stack段)被分配在存儲器的一個連續塊中,并且從低地址向高地址增加。寄存器ARl通常指向堆棧中下一個可獲得的字(堆棧頂加一個字)。代碼不會檢查運行時堆棧是否會溢出,因此要確保分配給堆棧足夠的空間。
有些全局變量在C程序開始運行前必須賦初值,檢索這些變量的數值并用數值將它們初始化的過程成為自動初始化。編譯器在名為.clnlt(該段位于程序空間)的特殊段中建立表。該段包含了用于初始化全局變量和靜態變量的數據。每個被編譯模塊都包含這些初始化表,鏈接器將它們組成單個表(單個的clnlt段)。引導程序使用這個表初始化所有的系統變量。
.clnlt段中的表是由多項初始化記錄組成的。每個必須自動初始化的變量在.cinit段中都有記錄,.clnlt段中初始化記錄的格式如圖l所示。
初始化記錄包括三部分:字節長度,即需要初始化的變量個數;.bss中變量的指針,為該記錄第一個變量在.bss段中的地址;初始化數據,指的是用于初始化變量的數據。初始化數據的個數必須和字節長度相等。在變量的自動初始化過程中,為了能讓初始化程序識別初始化記錄的結尾,最后一項初始化記錄的第一個字用0填充,即該初始化記錄的字節長度為0。至此初始化程
序完成了全局變量的初始化。
全局變量的初始化包括運行時變量的自動初始化和加載時變量的初始化。筆者認為,加載時變量的初始化沒有實用價值。因為當DSP斷電后,這些變量的值就丟失了。當DSP重新上電后,由于初始化程序不給這些全局變量賦初值,使得系統的初始化失敗。
4 C語言和匯編語言的混合編程
開發DSP芯片可以用匯編語言或C語言。兩種語言各有所長:用C語言開發DSP芯片,開發速度快,可讀性好,可移植性強;而用匯編語言開發DSP芯片,則能充分利用DSP芯片的軟硬件資源,程序代碼的執行效率高。在DSP運算能力比較寬裕,實時性要求不是很強的場合,用C語言非常合適。在對運算速度以及實時性要求極高或者是在不能擴展外部存儲器而且片內存儲器又非常有限的條件下,使用匯編語言幾乎是必須的。在程序的開發過程中,幾乎不可避免地要使用C語言和匯編語言的混合編程。
用C語言和匯編語言進行混合編程主要有以下三種方法:
①獨立編寫C程序和匯編程序,分開編譯或匯編形成各自的目標代碼模塊,然后用鏈接器將C語言模塊和匯編模塊鏈接起來。這其實就是一個C模塊和匯編模塊的接口問題。
②直接在C程序中的相應位置嵌入匯編語句。
③對C程序進行匯編生成相應代碼,然后對這些匯編代碼進行手工優化與修改。
在用c語言和匯編語言進行混合編程時,必須遵循寄存器規約和函數調用規約。
(1)寄存器規約
在C環境中,對什么寄存器用于完成什么樣的操作有嚴格規定。所有這些規定統稱為寄存器規約(registcr conventions)。如果想編寫出正確的C語言DSP程序,將C程序和匯編程序接口,則必須理解和遵循這些規約寄存器規約規定編譯器如何使用寄存器以及在函數的調用過程中如何保護寄存器。在函數的調用過程中有兩種保護寄存器的方法:一種是在調用時保護寄存器(由調用函數來完成),另一種是在被調用函數程序的入口處保護寄存器(由被調用函數來完成)。限于篇幅,不再詳細介紹。在編程的過程中,一定要嚴格遵循這些規約,否則,會出現錯誤。
(2)函數調用規約
C編譯器對函數調用有一系列嚴格的規約。任何函數不管是調用C函數,還是被C函數調用,都必須遵循這些規約。不遵循這些規約將破壞C環境,導致程序運行失敗。函數調用規約(function calling conyentions)l確規定在函數調用的全過程中,調用函數和被調用函數所必須執行的操作,以保證調用前后C環境的一致性。
當父函數調用子函數時,必須保證當前的輔助寄存器為ARl。父函數執行以下操作:①將被調用函數所需參數的值壓入堆棧(按從右到左的順序),使最左邊的參數位于堆棧的頂部;②調用子函數,即開始執行子函數程序代碼;③父函數認為,當函數調用返回時,ARl是當前的輔助寄存器;④當被調用函數完成時,父函數將堆棧指針移回到函數調用前的位置。直接把壓入堆棧中參數的值丟棄。
由上可看出,函數調用過程中參數的傳遞是值傳遞,并沒有改變參數的值,只是把被調用函數所需參數的值拷貝進堆棧中。子函數使用的是堆棧中的拷貝。子函數對拷貝部分的修改并不改變參數的值。當函數調用完成時,父函數直接將堆棧中的拷貝丟棄。
子函數所執行的操作相對復雜一些,這里不再敘述。讀者可參閱TI公司技術手冊:TMS320C2x/C2xx/C5xOptlmizing CCompiler Users’s Guide。
結語
從普及、推廣的角度來看,TI公司的TMS320C2xx系列具有較好的應用基礎和較高的性能價格比,在我國有著廣泛的應用前景。TMS320LF240x DSP是TMS320C2xx系列中的新成員,其性能遠遠超過傳統的l6位微控制器和微處理器,非常適用于電機的數字化控制,是電機數字化控制的升級產品。用高級語言進行DSP的開發是DSP開發的重要方向。C語言在滿足控制應用程序運行速度的基礎上可以更好地維護程序和移植程序,是開發控制應用程序的必然趨勢。因此,我們有必要深入了解C程序的運行環境和編譯器的工作原理。DSP軟硬件開發過程中綜合了多方面的知識,只有在充分了解硬件資源的基礎上,才能開發出好的程序。
評論