新聞中心

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

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

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

        在前面的文章中提到過,很多情況下應用程序需要在ARM跟Thumb狀態之間相互切換,這部分就討論交互工作的實現方法和一些注意問題。

        1需要交互的原因

        前面提到過,Thumb指令在某些特殊情況下具有比ARM指令更為出色的表現,主要是在代碼長度和窄帶寬存儲器系統性能兩方面。正是因為Thumb指令在特定環境下的優勢,它在很多方面得到了廣泛應用。但是因為下面一些原因,Thumb又不可能獨立地組成一個應用系統。
        ◇ Thumb指令集在功能上只是ARM指令集的一個子 集,某些功能只能在ARM狀態下執行,如CPSR和 協處理器的訪問。
        ◇ 進行異常響應時,處理器會自動進入ARM狀態。
        ◇ 從系統優化考慮,在寬帶存儲器上不應該放置 Thumb代碼,很多窄帶系統具有寬帶的內部存儲器。
        ◇ 即使是一個單純的Thumb應用系統,也必須加一 個匯編的交互頭程序,因為系統總是自動從ARM 開始啟動。

        所以,不可避免地會產生ARM與Thumb之間交互的問題。

        2狀態切換的實現

        處理器在 ARM/Thumb之間的狀態切換是通過一條專用的跳轉交換指令BX來實現的。BX指令以通用寄存器(R0~R15)為操作數,通過拷貝Rn到PC來實現 4GB空間范圍內的一個絕對跳轉。BX利用Rn寄存器中存儲的目標地址值的最后一位來判斷跳轉后的狀態。如圖1所示,是用BX指令實現狀態切換。




        無論ARM還是Thumb,其指令存儲在存儲器中都是邊界對齊的(4字節或2字節對齊)。因此,在執行跳轉過程中,PC寄存器中的最低位肯定被舍棄,不起作用。在BX指令的執行過程中,最低位正好被用作狀態判斷的標識,不會造成存儲器訪問不對齊的錯誤。

        圖 2 中是一段直接進行狀態切換的例程:



        下面是一段直接進行狀態切換的例程。
        ;從ARM狀態開始
          CODE32 ;匯編關鍵字
          ADR R0, Into_Thumb+1 ;得到目標地址,末位置1, ;轉向Thumb
          BX R0 ;執行 ? ;其它代碼
          CODE16 ;匯編關鍵字
        Into_Thumb ;Thumb代碼段起始地址
          … ;Thumb代碼
          ADR R5, Back_to_ARM ;得到目標地址,末位缺 ;省為0,轉向ARM
          BX R5 ;執行
          … ;其它代碼
          CODE32 ;匯編關鍵字
        Back_to_ARM ;ARM代碼段起始地址

        我們知道,在ARM的狀態寄存器CPSR 中,bit-5是狀態控制位T-bit,決定當前處理器的運行狀態。如果直接修改CPSR的狀態位,也能夠達到改變處理器運行狀態的目的。但是這樣會帶來一個問題,因為ARM采用多級流水線的結構,所以在程序執行過程中,指令流水線上會存在幾條預取指令(具體數目視流水線級數而不同)。當修改CPSR的 T-bit后,狀態的轉變會造成流水線上預取指令的執行錯誤。而如果用BX指令,則執行后會進行流水線的刷新動作,清除流水線上的殘余指令,在新的狀態下重新開始指令預取,從而保證狀態轉變時指令流的正確銜接。

        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 区。| 闽侯县| 三明市| 连城县| 民县| 庆云县| 霞浦县| 凤山县| 和林格尔县| 枣强县| 灌云县| 都匀市| 康乐县| 马关县| 博湖县| 新平| 八宿县| 曲靖市| 佛山市| 星子县| 洪洞县| 密云县| 新和县| 虞城县| 巴里| 昌吉市| 甘泉县| 鄱阳县| 临猗县| 象州县| 灯塔市| 巴东县| 阳曲县| 十堰市| 贵德县| 教育| 漳平市| 邓州市| 察雅县| 秦安县| 怀来县|