當(dāng)前位置:首頁 > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]前言嵌入式系統(tǒng)是以各種嵌入式微處理器為內(nèi)核,運(yùn)行RTOS的面向應(yīng)用的計(jì)算機(jī)控制系統(tǒng),也是SOC技術(shù)的一個(gè)重要分支。ARM 是一個(gè)IP(知識產(chǎn)權(quán))公司,以arm體系結(jié)構(gòu)為基礎(chǔ)的各種

前言

嵌入式系統(tǒng)是以各種嵌入式微處理器為內(nèi)核,運(yùn)行RTOS的面向應(yīng)用的計(jì)算機(jī)控制系統(tǒng),也是SOC技術(shù)的一個(gè)重要分支。ARM 是一個(gè)IP(知識產(chǎn)權(quán))公司,以arm體系結(jié)構(gòu)為基礎(chǔ)的各種RISC 微處理器針對不同應(yīng)用領(lǐng)域提供了不同的指令集(ARM、THUMB、DSP、XSCALE)可以為各種實(shí)時(shí)應(yīng)用提供靈活的選擇。

在研制開發(fā)基于ARM處理器的嵌入式系統(tǒng)過程中,如何讓系統(tǒng)正??焖俚膯邮且粋€(gè)關(guān)鍵環(huán)節(jié),本文主要分析討論嵌入式系統(tǒng)啟動的問題。相關(guān)代碼以ArmStd2.51IDE環(huán)境為參考。

幾個(gè)相關(guān)的概念

Arm/Thumb狀態(tài)

Arm,Thumb分別是ARM處理器的32/16bits的指令集,對應(yīng)處理器的兩種執(zhí)行狀態(tài)。

異常(Exception)

由內(nèi)/外部源引起的需要處理器干預(yù)的一個(gè)事件,每種異常模式有自己的特殊功能寄存器,堆棧。處理異常需要保護(hù)處理器的當(dāng)前狀態(tài),以便在異常處理后可以恢復(fù)執(zhí)行。當(dāng)異常發(fā)生時(shí),系統(tǒng)強(qiáng)制從固定的地址執(zhí)行程序, 如表1 所示。

無論在Arm/Thumb狀態(tài)進(jìn)入異常,處理程序都是在Arm狀態(tài)下執(zhí)行,PC->R14和CPSR->SPSR保存PC和處理器狀態(tài),返回時(shí)CPSR->SPSR,R14->PC。

中斷處理

ARM提供了兩種中斷源IRQ,F(xiàn)IQ,發(fā)生中斷時(shí),會進(jìn)入相應(yīng)的IRQ,F(xiàn)IQ異常模式,然后異常處理程序會識別不同的中斷,調(diào)用相應(yīng)的中斷服務(wù)程序。所以中斷只是異常的一個(gè)子集。未用中斷通常指向一個(gè)啞函數(shù)。

在嵌入式系統(tǒng)設(shè)計(jì)中應(yīng)正確的辨析異常和中斷。

系統(tǒng)啟動(start-up)

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

在目標(biāo)文件中,代碼、數(shù)據(jù)放在不同的段中。源文件編譯鏈接生成含.data、.text段的目標(biāo)文件,且鏈接器生成的.data段是以系統(tǒng)RAM為參考地址,故在系統(tǒng)啟動時(shí)需要拷貝ROM中的.data段到RAM,以完成對RAM的初始化??截悘?text結(jié)束位置開始,一般以2kbytes對齊取到下一個(gè)2kbytes,確定data的初始位置。這樣,就定位.data 、.text段在鏈接文件中所確定的鏈接位置。

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

為了實(shí)現(xiàn)異常的快速處理:

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

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

 


 

 

啟動過程分析

設(shè)置異常向量

ARM7要求中斷向量表必須設(shè)置在從0地址開始,連續(xù)8×4字節(jié)的空間,具體分配如表1。如果ROM定位于0地址,向量表包含一系列指令跳轉(zhuǎn)到中斷服務(wù)程序,否則應(yīng)使用一串位置無關(guān)代碼(PIC)處理,使用直接加載PC指針的指令??梢栽趩映绦蛑刑砑右欢未a,使其在運(yùn)行時(shí)將這段PIC指令拷貝到對應(yīng)地址開始的存儲器空間。

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

FIQ_Handler /* 從這里開始進(jìn)入FIQ異常模式,*/

SUB sp, sp, #4

STMFD sp!, {r0}/*裝入并減一個(gè)字,使用r0,應(yīng)該首先壓入堆棧*/

LDR r0, =HandleFiq /*從這里開始進(jìn)入在RAM中的異常處理程序*/

LDR r0, [r0]

