国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

在嵌入式系統中實現從RAM快速引導技術

發布時間:2010-11-24 11:43    發布者:eetech
關鍵詞: RAM , 嵌入式系統 , 引導
嵌入式系統是以各種嵌入式微處理器為內核,運行RTOS的面向應用的計算機控制系統,也是SOC技術的一個重要分支。ARM 是一個IP(知識產權)公司,以arm體系結構為基礎的各種RISC 微處理器針對不同應用領域提供了不同的指令集(ARM、THUMB、DSP、XSCALE)可以為各種實時應用提供靈活的選擇。

在研制開發基于ARM處理器的嵌入式系統過程中,如何讓系統正常快速的啟動是一個關鍵環節,本文主要分析討論嵌入式系統啟動的問題。相關代碼以ArmStd2.51IDE環境為參考。

幾個相關的概念

Arm/Thumb狀態
Arm,Thumb分別是ARM處理器的32/16bits的指令集,對應處理器的兩種執行狀態。
異常(Exception)

由內/外部源引起的需要處理器干預的一個事件,每種異常模式有自己的特殊功能寄存器,堆棧。處理異常需要保護處理器的當前狀態,以便在異常處理后可以恢復執行。當異常發生時,系統強制從固定的地址執行程序,                        如表1 所示。

無論在Arm/Thumb狀態進入異常,處理程序都是在Arm狀態下執行,PC->R14和CPSR->SPSR保存PC和處理器狀態,返回時CPSR->SPSR,R14->PC。

中斷處理

ARM提供了兩種中斷源IRQ,FIQ,發生中斷時,會進入相應的IRQ,FIQ異常模式,然后異常處理程序會識別不同的中斷,調用相應的中斷服務程序。所以中斷只是異常的一個子集。未用中斷通常指向一個啞函數。

在嵌入式系統設計中應正確的辨析異常和中斷。

系統啟動(start-up)

嵌入式系統的應用程序通常都是固化在ROM中運行。通常用匯編語言編寫啟動程序完成系統硬件和軟件運行環境的初始化。啟動程序與應用程序一起固化在ROM中。系統在上電和復位會跳到復位異常向量入口地址處。

在目標文件中,代碼、數據放在不同的段中。源文件編譯鏈接生成含.data、.text段的目標文件,且鏈接器生成的.data段是以系統RAM為參考地址,故在系統啟動時需要拷貝ROM中的.data段到RAM,以完成對RAM的初始化。拷貝從.text結束位置開始,一般以2kbytes對齊取到下一個2kbytes,確定data的初始位置。這樣,就定位.data 、.text段在鏈接文件中所確定的鏈接位置。

CPU對ROM或Flash ROM訪問速度慢,在一定程度上降低了系統的性能。當ROM在地址0x0時,ARM內核使用ROM 0x0 到0x1c作為異常向量區,那么當異常發生的時候,CPU訪問ROM區的入口。我們可以在RAM建立異常向量表鏡像,這樣可以提高系統的性能(鏡像建立)。最優的方法,就是讓系統RAM配置在0x0,把初始化程序放在RAM中運行(RAM啟動),建立異常向量表的自己對應關系。

為了實現異常的快速處理:

1、 在圖2,虛線框中表示的是當RAM在0x0時的情況,這是一種直接對應的關系。直接在向量入口處放置sys_**_handler處理程序。

2、 當ROM在0x0時需要建立了一種鏡像的關系。地址指針表示對應的數據存儲單元的物理地址,**_hander表示對應的處理程序在ROM的入口。Handle**是物理的存儲單元地址,里面放置了處理程序的入口指針。異常發生時經過**_handler---handler**---sys_**_handler的過程。Handler**定義在RAM中。




圖1 在文件、ROM、運行時段的分配





圖2 ROM/RAM 啟動時異常向量表比較





圖3 從RAM啟動時的過程

啟動過程分析

設置異常向量

ARM7要求中斷向量表必須設置在從0地址開始,連續8×4字節的空間,具體分配如表1。如果ROM定位于0地址,向量表包含一系列指令跳轉到中斷服務程序,否則應使用一串位置無關代碼(PIC)處理,使用直接加載PC指針的指令。可以在啟動程序中添加一段代碼,使其在運行時將這段PIC指令拷貝到對應地址開始的存儲器空間。

