新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ARM的嵌入式系統程序開發要點

        基于ARM的嵌入式系統程序開發要點

        作者: 時間:2016-12-02 來源:網絡 收藏


        2.堆棧的分配

        在圖-3 中,橫坐標上還有一種情況,就是 16 位的存儲器寬度,但是堆棧空間是 32 位的。這種情況下無論 ARM 還是 Thumb,其性能表現都比單純的 16 位存儲器系統情況下要好。這是因為 ARM 和 Thumb 其指令集雖然分 32 位和 16位,但是堆棧全部是采用32 位的。因此在 16 位堆棧和 32 位堆棧的不同環境下,其性能當然都會相差很多。這種差別還跟具體的應用程序密切相關,如果一個程
        序堆棧的使用頻率相當高,則這種性能差異很大;反之則要小一些。

        在基于 ARM 的系統中,堆棧不僅僅被用來進行諸如函數調用、中斷響應等時候的現場保護,還是程序局部變量和函數參數傳遞(如果大于4個)的存儲空間。所以出于系統整體性能考慮,要給堆棧分配相對訪問速度最快、數據寬度最大的存儲器空間。

        一個嵌入式系統通常存在多種多樣的存儲器類型。設計的時候一定要先清楚每一種存儲器的訪問速度,地址分配和數據線寬度。然后根據不同程序和目標模塊對存儲器的不同要求進行合理分配,以期達到最佳配置狀態。

        3.ROM 還是 RAM 在 0 地址處?

        顯然當系統剛啟動的時候,0 地址處肯定是某種類型的 ROM,里面存儲了系統的啟動代碼。 但是很多靈活的系統設計中, 0 地址處的存儲器類型是可映射的。也就是說,可以通過軟件的方法,把別的存儲器(主要是快速的 RAM)分配以0 起始的地址。

        這種做法的最主要目的之一是提高系統對中斷的反應速度。因為每一個中斷發生的時候,ARM 都需要從 0 地址處的中斷向量表開始其中斷響應流程,顯然把中斷向量表放在 RAM 里,比放在 ROM 里有更快的訪問速度。因此,如果系統提供了這一類的地址重映射功能,軟件設計者一定要加以利用。

        下面是一個典型的經過 0 地址重映射之后的存儲空間分布圖,注意盡可能把速度要求最高的部分放置在系統里面訪問速度最快、帶寬最寬的 RAM 里面。


        圖-4 系統存儲器分布的實例

        4.存儲器地址重映射(memory remap)

        存儲器地址重映射是當前很多先進控制器所具有的功能。在上一節中已經提到了 0 地址處存儲器重映射的例子,簡而言之,地址重映射就是可以通過軟件配置來改變一塊存儲器物理地址的一種機制或方法。

        當一段程序對運行自己的存儲器進行重映射的時候,需要特別注意保證程序執行流程在重映射前后的承接關系。下面是一種典型的存儲器地址重映射情況:


        圖-5 存儲器重映射舉例 1

        系統上電后的缺省狀態是 0地址上放有 ROM,這塊 ROM 有兩個地址:從0起始和從0x10000 起始,里面存儲了初始化代碼。當進行地址 remap以后,從 0起始的地址被定向到了 RAM 上,ROM 則只保留有唯一的從 0x10000 起始的地址了。

        如果存儲在 ROM 里的 Reset_Handler 一直在0 – 0x4000的地址上運行,則當執行完remap以后,下面的指令將從RAM 里預取,必然會導致程序執行流程的中斷。根據系統特點,可以用下面的辦法來解決這個問題:
        (1) 上電后系統從 0 地址開始自動執行,設計跳轉指令在 remap 發生前使 PC指針指向0x10000 開始的 ROM 地址中去,因為不同地址
        指向的是同一塊ROM,所以程序能夠順利執行。
        (2) 這時候 0 - 0x4000的地址空間空閑, 不被程序引用, 執行remap后把 RAM引進。因為程序一直在 0x10000 起始的 ROM 空間里
        運行,remap 對運行流程沒有任何影響。
        (3) 通過在 ROM 里運行的程序,對 RAM 進行相應的代碼和數據拷貝,完成應用程序運行的初始化。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 姜堰市| 陆河县| 嘉定区| 商河县| 侯马市| 松潘县| 安徽省| 叙永县| 彰化县| 宁夏| 商洛市| 河北省| 西贡区| 阳原县| 甘孜| 九龙城区| 林芝县| 大邑县| 上饶县| 临海市| 焉耆| 永兴县| 金华市| 化德县| 贵德县| 常熟市| 达拉特旗| 阜康市| 石台县| 砚山县| 宁晋县| 揭东县| 乌苏市| 大同市| 泰和县| 新建县| 九江市| 涡阳县| 安达市| 中阳县| 英超|