STR r0, [sp, #4]

LDMFD sp!, {r0, pc} /*返回退出FIQ異常處理模式*/

異常處理程序

Sys_Fiq_Handler

IMPORT ISR_FiqHandler /*進(jìn)入異常處理,保存寄存器,每種模式有自己的分組寄存器(banked registers)*/

STMFD sp!, {r0-r7, lr} /*發(fā)生*/

BL ISR_FiqHandler /*進(jìn)入異常處理程序*/

LDMFD sp!, {r0-r7, lr}

SUBS pc, lr, #4 /*恢復(fù)寄存器,退出異常處理模式*/

對比具體的討論從ROM/RAM啟動的實(shí)現(xiàn)代碼

(說明【1】從RAM啟動 【2】從ROM啟動)

AREA Init, CODE, READONLY //初始化代碼

ENTRY /*設(shè)置入口指針*/

/*啟動程序首先必須定義入口指針,而且整個(gè)應(yīng)用程序只有一個(gè)入口指針

*/

IF :DEF: ROM_AT_ADDRESS_ZERO

B Reset_Handler B Reset_Handler

B **_Handler B sys_**_Handler

建立鏡像關(guān)系【2】 直接跳轉(zhuǎn)【1】。

ELSE

/*如果不是從ROM在0x0啟動,那么必須把直接加載指令拷貝到0x0位置,這是必須使用ldr完成*/

MOV R8, #0

/*ADR偽指令把PC相關(guān)的地址裝入寄存器*/

ADR R9, Vector_Init_Block

/* 塊加載存儲指令,IA = 加載后繼增*/

LDMIA R9!, {R0-R7}

STMIA R8!, {R0-R7}

LDMIA R9!, {R0-R7}

STMIA R8!, {R0-R7}

把這些指令放在0x0的位置,實(shí)現(xiàn)跳轉(zhuǎn)。直接加載相應(yīng)的處理程序的地址到PC指針。

Vector_Init_Block //如果不是從rom在0x0啟動,這里是一組直接加載PC的指令

LDR PC, Reset_Addr /*在執(zhí)行拷貝過程建立了異常處理,繼續(xù)執(zhí)行Reset_Handler*/

。。。。。。。。。。。。。。。。。。

LDR PC, **_Addr

/*定義 地址指針Reset_Addr 其值為reset_Handler*/[!--empirenews.page--]

Reset_Addr DCD Reset_Handler

。。。。。。。。。。。。。。。。。。。。。。。。

**_addr DCD **_handler

ENDIF

AREA Main, CODE, READONLY //配置存儲器,為運(yùn)行程序作準(zhǔn)備。

從這里進(jìn)入reset異常處理模式

EXPORT Reset_Handler

Reset_Handler ;/* 復(fù)位入口點(diǎn),關(guān)閉所有中斷 */

LDR r1, =IntMask

LDR r0, =0xFFFFFFFF

STR r0, [r1]

INITIALIZE_STACK /*初始化堆棧*/

。。。。。。。。。。。。。。。。。。。。。。。。。。。

LDR sp, =SUP_STACK ; 改變CPSR,進(jìn)入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 ; 分配的異常向量表在存儲區(qū)的位置.

LDR r1, =ExceptionHandlerTable ; 異常向量表

MOV r2, #8; 向量數(shù)

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 數(shù)據(jù)的指針

LDR r1, =|Image$$RO$$Limit| ;

LDR r2, =DRAM_BASE ;

RAM區(qū)的基地址

SUB r1, r1, r0 ; [r1] 循環(huán)計(jì)數(shù)

ADD r1, r1, #4 ; [r1]

ROM2SDRAM_COPY_LOOP

LDR r3, [r0], #4

STR r3, [r2], #4

SUBS r1, r1, #4 ; 減計(jì)數(shù)

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}

異常模式下堆棧的初始化

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

初始化C語言所需的存儲器空間:拷貝初始化數(shù)據(jù)

改變到用戶模式并設(shè)置用戶堆棧

MRS r0, cpsr

BIC r0, r0, #LOCKOUT | MODE_MASK

ORR r1, r0, #USR_MODE

MSR cpsr_cf, r0

LDR sp, =USR_STACK

呼叫C程序

; 進(jìn)入C程序 IMPORT C_Entry

BL C_Entry

AREA ROMDATA, DATA, READONLY 在ROM中定義的常量

SysInitDataSDRAM 特殊功寄存器常量的定義的入口地址

SysInitDataSDRAM_S

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

異常向量表【2】

^ DRAM_BASE

HandleReset # 4

HandleUndef # 4

HandleSwi # 4

HandlePrefetch # 4

HandleAbort # 4

HandleReserv # 4

HandleIrq # 4

HandleFiq # 4

 


圖4 ROM/RAM啟動系統(tǒng)存儲器映射

結(jié)語

在嵌入式系統(tǒng)設(shè)計(jì)開發(fā)的過程中,對基本原理的深刻理解有利于設(shè)計(jì)優(yōu)化。本文詳細(xì)辨析了嵌入式設(shè)計(jì)在系統(tǒng)啟動時(shí)一些概念,最后在上述分析的基礎(chǔ)上給出了實(shí)現(xiàn)從RAM快速啟動的具體步驟。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