新聞中心

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

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

        作者: 時間:2013-10-23 來源:網絡 收藏

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

        2. 開發基于處理器的資源接口

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

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

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

        3. 系統內存映射的創建與維護

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

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

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

        4. 統一的訪問模式

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

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

        寄存器設計

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

        寄存器的結構與訪問

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

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

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

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

        寄存器復位內容

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

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

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

        寄存器域設計

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

        1. 寄存器的域

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

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

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

        2. 域結構

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



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 定陶县| 湛江市| 深州市| 同江市| 望奎县| 大厂| 鸡西市| 沿河| 游戏| 萝北县| 苏尼特左旗| 界首市| 高安市| 丰城市| 徐州市| 洮南市| 弋阳县| 云安县| 江永县| 鞍山市| 普洱| 大英县| 滨州市| 临西县| 富蕴县| 象山县| 子长县| 临海市| 磐石市| 昌吉市| 丰顺县| 曲沃县| 安丘市| 那曲县| 津南区| 林口县| 沈丘县| 柳江县| 昆明市| 武山县| 景东|