<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM嵌入式系統(tǒng)初始化過程

          ARM嵌入式系統(tǒng)初始化過程

          作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
          基于ARM內(nèi)核微處理器的系統(tǒng)一般為復(fù)雜的片上系統(tǒng),這種復(fù)雜系統(tǒng)的多數(shù)硬件模塊都是可配 置的,需要軟件設(shè)置為特定的工作狀態(tài),因此在用戶的應(yīng)用程序之前,需要有一些專門的代碼完成對系統(tǒng)的初始化。由于這類代碼直接面對ARM處理器內(nèi)核和硬件 控制器,一般都使用匯編語言完成。初始化代碼完成的操作與具有的硬件平臺相關(guān),但一般包括一下的內(nèi)容:
          --初始化異常向量表(中斷向量表)
          --初始化存儲器系統(tǒng)
          --初始化堆棧
          --初始化有特殊要求的端口和設(shè)備
          --初始化應(yīng)用程序的運行環(huán)境
          --調(diào)用主應(yīng)用程序
          1、初始化異常向量表(中斷向量表)
          ARM微處理器結(jié)構(gòu)要求中斷向量表必須放置在從0x00地址開始的連續(xù)8×4字節(jié)的空間內(nèi),每當(dāng)一個中斷(異常)發(fā)生以后,ARM微處理器便強(qiáng)制把PC置 為對應(yīng)的中斷向量。由于每個中斷只占用向量表中一個字(4個字節(jié))的存儲空間,只能放一條ARM指令,所以通常為跳轉(zhuǎn)指令,使程序從向量表跳轉(zhuǎn)到存儲器的 其他位置,執(zhí)行真正的中斷處理。
          具體代碼實現(xiàn)如下:
          AREA Init,CODE,READONLY
          ENTRY
          B Reset_Handler ;異常復(fù)位
          B Undef_Handler ;未定義指令異常
          B SWI_Handler ;軟件中斷
          B PreAbort_Handler ;指令預(yù)取中止
          B DataAbord_Handler ;數(shù)據(jù)中止
          B . ;系統(tǒng)保留
          B IRQ_Handler ;普通外部中斷
          B FIQ_Handler ;快速外部中斷
          ..........
          2、初始化存儲器系統(tǒng)
          主要是對系統(tǒng)存儲器控制器(MMU)的初始化。由于存儲器控制器并不是ARM架構(gòu)的一部分,不同芯片的實現(xiàn)方式各不相同。由于運算能力和尋址能力的強(qiáng)大, 基于ARM內(nèi)核的微處理器系統(tǒng)一般都需要外擴(kuò)展各種類型的存儲器。對于存儲器系統(tǒng)的初始化一般包括如下幾個方面:
          --存儲器類型、時序和總線寬度的配置
          --存儲器地址的配置
          (1)存儲器類型
          基于ARM微處理系統(tǒng)的存儲器一般有如下幾類:SARM,DRAM,Flah,同時,即使同類存儲器也有訪問速度上的不同。其中,SRAM和Flah屬于 靜態(tài)存儲器,可以共用存儲器端口,而DRAM有動態(tài)刷新和地址復(fù)用等特征,需要專門的存儲器端口。
          (2)時序
          存儲器端口的接口時序優(yōu)化對系統(tǒng)性能影響非常大,因為系統(tǒng)運行的速度瓶頸一般都存在于存儲器的訪問,因此希望存儲器的訪問盡可能快,但又要考慮由此帶來的 系統(tǒng)穩(wěn)定性問題。
          (3)總線寬度
          ARM微處理器架構(gòu)支持8/16/32位的數(shù)據(jù)總線寬度訪問存儲器和外設(shè),對于特定的存儲器來說,需要設(shè)定數(shù)據(jù)總線的寬度。
          (4)存儲器地址的配置
          ARM微處理器架構(gòu)理論上可以支持4GB的地址空間,而對于一個實際的系統(tǒng)來說,配置的物理地址遠(yuǎn)沒有這么多,因此,如何配置存儲器的地址,也是一個重要 的問題。
          (5)存儲器地址重映射
          存儲器地址重映射就是可以通過軟件配置來改變一塊存儲器物理地址的方法,是當(dāng)前許多先進(jìn)控制器所具有的功能。
          進(jìn)行地址重映射的原因:提高系統(tǒng)的運行效率。
          進(jìn)行地址重映射的注意:保證程序流程的連續(xù)性。
          有的ARM處理器不具有地址重映射的功能,可以采樣代碼搬移加跳轉(zhuǎn)的方式完成上述功能。
          3、初始化堆棧
          由于ARM微處理器有7中運行模式,每一種模式的堆棧指針(SP)都是獨立的(其中系統(tǒng)模式和用戶模式使用相同的SP)。因此,需要對每一種模式的SP進(jìn) 行初始化。
          采用的方法是:改變當(dāng)前程序狀態(tài)寄存器(CPSR)內(nèi)的狀態(tài)位,使處理器切換到不同的狀態(tài),然后初始化SP。但是對用戶模式下SP的初始化應(yīng)該放在最后, 因為ARM微處理器進(jìn)入用戶模式之后就無法再切換到其他模式。
          設(shè)置堆棧應(yīng)該注意的問題是:堆棧的大小根據(jù)需要確定,要盡可能給堆棧分配高速存儲器(例如片內(nèi)的SRAM)。堆棧性能的提高對提高系統(tǒng)整體性能的影響非常 顯著。
          初始化堆棧的代碼如下:
          MRS R0, CPSR
          BIC R0, R0, #MODEMASK
          ORR R1, R0, #IRQMODE
          MSR CPSR_c, R1
          LDR SP, =IRQStack
          BIC R0, R0, #MODEMASK
          ORR R1, R0, #FIQMODE
          MSR CPSR_c, R1
          LDR SP, =FIQStack
          .........
          4、初始化應(yīng)用程序和有特殊要求的端口和設(shè)備
          該部分的初始化由具體的系統(tǒng)和用戶需求決定,一般的外設(shè)初始化可以放在系統(tǒng)初始化以后進(jìn)行。比較典型的應(yīng)用是驅(qū)動一些簡單的輸出設(shè)備,例如LED等,用來 指示系統(tǒng)啟動的進(jìn)程和狀態(tài)。初始化應(yīng)用程序的運行環(huán)境,就是完成必要的從ROM到RAM的數(shù)據(jù)傳輸,初始化有特殊要求的端口、設(shè)備和應(yīng)用程序的運行環(huán)境。
          5、改變處理器的模式
          ARM微處理器支持7種模式,其中:
          超級模式(Supervisor):復(fù)位后的缺省模式。
          多種特權(quán)模式變化:主要完成各模式的堆棧設(shè)置,注意不要進(jìn)入用戶模式。
          用戶模式:用戶程序運行模式。
          6、調(diào)用應(yīng)用主程序
          當(dāng)完成所有的系統(tǒng)初始化工作之后,就需要把程序流程轉(zhuǎn)入主應(yīng)用程序。最常見的操作是:
          IMPORT C_Entry
          ......
          B C_Entry


          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();