新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 解決軟件和硬件接口問題的嵌入式系統(tǒng)設計實例

解決軟件和硬件接口問題的嵌入式系統(tǒng)設計實例

作者: 時間:2013-10-23 來源:網(wǎng)絡 收藏

通常不可避免要采用一些特殊總線,但需要慎重考慮特殊訪問空間的使用選擇,因為這種情況會給系統(tǒng)軟件設計帶來一定的困難。系統(tǒng)A采用了只寫寄存器,因此要求系統(tǒng)軟件提供“影子”內存(Shadow memory)來保存寫入到資源的數(shù)據(jù)。而系統(tǒng)B由于允許所有的寄存器都可讀寫,因此沒有這種限制。

2. 開發(fā)基于處理器的資源接口

硬件設計工程師習慣于從下至上分析資源接口問題以及與系統(tǒng)總線的連接,而通過分析處理器在系統(tǒng)中對資源的訪問過程則更好。

“處理器與資源”間的接口常常是最重要的接口,在硬件設計流程中它的效率應是最優(yōu)先考慮的對象。統(tǒng)一規(guī)劃整個系統(tǒng)的資源訪問對于正確理解由硬件設計選擇所引起的訪問限制很重要。

現(xiàn)有最先進的系統(tǒng)包含有存儲控制器和可再映射總線,它們會改變處理器與資源接口之間的訪問類型。一般地說,一個不合格的硬件接口設計在軟件小組試圖與實際資源連接前是不可能反映出來的,這一點對于設計硬件接口很重要。

3. 系統(tǒng)內存映射的創(chuàng)建與維護

對于一個好的系統(tǒng)設計來說,所有資源的存儲器映射都非常重要。如前所述,存儲器映射的設計應考慮到具體處理器要求,而不是簡單地說明一個資源所解碼的地址線類型。如果采用的是寄存器可配置資源,如PCI總線,硬件設計工程師應在存儲器映射中配置所有與該資源有關的配置寄存器,并提供用以創(chuàng)建硬件驗證所需的靜態(tài)映射的配置寄存器初始化值。

硬件設計工程師還必須認真考慮動態(tài)重配置的優(yōu)越性。在可重配置總線上沒有新增(或減少)資源的系統(tǒng)能演變成一個靜態(tài)映射,方法是強迫配置寄存器在系統(tǒng)復位后回復到同一值。這個“靜態(tài)”系統(tǒng)圖為硬件集成和軟件開發(fā)提供了一個穩(wěn)定的統(tǒng)一結構,同時還避免了在系統(tǒng)代碼中使用易產生錯誤的指針操作。

最后,隨著系統(tǒng)的不斷成熟,存儲器映射也必須不斷完善,并隨著軟硬件開發(fā)的進展不斷改進。

4. 統(tǒng)一的訪問模式

當前的由于復雜度的提高,通常由多人共同合作進行設計。每個硬件部件的設計必須與整體一致,這樣才能開發(fā)出統(tǒng)一的資源訪問模式。如果不同功能模塊的訪問不一致的話,在軟件開發(fā)期間就會產生潛在的訪問限制錯誤,從而可能需要為每個子系統(tǒng)設計專門的軟件驅動程序。對不同邏輯塊的不一致訪問也會使硬件集成和驗證變得困難重重。

例如設計工程師在調試器上編輯4個十六進制數(shù)字并不能保證處理器會使用一個16位的讀/寫周期,因此,對軟件開發(fā)和硬件集成中使用調試工具設置多種類型的限制訪問也具有一定的困難。這樣看來,評估仿真器處理多個限制性訪問地址空間的能力就非常有用,特別是在用“限制外”訪問方式觸發(fā)總線故障的處理器結構中。

寄存器設計

既然硬件設計工程師的重點已經從邏輯門和總線轉移到了系統(tǒng)設計,我們再來審視一下任何處理器系統(tǒng)中最常用到的寄存器設計。寄存器接口允許高速訪問資源,其訪問的效率對系統(tǒng)的性能有很大的影響。

寄存器的結構與訪問

設計工程師應該精心選擇硬件寄存器大小,使處理器能最有效地進行硬件訪問。一般來說,總是采用系統(tǒng)內部整數(shù)訪問方式。寄存器應該被譯碼為連續(xù)的組(沒有地址空檔),這樣可以加速指針或陣列索引對寄存器的訪問。任何可寫的寄存器也應該是以同樣的格式可讀,這樣可以避免使用本地存儲器來緩存這些寄存器值。

控制一個子系統(tǒng)的寄存器應該以相同的結構形式在一起分組,使軟件能使用通用的驅動程序對它們進行訪問。當設計中需要多個同一類型的子系統(tǒng)時這點尤其重要。