這段代碼建立了ROM中的異常入口地址和RAM中的處理代碼的鏡像關系。這種處理需要在RAM中手動的建立異常向量表,從RAM啟動時不需要。(以FIQ的處理為例)

FIQ_Handler /* 從這里開始進入FIQ異常模式,*/
SUB sp, sp, #4
STMFD sp!, {r0}/*裝入并減一個字,使用r0,應該首先壓入堆棧*/
LDR r0, =HandleFiq /*從這里開始進入在RAM中的異常處理程序*/
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD sp!, {r0, pc} /*返回退出FIQ異常處理模式*/
異常處理程序         
Sys_Fiq_Handler         
IMPORT ISR_FiqHandler  /*進入異常處理,保存寄存器,每種模式有自己的分組寄存器(banked registers)*/   
STMFD sp!, {r0-r7, lr} /*發生*/
BL ISR_FiqHandler  /*進入異常處理程序*/
LDMFD sp!, {r0-r7, lr}
SUBS pc, lr, #4 /*恢復寄存器,退出異常處理模式*/
對比具體的討論從ROM/RAM啟動的實現代碼
(說明【1】從RAM啟動 【2】從ROM啟動)
AREA  Init, CODE, READONLY //初始化代碼
  ENTRY /*設置入口指針*/
/*啟動程序首先必須定義入口指針,而且整個應用程序只有一個入口指針
*/
  IF :DEF: ROM_AT_ADDRESS_ZERO
B   Reset_Handler    B   Reset_Handler
B   **_Handler     B   sys_**_Handler
  建立鏡像關系【2】          直接跳轉【1】。
  ELSE  
/*如果不是從ROM在0x0啟動,那么必須把直接加載指令拷貝到0x0位置,這是必須使用ldr完成*/
    MOV  R8, #0
/*ADR偽指令把PC相關的地址裝入寄存器*/
    ADR  R9, Vector_Init_Block
   /* 塊加載存儲指令,IA = 加載后繼增*/
    LDMIA R9!, {R0-R7}
STMIA R8!, {R0-R7}
LDMIA R9!, {R0-R7}
STMIA R8!, {R0-R7}
把這些指令放在0x0的位置,實現跳轉。直接加載相應的處理程序的地址到PC指針。
Vector_Init_Block //如果不是從rom在0x0啟動,這里是一組直接加載PC的指令
LDR PC, Reset_Addr /*在執行拷貝過程建立了異常處理,繼續執行Reset_Handler*/
。。。。。。。。。。。。。。。。。。
LDR  PC, **_Addr
/*定義 地址指針Reset_Addr 其值為reset_Handler*/
Reset_Addr DCD  Reset_Handler
。。。。。。。。。。。。。。。。。。。。。。。。
**_addr DCD  **_handler
  ENDIF
AREA Main, CODE, READONLY //配置存儲器,為運行程序作準備。
從這里進入reset異常處理模式
     EXPORT Reset_Handler
Reset_Handler ;/* 復位入口點,關閉所有中斷 */
LDR r1, =IntMask
LDR r0, =0xFFFFFFFF
STR r0, [r1]
INITIALIZE_STACK /*初始化堆棧*/
。。。。。。。。。。。。。。。。。。。。。。。。。。。
LDR sp, =SUP_STACK ; 改變CPSR,進入SVC模式
SYNC_DRAM_CONFIGURATION 配置RAM空間
LDR r0, =0x3FF0000
LDR r1, =0x83FFFF90 ; 賦值 = 0x83FFFF91
STR r1, [r0]  ; 特殊功能寄存器Start_addr = 0x3FF00000
;ROM 和 RAM空間配置
  ;ADRL  r0, SysInitDataSDRAM【1】
  LDR  r0, =SysInitDataSDRAM【2】
