解決軟件和硬件接口問(wèn)題的嵌入式系統(tǒng)設(shè)計(jì)實(shí)例
通常不可避免要采用一些特殊總線,但需要慎重考慮特殊訪問(wèn)空間的使用選擇,因?yàn)檫@種情況會(huì)給系統(tǒng)軟件設(shè)計(jì)帶來(lái)一定的困難。系統(tǒng)A采用了只寫寄存器,因此要求系統(tǒng)軟件提供“影子”內(nèi)存(Shadow memory)來(lái)保存寫入到資源的數(shù)據(jù)。而系統(tǒng)B由于允許所有的寄存器都可讀寫,因此沒(méi)有這種限制。
2. 開發(fā)基于處理器的資源接口
硬件設(shè)計(jì)工程師習(xí)慣于從下至上分析資源接口問(wèn)題以及與系統(tǒng)總線的連接,而通過(guò)分析處理器在系統(tǒng)中對(duì)資源的訪問(wèn)過(guò)程則更好。
“處理器與資源”間的接口常常是最重要的接口,在硬件設(shè)計(jì)流程中它的效率應(yīng)是最優(yōu)先考慮的對(duì)象。統(tǒng)一規(guī)劃整個(gè)系統(tǒng)的資源訪問(wèn)對(duì)于正確理解由硬件設(shè)計(jì)選擇所引起的訪問(wèn)限制很重要。
現(xiàn)有最先進(jìn)的系統(tǒng)包含有存儲(chǔ)控制器和可再映射總線,它們會(huì)改變處理器與資源接口之間的訪問(wèn)類型。一般地說(shuō),一個(gè)不合格的硬件接口設(shè)計(jì)在軟件小組試圖與實(shí)際資源連接前是不可能反映出來(lái)的,這一點(diǎn)對(duì)于設(shè)計(jì)硬件接口很重要。
3. 系統(tǒng)內(nèi)存映射的創(chuàng)建與維護(hù)
對(duì)于一個(gè)好的系統(tǒng)設(shè)計(jì)來(lái)說(shuō),所有資源的存儲(chǔ)器映射都非常重要。如前所述,存儲(chǔ)器映射的設(shè)計(jì)應(yīng)考慮到具體處理器要求,而不是簡(jiǎn)單地說(shuō)明一個(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)越性。在可重配置總線上沒(méi)有新增(或減少)資源的系統(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)一的訪問(wèn)模式
當(dāng)前的嵌入式系統(tǒng)由于復(fù)雜度的提高,通常由多人共同合作進(jìn)行設(shè)計(jì)。每個(gè)硬件部件的設(shè)計(jì)必須與整體一致,這樣才能開發(fā)出統(tǒng)一的資源訪問(wèn)模式。如果不同功能模塊的訪問(wèn)不一致的話,在軟件開發(fā)期間就會(huì)產(chǎn)生潛在的訪問(wèn)限制錯(cuò)誤,從而可能需要為每個(gè)子系統(tǒng)設(shè)計(jì)專門的軟件驅(qū)動(dòng)程序。對(duì)不同邏輯塊的不一致訪問(wèn)也會(huì)使硬件集成和驗(yàn)證變得困難重重。
例如設(shè)計(jì)工程師在調(diào)試器上編輯4個(gè)十六進(jìn)制數(shù)字并不能保證處理器會(huì)使用一個(gè)16位的讀/寫周期,因此,對(duì)軟件開發(fā)和硬件集成中使用調(diào)試工具設(shè)置多種類型的限制訪問(wèn)也具有一定的困難。這樣看來(lái),評(píng)估仿真器處理多個(gè)限制性訪問(wèn)地址空間的能力就非常有用,特別是在用“限制外”訪問(wèn)方式觸發(fā)總線故障的處理器結(jié)構(gòu)中。
寄存器設(shè)計(jì)
既然硬件設(shè)計(jì)工程師的重點(diǎn)已經(jīng)從邏輯門和總線轉(zhuǎn)移到了系統(tǒng)設(shè)計(jì),我們?cè)賮?lái)審視一下任何處理器系統(tǒng)中最常用到的寄存器設(shè)計(jì)。寄存器接口允許高速訪問(wèn)資源,其訪問(wèn)的效率對(duì)系統(tǒng)的性能有很大的影響。
寄存器的結(jié)構(gòu)與訪問(wèn)
設(shè)計(jì)工程師應(yīng)該精心選擇硬件寄存器大小,使處理器能最有效地進(jìn)行硬件訪問(wèn)。一般來(lái)說(shuō),總是采用系統(tǒng)內(nèi)部整數(shù)訪問(wèn)方式。寄存器應(yīng)該被譯碼為連續(xù)的組(沒(méi)有地址空檔),這樣可以加速指針或陣列索引對(duì)寄存器的訪問(wèn)。任何可寫的寄存器也應(yīng)該是以同樣的格式可讀,這樣可以避免使用本地存儲(chǔ)器來(lái)緩存這些寄存器值。
控制一個(gè)子系統(tǒng)的寄存器應(yīng)該以相同的結(jié)構(gòu)形式在一起分組,使軟件能使用通用的驅(qū)動(dòng)程序?qū)λ鼈冞M(jìn)行訪問(wèn)。當(dāng)設(shè)計(jì)中需要多個(gè)同一類型的子系統(tǒng)時(shí)這點(diǎn)尤其重要。
為了避免被編碼成獨(dú)立進(jìn)程的軟件任務(wù)之間發(fā)生沖突,獨(dú)立的子系統(tǒng)不能在系統(tǒng)處理器訪問(wèn)期間共享可寫寄存器。這些“獨(dú)立”的軟件進(jìn)程在訪問(wè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)用的額外開銷。訪問(wèn)共享寄存器的同時(shí)還有執(zhí)行其它進(jìn)程的做法是錯(cuò)誤的,也是軟件設(shè)計(jì)的通病,會(huì)導(dǎo)致間歇性的系統(tǒng)故障,影響集成和測(cè)試系統(tǒng)軟件的進(jìn)度。
系統(tǒng)A違反了很多上文提到的原則,如采用只寫寄存器,共享控制和狀態(tài)寄存器,以及沒(méi)有為每個(gè)軸提供公共的寄存器映射。系統(tǒng)A必須用專門的驅(qū)動(dòng)程序來(lái)緩沖寫輸出數(shù)據(jù),移位并屏蔽軸驅(qū)動(dòng)與位置信息,并防止軸驅(qū)動(dòng)寄存器內(nèi)容被為每個(gè)軸任務(wù)編寫的代碼所影響。系統(tǒng)B由于分離并重組了與每個(gè)軸有關(guān)的寄存器,因此能克服這些問(wèn)題。
寄存器復(fù)位內(nèi)容
硬件設(shè)計(jì)工程師應(yīng)仔細(xì)考慮系統(tǒng)的復(fù)位狀態(tài)。硬件設(shè)計(jì)通常采用啟動(dòng)程序來(lái)取得系統(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)容,需要代碼的介入來(lái)將所有三個(gè)軸的驅(qū)動(dòng)寄存器設(shè)置為零。這種結(jié)構(gòu)會(huì)產(chǎn)生嚴(yán)重的系統(tǒng)設(shè)計(jì)問(wèn)題,因?yàn)樘幚砥魍ǔJ潜3衷趶?fù)位狀態(tài),直到FPGA和ASIC加電并得到配置后處理器才正常工作。如果開發(fā)人員使用仿真器,那么在集成過(guò)程中系統(tǒng)A還會(huì)出現(xiàn)另外的問(wè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沒(méi)有隱藏的狀態(tài)機(jī),因此在本設(shè)計(jì)中沒(méi)有必要考慮增加額外的軟件復(fù)位寄存器。
寄存器域設(shè)計(jì)
大多數(shù)資源接口所包含的數(shù)據(jù)項(xiàng)并不正好適合一個(gè)寄存器。這種情況下,硬件設(shè)計(jì)工程師必須將一個(gè)寄存器分成若干域。合理的域結(jié)構(gòu)對(duì)系統(tǒng)性能來(lái)說(shuō)非常重要,與寄存器接口設(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è)位組合在一起用來(lái)代表一定的數(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è)域的情況,不過(guò),當(dāng)對(duì)資源的某個(gè)特殊參數(shù)進(jìn)行的有效訪問(wè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)該是可讀的。
評(píng)論