為了避免被編碼成獨立進程的軟件任務之間發(fā)生沖突,獨立的子系統(tǒng)不能在系統(tǒng)處理器訪問期間共享可寫寄存器。這些“獨立”的軟件進程在訪問共享寄存器時會產生競爭,除非在系統(tǒng)代碼中使用不可中斷的讀/寫驅動程序。根據(jù)操作系統(tǒng)的不同,多個進程共享寄存器甚至可能會產生功能調用的額外開銷。訪問共享寄存器的同時還有執(zhí)行其它進程的做法是錯誤的,也是軟件設計的通病,會導致間歇性的系統(tǒng)故障,影響集成和測試系統(tǒng)軟件的進度。

系統(tǒng)A違反了很多上文提到的原則,如采用只寫寄存器,共享控制和狀態(tài)寄存器,以及沒有為每個軸提供公共的寄存器映射。系統(tǒng)A必須用專門的驅動程序來緩沖寫輸出數(shù)據(jù),移位并屏蔽軸驅動與位置信息,并防止軸驅動寄存器內容被為每個軸任務編寫的代碼所影響。系統(tǒng)B由于分離并重組了與每個軸有關的寄存器,因此能克服這些問題。

寄存器復位內容

硬件設計工程師應仔細考慮系統(tǒng)的復位狀態(tài)。硬件設計通常采用啟動程序來取得系統(tǒng)啟動后的控制權,并將系統(tǒng)初始化到一個安全的狀態(tài)。系統(tǒng)復位后應將硬件置于一個確定的安全狀態(tài),并且硬件應持續(xù)保持安全狀態(tài)直到系統(tǒng)軟件初始化完成為止。代碼也應在軟件控制下復位硬件以幫助調試、自檢和原始代碼的開發(fā)。

系統(tǒng)A不控制驅動寄存器的復位內容,需要代碼的介入來將所有三個軸的驅動寄存器設置為零。這種結構會產生嚴重的系統(tǒng)設計問題,因為處理器通常是保持在復位狀態(tài),直到FPGA和ASIC加電并得到配置后處理器才正常工作。如果開發(fā)人員使用仿真器,那么在集成過程中系統(tǒng)A還會出現(xiàn)另外的問題:被仿真器控制的處理器在系統(tǒng)加電后可能需要很長的初始化時間才能正常工作。在軟件取得控制權之前系統(tǒng)A和B的軸都處于隨機驅動狀態(tài)。

系統(tǒng)B在加電后會將所有軸驅動寄存器設為零,它對軸驅動設置的控制并不依賴于啟動時間。因為系統(tǒng)B沒有隱藏的狀態(tài)機,因此在本設計中沒有必要考慮增加額外的軟件復位寄存器。

寄存器域設計

大多數(shù)資源接口所包含的數(shù)據(jù)項并不正好適合一個寄存器。這種情況下,硬件設計工程師必須將一個寄存器分成若干域。合理的域結構對系統(tǒng)性能來說非常重要,與寄存器接口設計有相似的影響。有效的域接口設計規(guī)則類似于寄存器設計規(guī)則,但設計工程師還需要特別注意域的順序與放置,還要對寄存器中未用到一些字節(jié)作一定的處理。

1. 寄存器的域

域被定義為寄存器中若干位的子集,主要用于報告或控制資源的一個功能要素。在硬件設計中最常用的域類型有:1. 布爾域:真或假,通常是一位;2. 多位狀態(tài)域和控制域:多位用于報告或控制內部相關功能;3. 列舉狀態(tài)域和控制域:多個位的集合,其中每個位代表了一種不同的硬件狀態(tài);4. 數(shù)字域:多個位組合在一起用來代表一定的數(shù)量值。

從軟件使用者角度看,最有效的域結構是每個寄存器只用一個域。這種理想的軟件結構可能導致硬件實現(xiàn)效率低,因此一個好的系統(tǒng)設計需要在軟硬件設計之間作出折衷,在每個寄存器中應放置多個域。

下文將著重討論一個寄存器中假設存在多個域的情況,不過,當對資源的某個特殊參數(shù)進行的有效訪問將嚴重影響系統(tǒng)軟件性能時,硬件設計工程師仍應該考慮使用單個域的寄存器。

2. 域結構

前文提到的用于寄存器的結構概念同樣也適合于寄存器內部的域。一個寄存器應該只包含屬于設計中同一功能要素的域,并且該寄存器中的所有可寫域都應該是可讀的。



評論


相關推薦

技術專區(qū)

關閉