ARM嵌入式系統中斷向量表的動態配置

2021-04-20 04:40:43 字數 4353 閱讀 7785

摘 要:通常32位

arm嵌入式系統的中斷向量表是在程式編譯前設定好的,每次編寫中斷程式都要改c程式的彙編啟動**,相當繁瑣。本文給出一種配置

arm中斷向量表新方法。該方法比通常方法僅增加一條指令執行時間,簡便高效,功能完備,向量表在執行時動態生成,c程式可以使用固定向量表的啟動**,並可隱藏起來。

嵌入式系統

arm 中斷向量表

一般32位arm嵌入式系統的中斷向量表是程式編譯前設定好的。在編寫32位arm嵌入式系統的中斷服務程式、設定和修改arm體系結構的中斷向量表時, 常感到相當麻煩,不得不修改彙編**,對不喜歡使用彙編**程式設計的程式設計師尤其如此。當需要在程式執行過程中動態修改中斷向量的程式時會感到更為不便,不得 不增加很多分支處理指令才能實現。為此本文提出一種簡便高效的配置方法,實現了rom固化程式在執行時動態配置arm嵌入式系統中斷向量表的功能。

1 arm中斷向量兩種設定方法

在32位arm系統中,一般都是在中斷向量表中放置一條分支指令或pc暫存器載入指令,實現程式跳轉到中斷服務例程的功能。例如:

irqentry b handleirq ;跳轉範圍較小

b handlefiq

或irqentry ldr pc,=handleirq ;跳轉的範圍是任意32位位址空間

ldr pc,=handlefiq

ldr偽指令等效生成1條儲存讀取指令和1條32位常數定義指令。32位常數儲存在ldr指令附近的儲存單元中,相對偏移小於4kb。該32位資料就是要跳轉到的中斷服務程式入口位址。

之所以使用ldr偽指令,是因為arm的risc指令為單字指令,不能裝載32位的立即數(常數),無法直接把乙個32位常數資料或位址資料裝載到暫存器中。下面一般程式與上述偽指令功能等效,但中斷向量表描述得更為清晰。其中vectortable為相對ldr指令的偏移量:

irqentry ldr pc,vectortable+0

;與ldr pc,=handleirq等效

ldr pc,vectortable+4

;與ldr pc,=handlefiq等效

vectortable dcd handletrq

dcd handlefiq

handleirq

handlefiq

一般arm嵌入式系統的程式都是固化在從00000000h開始的低端rom空間中,中斷向量表vectortable也是固化在rom中,所以上述兩種 方法都無法在程式執行時動態隨機修改中斷向量表。不論對於初學arm處理器的程式設計師還是有經驗的程式設計師,設定中斷向量都相當繁瑣,必須修改arm的c程式的啟動**。一段晦澀的彙編**很不方便,比較容易出錯。

2 x86與arm處理器中斷向量表比較

實模式x86程式設計師都熟悉,在x86體系結構的pc系統中,不論是用彙編還是用c語言,都可以動態隨機地設定、修改中斷向量表—只需要簡單地把中斷程式例程的入口位址寫入到中斷向量表資料區,即可完成向量表的設定。

x86向量表設定方便的原因有兩個。其一是中斷向量表與程式**完全分離,中斷向量表設定在ram資料空間,向量表存放的資料是純粹位址資料;而在arm向量表中存放的是與中斷服務例程入口有關的一條分支指令。另乙個原因是,除bios外,大多數pc程式都是在執行時載入到ram中的,程式資料是不加區別的,所以可以很容易在程式執行的過程中從資料生成程式,並可以很容易把cpu控制權轉到新生成的程式中。

表面上看,在arm第二種中斷向量設定方法的向量表vectortable中也是純位址資料,不含指令**,似乎可以把vectortable設定在ram資料段中。然而一般arm體系的rom**段和ram資料段間的偏移遠大於2 12,故超出了ldr使用pc為基址的相對定址範圍。

**中的vectortable是乙個與當前pc間的乙個偏移,ldr指令的相對位址是在編譯時計算的,要求vectortable<2 12,所以vectortable不能隨意安排在ram空間中。vectortable一般只能安排在中斷跳轉指令附近的**區內中。

3 arm結構中中斷向量表的動態配置方法

要在arm結構中實現與x86中一樣方便的在中斷向量的隨機訪問功能,向量表的位址資料必須可以安排在任意32位位址的ram空間中。為此,中斷處理必須增加一條指令,先跳轉到向量表,然後執行向量表中動態生成的跳轉指令,跳轉到中斷服務程式,參見下列初始化**:

;******向量表******

entry

b resethandle ;原向量偏移 ,中斷號

b resehandle ;0x00 ,00