LDMIA r0, {r1-r12}
LDR r0, =0x3FF0000 + 0x3010 ; ROMCntr Offset : 0x3010
STMIA r0, {r1-r12}
在RAM中建立異常向量表的鏡像入口。【2】
EXCEPTION_VECTOR_TABLE_SETUP
LDR r0, =HandleReset ; 分配的異常向量表在存儲區的位置.
LDR r1, =ExceptionHandlerTable ; 異常向量表
MOV r2, #8; 向量數
ExceptLoop   /*建立過程*/
LDR r3, [r1], #4
STR r3, [r0], #4
SUBS r2, r2, #1;
BNE ExceptLoop
把代碼從ROM拷貝到RAM【1】
ROM2SDRAM_COPY_START
LDR r0, =|Image$$RO$$Base| ;
指向 ROM 數據的指針
LDR r1, =|Image$$RO$$Limit| ;
LDR r2, =DRAM_BASE ;
RAM區的基地址
SUB r1, r1, r0 ; [r1] 循環計數
ADD r1, r1, #4 ; [r1]
ROM2SDRAM_COPY_LOOP
LDR r3, [r0], #4
STR r3, [r2], #4
SUBS r1, r1, #4 ; 減計數
BNE ROM2SDRAM_COPY_LOOP
改變ROM ,RAM的基地址
ADRL r0, SysInitDataSDRAM_S
/*裝載新的地址表,重新配置ROM和RAM*/
LDMIA r0, {r1-r12}
LDR r0, =0x3FF0000 + 0x3010 ;
ROMCntr 偏移地址值 : 0x3010
STMIA r0, {r1-r12}

異常模式下堆棧的初始化

系統堆棧初始化取決于用戶使用了哪些中斷,以及系統需要處理哪些錯誤類型。一般來說管理者堆棧必須設置,如果使用了IRQ中斷,則IRQ堆棧也必須設置。

初始化C語言所需的存儲器空間:拷貝初始化數據

改變到用戶模式并設置用戶堆棧

MRS  r0, cpsr
BIC r0, r0, #LOCKOUT | MODE_MASK
ORR r1, r0, #USR_MODE
MSR cpsr_cf, r0
LDR sp, =USR_STACK
呼叫C程序
; 進入C程序 IMPORT C_Entry
   BL   C_Entry
AREA ROMDATA, DATA, READONLY 在ROM中定義的常量
SysInitDataSDRAM 特殊功寄存器常量的定義的入口地址
SysInitDataSDRAM_S

/* 用于在ROM啟動時建立異常向量表鏡像的地址定義,存放的是異常發生時跳轉的地址,是異常處理程序的入口,這個表的位置可以自己分配。

異常向量表【2】
   ^  DRAM_BASE
HandleReset # 4
HandleUndef # 4
HandleSwi # 4
HandlePrefetch # 4
HandleAbort # 4
HandleReserv # 4
HandleIrq # 4
HandleFiq # 4




圖4 ROM/RAM啟動系統存儲器映射

結語

在嵌入式系統設計開發的過程中,對基本原理的深刻理解有利于設計優化。本文詳細辨析了嵌入式設計在系統啟動時一些概念,最后在上述分析的基礎上給出了實現從RAM快速啟動的具體步驟。
本文地址:http://www.qingdxww.cn/thread-41246-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 想要避免發生災難,就用MPLAB SiC電源仿真器!
  • 利用模擬開發工具生態系統進行安全電路設計
  • 我們是Microchip
  • 更佳設計的解決方案——Microchip模擬開發生態系統
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 538porm在线看国产亚洲 | 99爱视频精品免视看 | 久热这里只有精品99国产6 | 日本免费在线看 | 青青久久国产成人免费网站 | 日韩中文字幕一区 | 四虎永久免费网站 | 欧美日本免费一区二区三区 | 黄色成人在线播放 | 狠狠色婷婷丁香六月 | 国产在线视频www片 国产在线视频99 | 精品福利一区二区在线观看 | 久久这里只是精品免费视频 | 日本aⅴ在线 | 久久综合成人 | 久久久久久久久久久9精品视频 | 狠狠色婷婷丁香六月 | 狠狠色丁香九九婷婷综合五月 | 青青草tv| 黄页网址大全免费观看22 | 久久va| 丁香综合在线 | 91精品福利麻豆专区 | 欧美亚洲综合视频 | 国内自拍第一页 | 日韩福利在线 | 在线观看日韩视频 | 日本精品久久久久中文字幕 1 | 四虎永久地址4hu2019 | 99久久99久久精品免费看子 | 国产成人免费高清激情视频 | 日本高清黄色网站 | 国产一级a毛片 | 极品色天使在线婷婷天堂亚洲 | 久久天天躁狠狠躁夜夜2020一 | 久久综合视频网 | 西西人体www | 午夜片在线| 欧美日韩一区二区在线观看 | 色综合久久88中文字幕 | 国产最新自拍视频 |