解決軟件和硬件接口問題的嵌入式系統(tǒng)設(shè)計(jì)實(shí)例
嵌入式系統(tǒng)設(shè)計(jì)中,,軟件和硬件的接口問題經(jīng)常困擾軟件開發(fā)工程師,。正確理解接口在處理器與高級(jí)語言開發(fā)環(huán)境方面的約束條件,可以加速整個(gè)系統(tǒng)設(shè)計(jì),,并為改進(jìn)系統(tǒng)的質(zhì)量、性能和可靠性以及縮短開發(fā)周期和減少成本提供保證,,本文從兩個(gè)設(shè)計(jì)實(shí)例的比較入手,,介紹了嵌入式系統(tǒng)的設(shè)計(jì)原則以及關(guān)于寄存器及其域的種種考慮。
嵌入式系統(tǒng)設(shè)計(jì)通常分為兩個(gè)部分:硬件設(shè)計(jì)和軟件開發(fā),。這兩部分任務(wù)通常由不同的設(shè)計(jì)小組負(fù)責(zé),,相互間很少有覆蓋的地方。由于軟件小組很少涉足前面的硬件設(shè)計(jì),,采用這種方式進(jìn)行開發(fā)經(jīng)常會(huì)遇到問題,,特別是硬件與軟件開發(fā)環(huán)境之間的接口性能較差時(shí),會(huì)導(dǎo)致系統(tǒng)開發(fā)時(shí)間延長(zhǎng),、開發(fā)成本提高,,最終推遲產(chǎn)品的上市。
最理想的解決方案是軟件小組參與硬件設(shè)計(jì),,但是在時(shí)間安排,、資金和人員方面往往又是不實(shí)際的。一種變通的方法是創(chuàng)建一套硬件接口規(guī)范來加速軟件開發(fā)流程,。從軟件開發(fā)者的角度來理解最優(yōu)化的硬件接口設(shè)計(jì)能有效地防止軟件開發(fā)中出現(xiàn)不必要的硬件問題,,這種方法對(duì)硬件設(shè)計(jì)流程造成的影響也很小。
嵌入式系統(tǒng)結(jié)構(gòu)的一般模型
從系統(tǒng)角度看,,嵌入式系統(tǒng)是多種系統(tǒng)要素之間的很多接口的集合,,這里羅列的主要資源是系統(tǒng)處理器。處理器接口可以分成兩大類,,分別標(biāo)識(shí)為本地總線和硬件總線,。值得注意的是,本文中的總線是根據(jù)處理器利用資源時(shí)的訪問類型單獨(dú)定義的,,與具體的硬件連接沒有對(duì)應(yīng)關(guān)系,。
本地總線是資源與處理器之間的接口總線,它允許無限制的連續(xù)訪問,。無限制訪問意味著處理器能夠利用其內(nèi)部數(shù)據(jù)類型(如字節(jié),、字和雙字)訪問一個(gè)資源的所有要素;連續(xù)訪問是指所有資源要素占用的資源地址空間是連續(xù)的,,中間沒有任何間隔,。RAM和EPROM就是與本地總線接口的常見范例。
硬件總線與資源的連接通常有某些限制,如大小,、位置,、尋址、地址空間或重定位等,。只接受字寫入的I/O端口,,或者使用前必須先作映射的PCI總線上的外圍芯片是硬件總線接口的一些實(shí)例。采用硬件總線連接對(duì)軟件設(shè)計(jì)工程師訪問資源有一定的限制,,可能在軟件設(shè)計(jì),、開發(fā)和集成過程中產(chǎn)生復(fù)雜代碼和代碼錯(cuò)誤。
正確的硬件總線接口設(shè)計(jì)能夠加快軟件設(shè)計(jì)進(jìn)程,,通常也能加快硬件驗(yàn)證速度,。本文重點(diǎn)介紹與可編程邏輯資源相連接的硬件總線的設(shè)計(jì)與實(shí)現(xiàn)。
系統(tǒng)定義的實(shí)例
這里考慮兩種不同的硬件實(shí)現(xiàn)方式,。該系統(tǒng)是處理器控制的三軸伺服系統(tǒng),,本部分的系統(tǒng)設(shè)計(jì)僅限于位置反饋控制的設(shè)計(jì),因此有助于我們專注于硬件接口的實(shí)現(xiàn),。
該系統(tǒng)的兩種實(shí)現(xiàn)方式都實(shí)現(xiàn)了處理器與用戶ASIC(或FPGA)的接口,,從而為三軸伺服提供驅(qū)動(dòng)與反饋信息。每個(gè)系統(tǒng)中的ASIC必須利用32位數(shù)據(jù)總線使處理器與三套驅(qū)動(dòng)/反饋資源連接,。每種資源包含有一個(gè)帶符號(hào)的10位驅(qū)動(dòng)寄存器,、一個(gè)帶符號(hào)的8位位置寄存器和一個(gè)3位的錯(cuò)誤狀態(tài)寄存器,任何一個(gè)位置位都表示一種錯(cuò)誤狀態(tài),,由它產(chǎn)生軸驅(qū)動(dòng)(axis drive)的關(guān)閉信息,。
圖1和圖2表示了一種寄存器接口的可能實(shí)現(xiàn)方式,,分別標(biāo)識(shí)為系統(tǒng)實(shí)現(xiàn)A和系統(tǒng)實(shí)現(xiàn)B,。為了描述方便,后文以系統(tǒng)A和系統(tǒng)B分別指代這兩種實(shí)現(xiàn),。
當(dāng)采用VHDL(或其它高級(jí)硬件設(shè)計(jì)方法)實(shí)現(xiàn)時(shí),這兩種硬件接口的設(shè)計(jì)復(fù)雜性幾乎是相等的,。系統(tǒng)A顯得稍微高效些,,因?yàn)槠浼拇嫫鞯刂纷g碼相對(duì)簡(jiǎn)單些,所采用的硬件數(shù)量也比系統(tǒng)B少,。為了減少與處理器接口的可編程器件中邏輯單元的數(shù)量,大多數(shù)硬件設(shè)計(jì)工程師會(huì)選擇系統(tǒng)A的實(shí)現(xiàn)方式,。
表1所示的偽隨機(jī)碼為軸驅(qū)動(dòng)程序,可用于A,、B兩個(gè)系統(tǒng),。偽隨機(jī)碼設(shè)計(jì)用于基于先進(jìn)處理器的系統(tǒng)實(shí)現(xiàn),并運(yùn)行于實(shí)時(shí)操作系統(tǒng),,以通用軸控制程序的三份獨(dú)立挎貝(或任務(wù)實(shí)例)實(shí)現(xiàn)軸的控制,。當(dāng)使用系統(tǒng)A中定義的接口時(shí)只需偽隨機(jī)碼中那些帶星號(hào)的代碼行。
很明顯,,即使在代碼原型階段系統(tǒng)B所需的代碼也比系統(tǒng)A少很多,。系統(tǒng)B中的硬件設(shè)計(jì)要稍微復(fù)雜一些,,但能減輕軟件開發(fā)的負(fù)擔(dān),。后文將回顧這兩個(gè)實(shí)例系統(tǒng)和偽隨機(jī)碼,。
在閱讀本文時(shí),,硬件設(shè)計(jì)工程師可能會(huì)產(chǎn)生這個(gè)問題:“為什么第一個(gè)設(shè)計(jì)的效率要比第二個(gè)低?”。兩種實(shí)現(xiàn)方式控制軸向操作的參數(shù)是相同的,,而第一種方法所需的可編程硬件器件數(shù)量顯然要比第二種少。為了正確回答這個(gè)問題,,設(shè)計(jì)工程師必須從系統(tǒng)的角度來看待這個(gè)設(shè)計(jì),,而不是硬件設(shè)計(jì)工程師慣用的“邏輯門”角度,。下一部分將闡述硬件設(shè)計(jì)工程師開發(fā)系統(tǒng)硬件接口時(shí)常會(huì)遇到的一些概念,,將進(jìn)一步討論這些技術(shù),,并檢查將這些概念應(yīng)用于實(shí)例系統(tǒng)設(shè)計(jì)后的結(jié)果。
為了滿足項(xiàng)目要求,,對(duì)整個(gè)系統(tǒng)結(jié)構(gòu)進(jìn)行優(yōu)化時(shí)需要在硬件與軟件實(shí)現(xiàn)之間作出折衷,現(xiàn)實(shí)中是沒有項(xiàng)目能滿足這里提到的所有理想軟件接口要求的。對(duì)理想狀態(tài)的認(rèn)識(shí)有助于硬件設(shè)計(jì)工程師識(shí)別并消除影響軟件設(shè)計(jì)的一些障礙,。
設(shè)計(jì)原則
1. 采用標(biāo)準(zhǔn)總線訪問
有效的嵌入式硬件接口設(shè)計(jì)的一般原則是:對(duì)軟件設(shè)計(jì)工程師來說,硬件設(shè)計(jì)應(yīng)確保對(duì)硬件資源的訪問盡可能透明,。處理器使用所有標(biāo)準(zhǔn)的讀寫指令可以實(shí)現(xiàn)透明訪問,而不用考慮前面的訪問內(nèi)容或時(shí)序,。
像頁寄存器設(shè)置,、地址線上的寫數(shù)據(jù)編碼等都可能嚴(yán)重影響代碼的開發(fā),并常常需要開發(fā)標(biāo)準(zhǔn)訪問與所需特殊訪問之間完成相互轉(zhuǎn)換的驅(qū)動(dòng)程序,。
通常不可避免要采用一些特殊總線,但需要慎重考慮特殊訪問空間的使用選擇,,因?yàn)檫@種情況會(huì)給系統(tǒng)軟件設(shè)計(jì)帶來一定的困難,。系統(tǒng)A采用了只寫寄存器,因此要求系統(tǒng)軟件提供“影子”內(nèi)存(Shadow memory)來保存寫入到資源的數(shù)據(jù),。而系統(tǒng)B由于允許所有的寄存器都可讀寫,,因此沒有這種限制,。
2. 開發(fā)基于處理器的資源接口
硬件設(shè)計(jì)工程師習(xí)慣于從下至上分析資源接口問題以及與系統(tǒng)總線的連接,而通過分析處理器在系統(tǒng)中對(duì)資源的訪問過程則更好。
“處理器與資源”間的接口常常是最重要的接口,,在硬件設(shè)計(jì)流程中它的效率應(yīng)是最優(yōu)先考慮的對(duì)象,。統(tǒng)一規(guī)劃整個(gè)系統(tǒng)的資源訪問對(duì)于正確理解由硬件設(shè)計(jì)選擇所引起的訪問限制很重要,。
現(xiàn)有最先進(jìn)的系統(tǒng)包含有存儲(chǔ)控制器和可再映射總線,,它們會(huì)改變處理器與資源接口之間的訪問類型,。一般地說,一個(gè)不合格的硬件接口設(shè)計(jì)在軟件小組試圖與實(shí)際資源連接前是不可能反映出來的,,這一點(diǎn)對(duì)于設(shè)計(jì)硬件接口很重要,。
3. 系統(tǒng)內(nèi)存映射的創(chuàng)建與維護(hù)
對(duì)于一個(gè)好的系統(tǒng)設(shè)計(jì)來說,,所有資源的存儲(chǔ)器映射都非常重要,。如前所述,,存儲(chǔ)器映射的設(shè)計(jì)應(yīng)考慮到具體處理器要求,,而不是簡(jiǎn)單地說明一個(gè)資源所解碼的地址線類型。如果采用的是寄存器可配置資源,,如PCI總線,,硬件設(shè)計(jì)工程師應(yīng)在存儲(chǔ)器映射中配置所有與該資源有關(guān)的配置寄存器,,并提供用以創(chuàng)建硬件驗(yàn)證所需的靜態(tài)映射的配置寄存器初始化值。
硬件設(shè)計(jì)工程師還必須認(rèn)真考慮動(dòng)態(tài)重配置的優(yōu)越性,。在可重配置總線上沒有新增(或減少)資源的系統(tǒng)能演變成一個(gè)靜態(tài)映射,方法是強(qiáng)迫配置寄存器在系統(tǒng)復(fù)位后回復(fù)到同一值,。這個(gè)“靜態(tài)”系統(tǒng)圖為硬件集成和軟件開發(fā)提供了一個(gè)穩(wěn)定的統(tǒng)一結(jié)構(gòu),,同時(shí)還避免了在系統(tǒng)代碼中使用易產(chǎn)生錯(cuò)誤的指針操作,。
最后,,隨著系統(tǒng)的不斷成熟,,存儲(chǔ)器映射也必須不斷完善,,并隨著軟硬件開發(fā)的進(jìn)展不斷改進(jìn),。
4. 統(tǒng)一的訪問模式
當(dāng)前的嵌入式系統(tǒng)由于復(fù)雜度的提高,,通常由多人共同合作進(jìn)行設(shè)計(jì),。每個(gè)硬件部件的設(shè)計(jì)必須與整體一致,,這樣才能開發(fā)出統(tǒng)一的資源訪問模式。如果不同功能模塊的訪問不一致的話,在軟件開發(fā)期間就會(huì)產(chǎn)生潛在的訪問限制錯(cuò)誤,,從而可能需要為每個(gè)子系統(tǒng)設(shè)計(jì)專門的軟件驅(qū)動(dòng)程序,。對(duì)不同邏輯塊的不一致訪問也會(huì)使硬件集成和驗(yàn)證變得困難重重。
例如設(shè)計(jì)工程師在調(diào)試器上編輯4個(gè)十六進(jìn)制數(shù)字并不能保證處理器會(huì)使用一個(gè)16位的讀/寫周期,,因此,,對(duì)軟件開發(fā)和硬件集成中使用調(diào)試工具設(shè)置多種類型的限制訪問也具有一定的困難。這樣看來,,評(píng)估仿真器處理多個(gè)限制性訪問地址空間的能力就非常有用,,特別是在用“限制外”訪問方式觸發(fā)總線故障的處理器結(jié)構(gòu)中。
寄存器設(shè)計(jì)
既然硬件設(shè)計(jì)工程師的重點(diǎn)已經(jīng)從邏輯門和總線轉(zhuǎn)移到了系統(tǒng)設(shè)計(jì),,我們?cè)賮韺徱曇幌氯魏翁幚砥飨到y(tǒng)中最常用到的寄存器設(shè)計(jì),。寄存器接口允許高速訪問資源,其訪問的效率對(duì)系統(tǒng)的性能有很大的影響,。
寄存器的結(jié)構(gòu)與訪問
設(shè)計(jì)工程師應(yīng)該精心選擇硬件寄存器大小,,使處理器能最有效地進(jìn)行硬件訪問。一般來說,,總是采用系統(tǒng)內(nèi)部整數(shù)訪問方式,。寄存器應(yīng)該被譯碼為連續(xù)的組(沒有地址空檔),,這樣可以加速指針或陣列索引對(duì)寄存器的訪問。任何可寫的寄存器也應(yīng)該是以同樣的格式可讀,,這樣可以避免使用本地存儲(chǔ)器來緩存這些寄存器值,。
控制一個(gè)子系統(tǒng)的寄存器應(yīng)該以相同的結(jié)構(gòu)形式在一起分組,,使軟件能使用通用的驅(qū)動(dòng)程序?qū)λ鼈冞M(jìn)行訪問,。當(dāng)設(shè)計(jì)中需要多個(gè)同一類型的子系統(tǒng)時(shí)這點(diǎn)尤其重要,。
為了避免被編碼成獨(dú)立進(jìn)程的軟件任務(wù)之間發(fā)生沖突,,獨(dú)立的子系統(tǒng)不能在系統(tǒng)處理器訪問期間共享可寫寄存器,。這些“獨(dú)立”的軟件進(jìn)程在訪問共享寄存器時(shí)會(huì)產(chǎn)生競(jìng)爭(zhēng),,除非在系統(tǒng)代碼中使用不可中斷的讀/寫驅(qū)動(dòng)程序。根據(jù)操作系統(tǒng)的不同,,多個(gè)進(jìn)程共享寄存器甚至可能會(huì)產(chǎn)生功能調(diào)用的額外開銷。訪問共享寄存器的同時(shí)還有執(zhí)行其它進(jìn)程的做法是錯(cuò)誤的,,也是軟件設(shè)計(jì)的通病,,會(huì)導(dǎo)致間歇性的系統(tǒng)故障,影響集成和測(cè)試系統(tǒng)軟件的進(jìn)度。
系統(tǒng)A違反了很多上文提到的原則,如采用只寫寄存器,共享控制和狀態(tài)寄存器,,以及沒有為每個(gè)軸提供公共的寄存器映射,。系統(tǒng)A必須用專門的驅(qū)動(dòng)程序來緩沖寫輸出數(shù)據(jù),,移位并屏蔽軸驅(qū)動(dòng)與位置信息,并防止軸驅(qū)動(dòng)寄存器內(nèi)容被為每個(gè)軸任務(wù)編寫的代碼所影響,。系統(tǒng)B由于分離并重組了與每個(gè)軸有關(guān)的寄存器,,因此能克服這些問題。
寄存器復(fù)位內(nèi)容
硬件設(shè)計(jì)工程師應(yīng)仔細(xì)考慮系統(tǒng)的復(fù)位狀態(tài)。硬件設(shè)計(jì)通常采用啟動(dòng)程序來取得系統(tǒng)啟動(dòng)后的控制權(quán),,并將系統(tǒng)初始化到一個(gè)安全的狀態(tài),。系統(tǒng)復(fù)位后應(yīng)將硬件置于一個(gè)確定的安全狀態(tài),并且硬件應(yīng)持續(xù)保持安全狀態(tài)直到系統(tǒng)軟件初始化完成為止,。代碼也應(yīng)在軟件控制下復(fù)位硬件以幫助調(diào)試,、自檢和原始代碼的開發(fā)。
系統(tǒng)A不控制驅(qū)動(dòng)寄存器的復(fù)位內(nèi)容,,需要代碼的介入來將所有三個(gè)軸的驅(qū)動(dòng)寄存器設(shè)置為零,。這種結(jié)構(gòu)會(huì)產(chǎn)生嚴(yán)重的系統(tǒng)設(shè)計(jì)問題,因?yàn)樘幚砥魍ǔJ潜3衷趶?fù)位狀態(tài),,直到FPGA和ASIC加電并得到配置后處理器才正常工作,。如果開發(fā)人員使用仿真器,那么在集成過程中系統(tǒng)A還會(huì)出現(xiàn)另外的問題:被仿真器控制的處理器在系統(tǒng)加電后可能需要很長(zhǎng)的初始化時(shí)間才能正常工作,。在軟件取得控制權(quán)之前系統(tǒng)A和B的軸都處于隨機(jī)驅(qū)動(dòng)狀態(tài),。
系統(tǒng)B在加電后會(huì)將所有軸驅(qū)動(dòng)寄存器設(shè)為零,它對(duì)軸驅(qū)動(dòng)設(shè)置的控制并不依賴于啟動(dòng)時(shí)間,。因?yàn)橄到y(tǒng)B沒有隱藏的狀態(tài)機(jī),,因此在本設(shè)計(jì)中沒有必要考慮增加額外的軟件復(fù)位寄存器。
寄存器域設(shè)計(jì)
大多數(shù)資源接口所包含的數(shù)據(jù)項(xiàng)并不正好適合一個(gè)寄存器,。這種情況下,,硬件設(shè)計(jì)工程師必須將一個(gè)寄存器分成若干域。合理的域結(jié)構(gòu)對(duì)系統(tǒng)性能來說非常重要,,與寄存器接口設(shè)計(jì)有相似的影響。有效的域接口設(shè)計(jì)規(guī)則類似于寄存器設(shè)計(jì)規(guī)則,,但設(shè)計(jì)工程師還需要特別注意域的順序與放置,,還要對(duì)寄存器中未用到一些字節(jié)作一定的處理。
1. 寄存器的域
域被定義為寄存器中若干位的子集,,主要用于報(bào)告或控制資源的一個(gè)功能要素,。在硬件設(shè)計(jì)中最常用的域類型有:1. 布爾域:真或假,通常是一位,;2. 多位狀態(tài)域和控制域:多位用于報(bào)告或控制內(nèi)部相關(guān)功能,;3. 列舉狀態(tài)域和控制域:多個(gè)位的集合,其中每個(gè)位代表了一種不同的硬件狀態(tài),;4. 數(shù)字域:多個(gè)位組合在一起用來代表一定的數(shù)量值,。
從軟件使用者角度看,最有效的域結(jié)構(gòu)是每個(gè)寄存器只用一個(gè)域,。這種理想的軟件結(jié)構(gòu)可能導(dǎo)致硬件實(shí)現(xiàn)效率低,,因此一個(gè)好的系統(tǒng)設(shè)計(jì)需要在軟硬件設(shè)計(jì)之間作出折衷,在每個(gè)寄存器中應(yīng)放置多個(gè)域。
下文將著重討論一個(gè)寄存器中假設(shè)存在多個(gè)域的情況,,不過,,當(dāng)對(duì)資源的某個(gè)特殊參數(shù)進(jìn)行的有效訪問將嚴(yán)重影響系統(tǒng)軟件性能時(shí),硬件設(shè)計(jì)工程師仍應(yīng)該考慮使用單個(gè)域的寄存器,。
2. 域結(jié)構(gòu)
前文提到的用于寄存器的結(jié)構(gòu)概念同樣也適合于寄存器內(nèi)部的域,。一個(gè)寄存器應(yīng)該只包含屬于設(shè)計(jì)中同一功能要素的域,并且該寄存器中的所有可寫域都應(yīng)該是可讀的,。
那些包含有屬于多個(gè)功能要素的域的寄存器同樣需要特殊驅(qū)動(dòng)程序支持,,這樣才能使多個(gè)進(jìn)程安全地訪問每個(gè)域。而配置為“只寫”功能的域需要分配影子內(nèi)存來保存寄存器域中的前一狀態(tài)值,。硬件設(shè)計(jì)工程師原來設(shè)想的簡(jiǎn)單的“屏蔽/寫”操作現(xiàn)在變成了繁雜的多步功能調(diào)用,,首先必須禁止中斷和任務(wù)切換,然后讀本地存儲(chǔ)器,,屏蔽輸入輸出值,,再進(jìn)行硬件寄存器寫,最后開放中斷和多任務(wù)切換,。如果寄存器中所有域能得到有效安排,,通過一個(gè)軟件任務(wù)就能訪問全部域的話,上述情況就能得到有效避免,。
由于系統(tǒng)A將屬于不相關(guān)功能的多個(gè)域組合放在一個(gè)寄存器中,,因此它需要使用特殊的驅(qū)動(dòng)程序。而系統(tǒng)B則遵循“單個(gè)寄存器內(nèi)的域按任務(wù)進(jìn)行組織”的原則,,將每個(gè)域放置在屬于自己的專用寄存器中,,因此能高效地訪問資源中的每個(gè)軸參數(shù)。
3. 十六進(jìn)制數(shù)字對(duì)齊
硬件設(shè)計(jì)工程師還應(yīng)該明白針對(duì)處理器和軟件開發(fā)環(huán)境進(jìn)行對(duì)齊約束,。如果將域放置在錯(cuò)誤的地址上而超出字的邊界,,將迫使軟件設(shè)計(jì)工程師只能按塊訪問每個(gè)域,進(jìn)而增加訪問復(fù)雜性,,降低訪問的速度,。在調(diào)試過程中,用零值填充域是非常有用的,,可以使每個(gè)域的最低位對(duì)齊十六進(jìn)制數(shù)字(4位)的邊界:當(dāng)在邏輯分析儀,、調(diào)試儀或仿真器上顯示寄存器情況時(shí),十六進(jìn)制數(shù)字對(duì)齊會(huì)有助于域值的可視化提取,。系統(tǒng)A的寄存器域是沒有對(duì)齊的,,因此從原始的十六進(jìn)制數(shù)據(jù)中提取域值很困難。由于控制域沒有對(duì)齊,,在查錯(cuò)時(shí)屏蔽測(cè)試輸入也十分困難,。而系統(tǒng)B的所有域都是按十六進(jìn)制偶數(shù)數(shù)字對(duì)齊,因此通過寄存器讀可以很容易地確定每個(gè)域的狀態(tài),并且能方便地將某個(gè)域設(shè)為指定值,。
4. 域位置的分配與順序
寄存器內(nèi)域的設(shè)置也會(huì)嚴(yán)重影響軟件實(shí)現(xiàn)的效率,。布爾域和多位域通常與位置無關(guān),但當(dāng)列舉域和數(shù)字域被放置在寄存器的最低位(LSB)時(shí)對(duì)它們的訪問效率通常是最高的(LSB的實(shí)際位數(shù)取決于處理器類型,,位0不一定是LSB),。將域配置在寄存器的LSB中可以有效地消除對(duì)域內(nèi)容屏蔽后的移位操作,也使測(cè)試設(shè)備或進(jìn)行可視化檢查的調(diào)試儀訪問寄存器時(shí)能更容易地識(shí)別域值,。
系統(tǒng)A中用于軸2和軸3的域值在使用前必須要求軟件進(jìn)行屏蔽和移位,。而系統(tǒng)B則將所有數(shù)字域配置在寄存器的LSB中,從而能完成更有效的訪問,。系統(tǒng)B的集成性也更好,,資源寄存器的十六進(jìn)制數(shù)據(jù)能真正分離成正確的域值。
5. 未用數(shù)據(jù)位
寄存器中的未用位同樣也會(huì)影響軟件實(shí)現(xiàn)的效率,。所有未用位應(yīng)回歸為零,,并且寫入操作時(shí)無需對(duì)它們作特殊的處理,這樣可以避免不必要的屏蔽與清除操作,。這個(gè)規(guī)則的唯一一個(gè)例外是包含數(shù)字域?yàn)?的補(bǔ)碼的寄存器,,并且在寄存器中剩余的最高位(MSB)沒有用的情況。在這種情況下,,使硬件實(shí)現(xiàn)符號(hào)將域的MSB擴(kuò)展到未用位就非常有用,。以這種方式擴(kuò)展的數(shù)字域能夠被處理器直接訪問,因?yàn)閹Х?hào)的數(shù)值無需軟件符號(hào)的擴(kuò)展,。當(dāng)對(duì)特殊的數(shù)字域變量的訪問速度嚴(yán)重影響整體系統(tǒng)性能時(shí),,將該類型的域與“單個(gè)寄存器單個(gè)域”結(jié)合起來考慮將非常有用。由于無需屏蔽或符號(hào)擴(kuò)展,,這些域能以內(nèi)部數(shù)據(jù)訪問的方式直接訪問,。
當(dāng)系統(tǒng)A中需要從寄存器提取域值時(shí),要求軟件對(duì)每個(gè)數(shù)字域值進(jìn)行符號(hào)擴(kuò)展,,而系統(tǒng)B允許通過對(duì)寄存器的內(nèi)部整數(shù)訪問直接訪問域值。
6. 域類型選擇
域類型的正確選擇也能極大地提高軟件實(shí)現(xiàn)效率,。在打開或關(guān)閉獨(dú)立資源功能時(shí)布爾域是最有效的,。要注意的是,只有當(dāng)寄存器是可讀寫時(shí)單位域才容易編碼,。如果硬件寄存器對(duì)域的訪問有限制,,就需要專門的緩沖器(有可能再加上一個(gè)專門的驅(qū)動(dòng)程序)來保存當(dāng)前的內(nèi)容。限制性訪問同時(shí)也會(huì)限制一些編程構(gòu)造的使用,,如位域(bit field),,從而影響系統(tǒng)代碼的可讀性,且無助于減少編程錯(cuò)誤。
當(dāng)表達(dá)資源狀態(tài)的數(shù)據(jù)需要占用一定范圍的值時(shí)數(shù)字域就很有用,。當(dāng)一個(gè)域能保持正值和負(fù)值使用時(shí),,帶符號(hào)的表達(dá)式通常需要更多的軟件工作。另外,,還要避免在數(shù)字域中對(duì)其它數(shù)據(jù)進(jìn)行編碼(如利用域符號(hào)表示一個(gè)不相關(guān)的資源狀態(tài)),。
從硬件實(shí)現(xiàn)來看,多位域更有效,,但在寫入系統(tǒng)代碼時(shí)會(huì)增加代碼的復(fù)雜度,。列舉類型通常能更好地反映資源中相關(guān)功能的實(shí)際可用性,可以有效防止沖突功能的采用(如將存儲(chǔ)器塊切換到本地總線上),。列舉類型還應(yīng)提供這樣的可選項(xiàng):無條件允許切換之間存在“停放帶”,,無條件允許系統(tǒng)軟件中存在“先中斷再實(shí)現(xiàn)”的代碼切換。
系統(tǒng)A中對(duì)軸驅(qū)動(dòng)域的“只寫”訪問使軟件對(duì)目標(biāo)域的訪問效率很低,,必須用RAM保存寫過程中不作修改的過去的軸內(nèi)容,。系統(tǒng)B中由于每個(gè)寄存器都只有一個(gè)域并允許讀寫操作,因此不存在這樣的問題,。
實(shí)例系統(tǒng)的性能評(píng)估
為了評(píng)估最終系統(tǒng)軟件的性能,,將列表1中的偽隨機(jī)碼正確轉(zhuǎn)換成C代碼并同時(shí)用于A、B系統(tǒng)中,,然后利用內(nèi)部存儲(chǔ)器中的結(jié)構(gòu)模擬每個(gè)系統(tǒng)的硬件接口,。代碼中應(yīng)避免使用位域,因?yàn)闃?biāo)準(zhǔn)C實(shí)現(xiàn)不能在限制性訪問的地址空間上正確工作,。系統(tǒng)代碼模擬運(yùn)行于PowerPC,,編譯工具采用的是Green Hills MultiC,目標(biāo)操作系統(tǒng)是VxWorks,,編譯器設(shè)置在中級(jí)優(yōu)化度(目的是幫助調(diào)試,,并允許設(shè)計(jì)工程師把每條匯編指令與每一行C代碼聯(lián)系起來)。
表1列出了偽隨機(jī)碼的每一行,,并給出了每個(gè)系統(tǒng)實(shí)現(xiàn)所用到的匯編指令與功能調(diào)用數(shù)量,。另外還對(duì)兩個(gè)實(shí)現(xiàn)所用的代碼執(zhí)行速度進(jìn)行測(cè)試。子程序升級(jí)系統(tǒng)B軸的速度要比系統(tǒng)A快5.3倍,,這主要?dú)w功于任務(wù)阻塞與去阻塞功能調(diào)用的去除,。要注意的是實(shí)際系統(tǒng)中的加速效果可能并不明顯,因?yàn)閷?shí)際的硬件訪問時(shí)間對(duì)總的執(zhí)行時(shí)間影響最大,。
在實(shí)驗(yàn)中要提升兩個(gè)實(shí)現(xiàn)所用編譯器的優(yōu)化度,,結(jié)果發(fā)現(xiàn)優(yōu)化度的提高對(duì)系統(tǒng)B無效,對(duì)系統(tǒng)A來說只是減少了很少的代碼,,并且速度卻稍有降低,。這樣的結(jié)果表明,,系統(tǒng)B的硬件接口在軸域的資源訪問上非常接近內(nèi)部訪問的效能。
另外,,為了對(duì)兩種實(shí)現(xiàn)所用到的硬件設(shè)備進(jìn)行評(píng)估,,要用VHDL對(duì)硬件接口進(jìn)行編碼,然后用賽靈思的Webpack軟件進(jìn)行綜合,,并把設(shè)計(jì)映射到賽靈思的Virtex FPGA中,。采用Virtex系列芯片的結(jié)果是系統(tǒng)A要消耗56個(gè)功能片(slice),系統(tǒng)B要消耗85個(gè)功能片,。V300E-PQ240器件總共具有3072個(gè)片,,因此系統(tǒng)A占用可用資源的1.8%,系統(tǒng)B則占2.8%,。9500系列器件的內(nèi)部資源更有限些,,比如XC95288XL-PQ208,系統(tǒng)A將占用該器件可用資源的18%,,系統(tǒng)B則占30%,。
仔細(xì)考察這兩個(gè)設(shè)計(jì)發(fā)現(xiàn),系統(tǒng)B所用的額外資源中最主要的驅(qū)動(dòng)源是組合型軸尋址方案,。為了驗(yàn)證這一結(jié)果,,重新組織寄存器映射,以便將每個(gè)軸作為一個(gè)獨(dú)立資源使用,,單個(gè)軸映射按地址位邊界對(duì)齊,。這一變通的實(shí)現(xiàn)方式保留了系統(tǒng)B的所有軟件接口優(yōu)點(diǎn),同時(shí)減少了整體硬件器件的使用,,Virtex系列器件的片利用率能降低2.3%,,9500系列的利用率能降低22%。
硬件設(shè)計(jì)會(huì)極大地影響系統(tǒng)軟件實(shí)現(xiàn)的復(fù)雜性和質(zhì)量,。一個(gè)好的硬件設(shè)計(jì)要求設(shè)計(jì)人員能根據(jù)硬件實(shí)現(xiàn)與最終軟件設(shè)計(jì)環(huán)境的復(fù)雜性做出決定,,正確理解硬件接口設(shè)計(jì)對(duì)軟件開發(fā)流程的影響能極大地改進(jìn)系統(tǒng)質(zhì)量、性能和可靠性,,同時(shí)減少系統(tǒng)開發(fā)的周期與成本,。
作者: Christopher Leddy
高級(jí)系統(tǒng)工程師
Raytheon公司
Email:[email protected]
嵌入式系統(tǒng)設(shè)計(jì)中,,軟件和硬件的接口問題經(jīng)常困擾軟件開發(fā)工程師,。正確理解接口在處理器與高級(jí)語言開發(fā)環(huán)境方面的約束條件,可以加速整個(gè)系統(tǒng)設(shè)計(jì),,并為改進(jìn)系統(tǒng)的質(zhì)量、性能和可靠性以及縮短開發(fā)周期和減少成本提供保證,,本文從兩個(gè)設(shè)計(jì)實(shí)例的比較入手,,介紹了嵌入式系統(tǒng)的設(shè)計(jì)原則以及關(guān)于寄存器及其域的種種考慮。
嵌入式系統(tǒng)設(shè)計(jì)通常分為兩個(gè)部分:硬件設(shè)計(jì)和軟件開發(fā),。這兩部分任務(wù)通常由不同的設(shè)計(jì)小組負(fù)責(zé),,相互間很少有覆蓋的地方。由于軟件小組很少涉足前面的硬件設(shè)計(jì),,采用這種方式進(jìn)行開發(fā)經(jīng)常會(huì)遇到問題,,特別是硬件與軟件開發(fā)環(huán)境之間的接口性能較差時(shí),會(huì)導(dǎo)致系統(tǒng)開發(fā)時(shí)間延長(zhǎng),、開發(fā)成本提高,,最終推遲產(chǎn)品的上市。
最理想的解決方案是軟件小組參與硬件設(shè)計(jì),,但是在時(shí)間安排,、資金和人員方面往往又是不實(shí)際的。一種變通的方法是創(chuàng)建一套硬件接口規(guī)范來加速軟件開發(fā)流程,。從軟件開發(fā)者的角度來理解最優(yōu)化的硬件接口設(shè)計(jì)能有效地防止軟件開發(fā)中出現(xiàn)不必要的硬件問題,,這種方法對(duì)硬件設(shè)計(jì)流程造成的影響也很小。
嵌入式系統(tǒng)結(jié)構(gòu)的一般模型
從系統(tǒng)角度看,,嵌入式系統(tǒng)是多種系統(tǒng)要素之間的很多接口的集合,,這里羅列的主要資源是系統(tǒng)處理器。處理器接口可以分成兩大類,,分別標(biāo)識(shí)為本地總線和硬件總線,。值得注意的是,本文中的總線是根據(jù)處理器利用資源時(shí)的訪問類型單獨(dú)定義的,,與具體的硬件連接沒有對(duì)應(yīng)關(guān)系,。
本地總線是資源與處理器之間的接口總線,它允許無限制的連續(xù)訪問,。無限制訪問意味著處理器能夠利用其內(nèi)部數(shù)據(jù)類型(如字節(jié),、字和雙字)訪問一個(gè)資源的所有要素;連續(xù)訪問是指所有資源要素占用的資源地址空間是連續(xù)的,,中間沒有任何間隔,。RAM和EPROM就是與本地總線接口的常見范例。
硬件總線與資源的連接通常有某些限制,如大小,、位置,、尋址、地址空間或重定位等,。只接受字寫入的I/O端口,,或者使用前必須先作映射的PCI總線上的外圍芯片是硬件總線接口的一些實(shí)例。采用硬件總線連接對(duì)軟件設(shè)計(jì)工程師訪問資源有一定的限制,,可能在軟件設(shè)計(jì),、開發(fā)和集成過程中產(chǎn)生復(fù)雜代碼和代碼錯(cuò)誤。
正確的硬件總線接口設(shè)計(jì)能夠加快軟件設(shè)計(jì)進(jìn)程,,通常也能加快硬件驗(yàn)證速度,。本文重點(diǎn)介紹與可編程邏輯資源相連接的硬件總線的設(shè)計(jì)與實(shí)現(xiàn)。
系統(tǒng)定義的實(shí)例
這里考慮兩種不同的硬件實(shí)現(xiàn)方式,。該系統(tǒng)是處理器控制的三軸伺服系統(tǒng),,本部分的系統(tǒng)設(shè)計(jì)僅限于位置反饋控制的設(shè)計(jì),因此有助于我們專注于硬件接口的實(shí)現(xiàn),。
該系統(tǒng)的兩種實(shí)現(xiàn)方式都實(shí)現(xiàn)了處理器與用戶ASIC(或FPGA)的接口,,從而為三軸伺服提供驅(qū)動(dòng)與反饋信息。每個(gè)系統(tǒng)中的ASIC必須利用32位數(shù)據(jù)總線使處理器與三套驅(qū)動(dòng)/反饋資源連接,。每種資源包含有一個(gè)帶符號(hào)的10位驅(qū)動(dòng)寄存器,、一個(gè)帶符號(hào)的8位位置寄存器和一個(gè)3位的錯(cuò)誤狀態(tài)寄存器,任何一個(gè)位置位都表示一種錯(cuò)誤狀態(tài),,由它產(chǎn)生軸驅(qū)動(dòng)(axis drive)的關(guān)閉信息,。
圖1和圖2表示了一種寄存器接口的可能實(shí)現(xiàn)方式,,分別標(biāo)識(shí)為系統(tǒng)實(shí)現(xiàn)A和系統(tǒng)實(shí)現(xiàn)B,。為了描述方便,后文以系統(tǒng)A和系統(tǒng)B分別指代這兩種實(shí)現(xiàn),。
當(dāng)采用VHDL(或其它高級(jí)硬件設(shè)計(jì)方法)實(shí)現(xiàn)時(shí),這兩種硬件接口的設(shè)計(jì)復(fù)雜性幾乎是相等的,。系統(tǒng)A顯得稍微高效些,,因?yàn)槠浼拇嫫鞯刂纷g碼相對(duì)簡(jiǎn)單些,所采用的硬件數(shù)量也比系統(tǒng)B少,。為了減少與處理器接口的可編程器件中邏輯單元的數(shù)量,大多數(shù)硬件設(shè)計(jì)工程師會(huì)選擇系統(tǒng)A的實(shí)現(xiàn)方式,。
表1所示的偽隨機(jī)碼為軸驅(qū)動(dòng)程序,可用于A,、B兩個(gè)系統(tǒng),。偽隨機(jī)碼設(shè)計(jì)用于基于先進(jìn)處理器的系統(tǒng)實(shí)現(xiàn),并運(yùn)行于實(shí)時(shí)操作系統(tǒng),,以通用軸控制程序的三份獨(dú)立挎貝(或任務(wù)實(shí)例)實(shí)現(xiàn)軸的控制,。當(dāng)使用系統(tǒng)A中定義的接口時(shí)只需偽隨機(jī)碼中那些帶星號(hào)的代碼行。
很明顯,,即使在代碼原型階段系統(tǒng)B所需的代碼也比系統(tǒng)A少很多,。系統(tǒng)B中的硬件設(shè)計(jì)要稍微復(fù)雜一些,,但能減輕軟件開發(fā)的負(fù)擔(dān),。后文將回顧這兩個(gè)實(shí)例系統(tǒng)和偽隨機(jī)碼,。
在閱讀本文時(shí),,硬件設(shè)計(jì)工程師可能會(huì)產(chǎn)生這個(gè)問題:“為什么第一個(gè)設(shè)計(jì)的效率要比第二個(gè)低?”。兩種實(shí)現(xiàn)方式控制軸向操作的參數(shù)是相同的,,而第一種方法所需的可編程硬件器件數(shù)量顯然要比第二種少。為了正確回答這個(gè)問題,,設(shè)計(jì)工程師必須從系統(tǒng)的角度來看待這個(gè)設(shè)計(jì),,而不是硬件設(shè)計(jì)工程師慣用的“邏輯門”角度,。下一部分將闡述硬件設(shè)計(jì)工程師開發(fā)系統(tǒng)硬件接口時(shí)常會(huì)遇到的一些概念,,將進(jìn)一步討論這些技術(shù),,并檢查將這些概念應(yīng)用于實(shí)例系統(tǒng)設(shè)計(jì)后的結(jié)果。
為了滿足項(xiàng)目要求,,對(duì)整個(gè)系統(tǒng)結(jié)構(gòu)進(jìn)行優(yōu)化時(shí)需要在硬件與軟件實(shí)現(xiàn)之間作出折衷,現(xiàn)實(shí)中是沒有項(xiàng)目能滿足這里提到的所有理想軟件接口要求的。對(duì)理想狀態(tài)的認(rèn)識(shí)有助于硬件設(shè)計(jì)工程師識(shí)別并消除影響軟件設(shè)計(jì)的一些障礙,。
設(shè)計(jì)原則
1. 采用標(biāo)準(zhǔn)總線訪問
有效的嵌入式硬件接口設(shè)計(jì)的一般原則是:對(duì)軟件設(shè)計(jì)工程師來說,硬件設(shè)計(jì)應(yīng)確保對(duì)硬件資源的訪問盡可能透明,。處理器使用所有標(biāo)準(zhǔn)的讀寫指令可以實(shí)現(xiàn)透明訪問,而不用考慮前面的訪問內(nèi)容或時(shí)序,。
像頁寄存器設(shè)置,、地址線上的寫數(shù)據(jù)編碼等都可能嚴(yán)重影響代碼的開發(fā),并常常需要開發(fā)標(biāo)準(zhǔn)訪問與所需特殊訪問之間完成相互轉(zhuǎn)換的驅(qū)動(dòng)程序,。
通常不可避免要采用一些特殊總線,但需要慎重考慮特殊訪問空間的使用選擇,,因?yàn)檫@種情況會(huì)給系統(tǒng)軟件設(shè)計(jì)帶來一定的困難,。系統(tǒng)A采用了只寫寄存器,因此要求系統(tǒng)軟件提供“影子”內(nèi)存(Shadow memory)來保存寫入到資源的數(shù)據(jù),。而系統(tǒng)B由于允許所有的寄存器都可讀寫,,因此沒有這種限制,。
2. 開發(fā)基于處理器的資源接口
硬件設(shè)計(jì)工程師習(xí)慣于從下至上分析資源接口問題以及與系統(tǒng)總線的連接,而通過分析處理器在系統(tǒng)中對(duì)資源的訪問過程則更好。
“處理器與資源”間的接口常常是最重要的接口,,在硬件設(shè)計(jì)流程中它的效率應(yīng)是最優(yōu)先考慮的對(duì)象,。統(tǒng)一規(guī)劃整個(gè)系統(tǒng)的資源訪問對(duì)于正確理解由硬件設(shè)計(jì)選擇所引起的訪問限制很重要,。
現(xiàn)有最先進(jìn)的系統(tǒng)包含有存儲(chǔ)控制器和可再映射總線,,它們會(huì)改變處理器與資源接口之間的訪問類型,。一般地說,一個(gè)不合格的硬件接口設(shè)計(jì)在軟件小組試圖與實(shí)際資源連接前是不可能反映出來的,,這一點(diǎn)對(duì)于設(shè)計(jì)硬件接口很重要,。
3. 系統(tǒng)內(nèi)存映射的創(chuàng)建與維護(hù)
對(duì)于一個(gè)好的系統(tǒng)設(shè)計(jì)來說,,所有資源的存儲(chǔ)器映射都非常重要,。如前所述,,存儲(chǔ)器映射的設(shè)計(jì)應(yīng)考慮到具體處理器要求,,而不是簡(jiǎn)單地說明一個(gè)資源所解碼的地址線類型。如果采用的是寄存器可配置資源,,如PCI總線,,硬件設(shè)計(jì)工程師應(yīng)在存儲(chǔ)器映射中配置所有與該資源有關(guān)的配置寄存器,,并提供用以創(chuàng)建硬件驗(yàn)證所需的靜態(tài)映射的配置寄存器初始化值。
硬件設(shè)計(jì)工程師還必須認(rèn)真考慮動(dòng)態(tài)重配置的優(yōu)越性,。在可重配置總線上沒有新增(或減少)資源的系統(tǒng)能演變成一個(gè)靜態(tài)映射,方法是強(qiáng)迫配置寄存器在系統(tǒng)復(fù)位后回復(fù)到同一值,。這個(gè)“靜態(tài)”系統(tǒng)圖為硬件集成和軟件開發(fā)提供了一個(gè)穩(wěn)定的統(tǒng)一結(jié)構(gòu),,同時(shí)還避免了在系統(tǒng)代碼中使用易產(chǎn)生錯(cuò)誤的指針操作,。
最后,,隨著系統(tǒng)的不斷成熟,,存儲(chǔ)器映射也必須不斷完善,,并隨著軟硬件開發(fā)的進(jìn)展不斷改進(jìn),。
4. 統(tǒng)一的訪問模式
當(dāng)前的嵌入式系統(tǒng)由于復(fù)雜度的提高,,通常由多人共同合作進(jìn)行設(shè)計(jì),。每個(gè)硬件部件的設(shè)計(jì)必須與整體一致,,這樣才能開發(fā)出統(tǒng)一的資源訪問模式。如果不同功能模塊的訪問不一致的話,在軟件開發(fā)期間就會(huì)產(chǎn)生潛在的訪問限制錯(cuò)誤,,從而可能需要為每個(gè)子系統(tǒng)設(shè)計(jì)專門的軟件驅(qū)動(dòng)程序,。對(duì)不同邏輯塊的不一致訪問也會(huì)使硬件集成和驗(yàn)證變得困難重重。
例如設(shè)計(jì)工程師在調(diào)試器上編輯4個(gè)十六進(jìn)制數(shù)字并不能保證處理器會(huì)使用一個(gè)16位的讀/寫周期,,因此,,對(duì)軟件開發(fā)和硬件集成中使用調(diào)試工具設(shè)置多種類型的限制訪問也具有一定的困難。這樣看來,,評(píng)估仿真器處理多個(gè)限制性訪問地址空間的能力就非常有用,,特別是在用“限制外”訪問方式觸發(fā)總線故障的處理器結(jié)構(gòu)中。
寄存器設(shè)計(jì)
既然硬件設(shè)計(jì)工程師的重點(diǎn)已經(jīng)從邏輯門和總線轉(zhuǎn)移到了系統(tǒng)設(shè)計(jì),,我們?cè)賮韺徱曇幌氯魏翁幚砥飨到y(tǒng)中最常用到的寄存器設(shè)計(jì),。寄存器接口允許高速訪問資源,其訪問的效率對(duì)系統(tǒng)的性能有很大的影響,。
寄存器的結(jié)構(gòu)與訪問
設(shè)計(jì)工程師應(yīng)該精心選擇硬件寄存器大小,,使處理器能最有效地進(jìn)行硬件訪問。一般來說,,總是采用系統(tǒng)內(nèi)部整數(shù)訪問方式,。寄存器應(yīng)該被譯碼為連續(xù)的組(沒有地址空檔),,這樣可以加速指針或陣列索引對(duì)寄存器的訪問。任何可寫的寄存器也應(yīng)該是以同樣的格式可讀,,這樣可以避免使用本地存儲(chǔ)器來緩存這些寄存器值,。
控制一個(gè)子系統(tǒng)的寄存器應(yīng)該以相同的結(jié)構(gòu)形式在一起分組,,使軟件能使用通用的驅(qū)動(dòng)程序?qū)λ鼈冞M(jìn)行訪問,。當(dāng)設(shè)計(jì)中需要多個(gè)同一類型的子系統(tǒng)時(shí)這點(diǎn)尤其重要,。
為了避免被編碼成獨(dú)立進(jìn)程的軟件任務(wù)之間發(fā)生沖突,,獨(dú)立的子系統(tǒng)不能在系統(tǒng)處理器訪問期間共享可寫寄存器,。這些“獨(dú)立”的軟件進(jìn)程在訪問共享寄存器時(shí)會(huì)產(chǎn)生競(jìng)爭(zhēng),,除非在系統(tǒng)代碼中使用不可中斷的讀/寫驅(qū)動(dòng)程序。根據(jù)操作系統(tǒng)的不同,,多個(gè)進(jìn)程共享寄存器甚至可能會(huì)產(chǎn)生功能調(diào)用的額外開銷。訪問共享寄存器的同時(shí)還有執(zhí)行其它進(jìn)程的做法是錯(cuò)誤的,,也是軟件設(shè)計(jì)的通病,,會(huì)導(dǎo)致間歇性的系統(tǒng)故障,影響集成和測(cè)試系統(tǒng)軟件的進(jìn)度。
系統(tǒng)A違反了很多上文提到的原則,如采用只寫寄存器,共享控制和狀態(tài)寄存器,,以及沒有為每個(gè)軸提供公共的寄存器映射,。系統(tǒng)A必須用專門的驅(qū)動(dòng)程序來緩沖寫輸出數(shù)據(jù),,移位并屏蔽軸驅(qū)動(dòng)與位置信息,并防止軸驅(qū)動(dòng)寄存器內(nèi)容被為每個(gè)軸任務(wù)編寫的代碼所影響,。系統(tǒng)B由于分離并重組了與每個(gè)軸有關(guān)的寄存器,,因此能克服這些問題。
寄存器復(fù)位內(nèi)容
硬件設(shè)計(jì)工程師應(yīng)仔細(xì)考慮系統(tǒng)的復(fù)位狀態(tài)。硬件設(shè)計(jì)通常采用啟動(dòng)程序來取得系統(tǒng)啟動(dòng)后的控制權(quán),,并將系統(tǒng)初始化到一個(gè)安全的狀態(tài),。系統(tǒng)復(fù)位后應(yīng)將硬件置于一個(gè)確定的安全狀態(tài),并且硬件應(yīng)持續(xù)保持安全狀態(tài)直到系統(tǒng)軟件初始化完成為止,。代碼也應(yīng)在軟件控制下復(fù)位硬件以幫助調(diào)試,、自檢和原始代碼的開發(fā)。
系統(tǒng)A不控制驅(qū)動(dòng)寄存器的復(fù)位內(nèi)容,,需要代碼的介入來將所有三個(gè)軸的驅(qū)動(dòng)寄存器設(shè)置為零,。這種結(jié)構(gòu)會(huì)產(chǎn)生嚴(yán)重的系統(tǒng)設(shè)計(jì)問題,因?yàn)樘幚砥魍ǔJ潜3衷趶?fù)位狀態(tài),,直到FPGA和ASIC加電并得到配置后處理器才正常工作,。如果開發(fā)人員使用仿真器,那么在集成過程中系統(tǒng)A還會(huì)出現(xiàn)另外的問題:被仿真器控制的處理器在系統(tǒng)加電后可能需要很長(zhǎng)的初始化時(shí)間才能正常工作,。在軟件取得控制權(quán)之前系統(tǒng)A和B的軸都處于隨機(jī)驅(qū)動(dòng)狀態(tài),。
系統(tǒng)B在加電后會(huì)將所有軸驅(qū)動(dòng)寄存器設(shè)為零,它對(duì)軸驅(qū)動(dòng)設(shè)置的控制并不依賴于啟動(dòng)時(shí)間,。因?yàn)橄到y(tǒng)B沒有隱藏的狀態(tài)機(jī),,因此在本設(shè)計(jì)中沒有必要考慮增加額外的軟件復(fù)位寄存器。
寄存器域設(shè)計(jì)
大多數(shù)資源接口所包含的數(shù)據(jù)項(xiàng)并不正好適合一個(gè)寄存器,。這種情況下,,硬件設(shè)計(jì)工程師必須將一個(gè)寄存器分成若干域。合理的域結(jié)構(gòu)對(duì)系統(tǒng)性能來說非常重要,,與寄存器接口設(shè)計(jì)有相似的影響。有效的域接口設(shè)計(jì)規(guī)則類似于寄存器設(shè)計(jì)規(guī)則,,但設(shè)計(jì)工程師還需要特別注意域的順序與放置,,還要對(duì)寄存器中未用到一些字節(jié)作一定的處理。
1. 寄存器的域
域被定義為寄存器中若干位的子集,,主要用于報(bào)告或控制資源的一個(gè)功能要素,。在硬件設(shè)計(jì)中最常用的域類型有:1. 布爾域:真或假,通常是一位,;2. 多位狀態(tài)域和控制域:多位用于報(bào)告或控制內(nèi)部相關(guān)功能,;3. 列舉狀態(tài)域和控制域:多個(gè)位的集合,其中每個(gè)位代表了一種不同的硬件狀態(tài),;4. 數(shù)字域:多個(gè)位組合在一起用來代表一定的數(shù)量值,。
從軟件使用者角度看,最有效的域結(jié)構(gòu)是每個(gè)寄存器只用一個(gè)域,。這種理想的軟件結(jié)構(gòu)可能導(dǎo)致硬件實(shí)現(xiàn)效率低,,因此一個(gè)好的系統(tǒng)設(shè)計(jì)需要在軟硬件設(shè)計(jì)之間作出折衷,在每個(gè)寄存器中應(yīng)放置多個(gè)域。
下文將著重討論一個(gè)寄存器中假設(shè)存在多個(gè)域的情況,,不過,,當(dāng)對(duì)資源的某個(gè)特殊參數(shù)進(jìn)行的有效訪問將嚴(yán)重影響系統(tǒng)軟件性能時(shí),硬件設(shè)計(jì)工程師仍應(yīng)該考慮使用單個(gè)域的寄存器,。
2. 域結(jié)構(gòu)
前文提到的用于寄存器的結(jié)構(gòu)概念同樣也適合于寄存器內(nèi)部的域,。一個(gè)寄存器應(yīng)該只包含屬于設(shè)計(jì)中同一功能要素的域,并且該寄存器中的所有可寫域都應(yīng)該是可讀的,。
那些包含有屬于多個(gè)功能要素的域的寄存器同樣需要特殊驅(qū)動(dòng)程序支持,,這樣才能使多個(gè)進(jìn)程安全地訪問每個(gè)域。而配置為“只寫”功能的域需要分配影子內(nèi)存來保存寄存器域中的前一狀態(tài)值,。硬件設(shè)計(jì)工程師原來設(shè)想的簡(jiǎn)單的“屏蔽/寫”操作現(xiàn)在變成了繁雜的多步功能調(diào)用,,首先必須禁止中斷和任務(wù)切換,然后讀本地存儲(chǔ)器,,屏蔽輸入輸出值,,再進(jìn)行硬件寄存器寫,最后開放中斷和多任務(wù)切換,。如果寄存器中所有域能得到有效安排,,通過一個(gè)軟件任務(wù)就能訪問全部域的話,上述情況就能得到有效避免,。
由于系統(tǒng)A將屬于不相關(guān)功能的多個(gè)域組合放在一個(gè)寄存器中,,因此它需要使用特殊的驅(qū)動(dòng)程序。而系統(tǒng)B則遵循“單個(gè)寄存器內(nèi)的域按任務(wù)進(jìn)行組織”的原則,,將每個(gè)域放置在屬于自己的專用寄存器中,,因此能高效地訪問資源中的每個(gè)軸參數(shù)。
3. 十六進(jìn)制數(shù)字對(duì)齊
硬件設(shè)計(jì)工程師還應(yīng)該明白針對(duì)處理器和軟件開發(fā)環(huán)境進(jìn)行對(duì)齊約束,。如果將域放置在錯(cuò)誤的地址上而超出字的邊界,,將迫使軟件設(shè)計(jì)工程師只能按塊訪問每個(gè)域,進(jìn)而增加訪問復(fù)雜性,,降低訪問的速度,。在調(diào)試過程中,用零值填充域是非常有用的,,可以使每個(gè)域的最低位對(duì)齊十六進(jìn)制數(shù)字(4位)的邊界:當(dāng)在邏輯分析儀,、調(diào)試儀或仿真器上顯示寄存器情況時(shí),十六進(jìn)制數(shù)字對(duì)齊會(huì)有助于域值的可視化提取,。系統(tǒng)A的寄存器域是沒有對(duì)齊的,,因此從原始的十六進(jìn)制數(shù)據(jù)中提取域值很困難。由于控制域沒有對(duì)齊,,在查錯(cuò)時(shí)屏蔽測(cè)試輸入也十分困難,。而系統(tǒng)B的所有域都是按十六進(jìn)制偶數(shù)數(shù)字對(duì)齊,因此通過寄存器讀可以很容易地確定每個(gè)域的狀態(tài),并且能方便地將某個(gè)域設(shè)為指定值,。
4. 域位置的分配與順序
寄存器內(nèi)域的設(shè)置也會(huì)嚴(yán)重影響軟件實(shí)現(xiàn)的效率,。布爾域和多位域通常與位置無關(guān),但當(dāng)列舉域和數(shù)字域被放置在寄存器的最低位(LSB)時(shí)對(duì)它們的訪問效率通常是最高的(LSB的實(shí)際位數(shù)取決于處理器類型,,位0不一定是LSB),。將域配置在寄存器的LSB中可以有效地消除對(duì)域內(nèi)容屏蔽后的移位操作,也使測(cè)試設(shè)備或進(jìn)行可視化檢查的調(diào)試儀訪問寄存器時(shí)能更容易地識(shí)別域值,。
系統(tǒng)A中用于軸2和軸3的域值在使用前必須要求軟件進(jìn)行屏蔽和移位,。而系統(tǒng)B則將所有數(shù)字域配置在寄存器的LSB中,從而能完成更有效的訪問,。系統(tǒng)B的集成性也更好,,資源寄存器的十六進(jìn)制數(shù)據(jù)能真正分離成正確的域值。
5. 未用數(shù)據(jù)位
寄存器中的未用位同樣也會(huì)影響軟件實(shí)現(xiàn)的效率,。所有未用位應(yīng)回歸為零,,并且寫入操作時(shí)無需對(duì)它們作特殊的處理,這樣可以避免不必要的屏蔽與清除操作,。這個(gè)規(guī)則的唯一一個(gè)例外是包含數(shù)字域?yàn)?的補(bǔ)碼的寄存器,,并且在寄存器中剩余的最高位(MSB)沒有用的情況。在這種情況下,,使硬件實(shí)現(xiàn)符號(hào)將域的MSB擴(kuò)展到未用位就非常有用,。以這種方式擴(kuò)展的數(shù)字域能夠被處理器直接訪問,因?yàn)閹Х?hào)的數(shù)值無需軟件符號(hào)的擴(kuò)展,。當(dāng)對(duì)特殊的數(shù)字域變量的訪問速度嚴(yán)重影響整體系統(tǒng)性能時(shí),,將該類型的域與“單個(gè)寄存器單個(gè)域”結(jié)合起來考慮將非常有用。由于無需屏蔽或符號(hào)擴(kuò)展,,這些域能以內(nèi)部數(shù)據(jù)訪問的方式直接訪問,。
當(dāng)系統(tǒng)A中需要從寄存器提取域值時(shí),要求軟件對(duì)每個(gè)數(shù)字域值進(jìn)行符號(hào)擴(kuò)展,,而系統(tǒng)B允許通過對(duì)寄存器的內(nèi)部整數(shù)訪問直接訪問域值。
6. 域類型選擇
域類型的正確選擇也能極大地提高軟件實(shí)現(xiàn)效率,。在打開或關(guān)閉獨(dú)立資源功能時(shí)布爾域是最有效的,。要注意的是,只有當(dāng)寄存器是可讀寫時(shí)單位域才容易編碼,。如果硬件寄存器對(duì)域的訪問有限制,,就需要專門的緩沖器(有可能再加上一個(gè)專門的驅(qū)動(dòng)程序)來保存當(dāng)前的內(nèi)容。限制性訪問同時(shí)也會(huì)限制一些編程構(gòu)造的使用,,如位域(bit field),,從而影響系統(tǒng)代碼的可讀性,且無助于減少編程錯(cuò)誤。
當(dāng)表達(dá)資源狀態(tài)的數(shù)據(jù)需要占用一定范圍的值時(shí)數(shù)字域就很有用,。當(dāng)一個(gè)域能保持正值和負(fù)值使用時(shí),,帶符號(hào)的表達(dá)式通常需要更多的軟件工作。另外,,還要避免在數(shù)字域中對(duì)其它數(shù)據(jù)進(jìn)行編碼(如利用域符號(hào)表示一個(gè)不相關(guān)的資源狀態(tài)),。
從硬件實(shí)現(xiàn)來看,多位域更有效,,但在寫入系統(tǒng)代碼時(shí)會(huì)增加代碼的復(fù)雜度,。列舉類型通常能更好地反映資源中相關(guān)功能的實(shí)際可用性,可以有效防止沖突功能的采用(如將存儲(chǔ)器塊切換到本地總線上),。列舉類型還應(yīng)提供這樣的可選項(xiàng):無條件允許切換之間存在“停放帶”,,無條件允許系統(tǒng)軟件中存在“先中斷再實(shí)現(xiàn)”的代碼切換。
系統(tǒng)A中對(duì)軸驅(qū)動(dòng)域的“只寫”訪問使軟件對(duì)目標(biāo)域的訪問效率很低,,必須用RAM保存寫過程中不作修改的過去的軸內(nèi)容,。系統(tǒng)B中由于每個(gè)寄存器都只有一個(gè)域并允許讀寫操作,因此不存在這樣的問題,。
實(shí)例系統(tǒng)的性能評(píng)估
為了評(píng)估最終系統(tǒng)軟件的性能,,將列表1中的偽隨機(jī)碼正確轉(zhuǎn)換成C代碼并同時(shí)用于A、B系統(tǒng)中,,然后利用內(nèi)部存儲(chǔ)器中的結(jié)構(gòu)模擬每個(gè)系統(tǒng)的硬件接口,。代碼中應(yīng)避免使用位域,因?yàn)闃?biāo)準(zhǔn)C實(shí)現(xiàn)不能在限制性訪問的地址空間上正確工作,。系統(tǒng)代碼模擬運(yùn)行于PowerPC,,編譯工具采用的是Green Hills MultiC,目標(biāo)操作系統(tǒng)是VxWorks,,編譯器設(shè)置在中級(jí)優(yōu)化度(目的是幫助調(diào)試,,并允許設(shè)計(jì)工程師把每條匯編指令與每一行C代碼聯(lián)系起來)。
表1列出了偽隨機(jī)碼的每一行,,并給出了每個(gè)系統(tǒng)實(shí)現(xiàn)所用到的匯編指令與功能調(diào)用數(shù)量,。另外還對(duì)兩個(gè)實(shí)現(xiàn)所用的代碼執(zhí)行速度進(jìn)行測(cè)試。子程序升級(jí)系統(tǒng)B軸的速度要比系統(tǒng)A快5.3倍,,這主要?dú)w功于任務(wù)阻塞與去阻塞功能調(diào)用的去除,。要注意的是實(shí)際系統(tǒng)中的加速效果可能并不明顯,因?yàn)閷?shí)際的硬件訪問時(shí)間對(duì)總的執(zhí)行時(shí)間影響最大,。
在實(shí)驗(yàn)中要提升兩個(gè)實(shí)現(xiàn)所用編譯器的優(yōu)化度,,結(jié)果發(fā)現(xiàn)優(yōu)化度的提高對(duì)系統(tǒng)B無效,對(duì)系統(tǒng)A來說只是減少了很少的代碼,,并且速度卻稍有降低,。這樣的結(jié)果表明,,系統(tǒng)B的硬件接口在軸域的資源訪問上非常接近內(nèi)部訪問的效能。
另外,,為了對(duì)兩種實(shí)現(xiàn)所用到的硬件設(shè)備進(jìn)行評(píng)估,,要用VHDL對(duì)硬件接口進(jìn)行編碼,然后用賽靈思的Webpack軟件進(jìn)行綜合,,并把設(shè)計(jì)映射到賽靈思的Virtex FPGA中,。采用Virtex系列芯片的結(jié)果是系統(tǒng)A要消耗56個(gè)功能片(slice),系統(tǒng)B要消耗85個(gè)功能片,。V300E-PQ240器件總共具有3072個(gè)片,,因此系統(tǒng)A占用可用資源的1.8%,系統(tǒng)B則占2.8%,。9500系列器件的內(nèi)部資源更有限些,,比如XC95288XL-PQ208,系統(tǒng)A將占用該器件可用資源的18%,,系統(tǒng)B則占30%,。
仔細(xì)考察這兩個(gè)設(shè)計(jì)發(fā)現(xiàn),系統(tǒng)B所用的額外資源中最主要的驅(qū)動(dòng)源是組合型軸尋址方案,。為了驗(yàn)證這一結(jié)果,,重新組織寄存器映射,以便將每個(gè)軸作為一個(gè)獨(dú)立資源使用,,單個(gè)軸映射按地址位邊界對(duì)齊,。這一變通的實(shí)現(xiàn)方式保留了系統(tǒng)B的所有軟件接口優(yōu)點(diǎn),同時(shí)減少了整體硬件器件的使用,,Virtex系列器件的片利用率能降低2.3%,,9500系列的利用率能降低22%。
硬件設(shè)計(jì)會(huì)極大地影響系統(tǒng)軟件實(shí)現(xiàn)的復(fù)雜性和質(zhì)量,。一個(gè)好的硬件設(shè)計(jì)要求設(shè)計(jì)人員能根據(jù)硬件實(shí)現(xiàn)與最終軟件設(shè)計(jì)環(huán)境的復(fù)雜性做出決定,,正確理解硬件接口設(shè)計(jì)對(duì)軟件開發(fā)流程的影響能極大地改進(jìn)系統(tǒng)質(zhì)量、性能和可靠性,,同時(shí)減少系統(tǒng)開發(fā)的周期與成本,。
作者: Christopher Leddy
高級(jí)系統(tǒng)工程師
Raytheon公司
Email:[email protected]
本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn),。轉(zhuǎn)載的所有的文章、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。