ldr pc,=newvectortable+0x08 ;0x04,未定義 ,01

ldr pc,=newvector table+0x10 ;0x08,swi,02

ldr pc,=newvectortable+0x18 ;0x0c,未定義 ,03

ldr pc,=newvectortable+0x20 ;0x10,未定義 ,04

ldr pc,=newvectortable+0x28;0x14,未定義 0,05

ldr pc,=newvectortable+0x30 ;0x18,irq ;06

ldr pc,=newvectortable+0x38 ;0x1c,fiq ,07

;********段******

resethandle

;***資料段,為newvectortable分配資料空間***

newvectortable # 128;大小根據需要定義,每向量2個字(8位元組);

程式執行時,中斷服務的初始化 程式必須設定好新的中斷向量表,即在newvectortable表中動態生成下列指令:

newvectortable;表安排在ram頂端0x0c1fff00處(由硬體設定)

ldr pc,[pc,#4];指令**為0xe51ff004,功能為pc〈-[pc+4]

nvt00 dcd isr_reset_handle

ldr pc,[pc,#4];與ldr pc,nvt01指令等效

nvt01 dcd isr_undef_handle

ldr pc,[pc,#4]

nvt02 dcd isr_swi_handle

ldr pc,[pc,#4]

nvt03 dcd isr_undef_handle

ldr pc,[pc,#4]

nvt04 dcd isr_undef_handle

ldr pc,[pc,#4]

nvt05 dcd isr_undef_handle

ldr pc,[pc,#4]

nvt06 dcd isr_irq_handle

ldr pc,[pc,#4]

nvt07 dcd isr_fiq_handle

可用c函式在nwevectortable中生成含上述指令的向量表,具體實現如下:

#define vector_table 0x0c1fff00

//向量表首位址,根據實際硬體來配置

#define instruction_ldr_pc 0xe51ff004

//載入pc暫存器的指令碼

//設定向量c函式,isr_handle中斷服務程式位址

void setvector(unsigned char no,unsigned long int isr_handle){

unsigned long int * pvectortable;

//定義32位無符號數指令,指向向量表

pvectortable=((unsigned long int *)(vector_table+(no<<3)));

*pvectortable++=instruction_ldr_pc;

//在向量表中放置ldr pc,[pc,#4]指令

*pvectortable=isr_handle;//設定中斷服務例程入口位址

//讀取向量c函式,no代表中斷號

unsigned long int getvector(unsigned char no){

unsigned long int *pvectortable;

pvectortable=((unsigned long int *)(vector_table+(no<<3)));

return *(++pvectortable);//返回中斷處理程式入口位址

使用上述初始化**和向量設定函式,除復位向量外,其它所有中斷向量都可以指向了在ram資料區中的新向量表,並給定乙個統一的中斷編號。中斷服務程式可 以放在任何模組檔案中編譯連線,不需要修改原向量表**,但在開啟中斷使用中斷服務例程前必須使用c函式setvector()設定中斷向量。

4 結論

本文提出的中斷向量表配置策略和實現方法,簡便高效,僅比標準處理方法增加一條指令的執行時間。當把

arm的c初始化彙編**中所有中斷源(包括擴充套件的內外部中斷源)的向量都指向了新向量表,並統一編號,此後編寫任何中斷服務程式幾乎不需要修改彙編**,c初始化**完全可以對c程式設計師隱藏起來,並可以像在x86體系下一樣動態地設定和修改中斷向量。

ARM的啟動和中斷向量表

對於s3c2440而言,啟動的方式有兩種,一是nor flash方式啟動,二是nand flash方式啟動。nor flash的位址範圍如下 0x0000.0000 0x0800.0000 2m nor flash 片內的bootsram位址被置為 0x4000.0000 0x4000.dfff 4...

嵌入式系統 概述 ARM指令

嵌入式系統是以應用為中心,以計算機技術為基礎,採用可裁剪軟硬體,適用於對功能 可靠性 成本 體積 功耗等有嚴格要求的專用計算機系統。它一般由嵌入式微處理器 外圍硬體裝置 嵌入式作業系統及使用者應用程式四部分組成。簡單說,網咖裡的電腦是通用計算機,而 豆漿機等內含的都有嵌入式系統。嵌入式系統的特點是功...

ARM學習筆記 嵌入式系統

嵌入式系統是 1 以應用為中心,以計算機技術為基礎 2 軟硬體可裁減,3 對功能 可靠性 成本 體積 功耗有嚴格要求的專用計算機系統。1 嵌入式應用領域 通訊 對講機 醫療 血壓儀 智慧型家居 遊戲機 軍事 頭盔 2 什麼樣的結構讓嵌入式系統具備軟硬體可裁減的特點 硬體 嵌入式處理器 arm x86...