|
在學(xué)習(xí)CM3的時候,仔細(xì)學(xué)習(xí)了CM3的中斷跳轉(zhuǎn)過程,發(fā)現(xiàn)嵌入式的MCU在這一塊基本上是一樣的,當(dāng)然不同架構(gòu)的MCU也有自己的特性。 我來介紹下CM3的中斷跳轉(zhuǎn)過程,首先假設(shè)中斷發(fā)生,CM3內(nèi)核開始響應(yīng)中斷,由于不同廠家的CM3可能略有區(qū)別,但CM3的內(nèi)核肯定是一樣的,所以我們在這個前提下開始討論,暫時把中斷屏蔽位,標(biāo)志位之類的東西放在一邊。 現(xiàn)在介紹中斷響應(yīng)的過程: 1、壓棧。從這一點來講幾乎所有的處理器都是一樣的,用壓棧保護(hù)現(xiàn)場。壓入哪些寄存器呢,又是怎樣一個順序?如果就大多數(shù)的C語音編程來講,這個不是很關(guān)心的內(nèi)容。但是CM3的壓棧寄存器特點,讓我們來見識下ARM設(shè)計的特點。其壓棧順序如下圖所示,請注意壓棧的地址順序和時間順序不是相同的。
這一點就我們普通coding來講,是非常奇特的,堆棧的空間順利和進(jìn)棧時間沒有必然聯(lián)系,跟我們“后進(jìn)先出”的觀點有很大出入,那么顯然這里的“堆?!保⒉皇俏覀儌鹘y(tǒng)意義的上的堆棧,具體怎樣實現(xiàn)ARM沒有詳述,只是說他們可以做到這點。 我們可以看到PC,xPSR,R0,R1,R2,R3是率先入棧的(時間上),這樣做的目的,是為了編譯器優(yōu)先使用入棧了的寄存器來保存中間結(jié)果(如果程序過大也可能要用到R4-R11,此時編譯器負(fù)責(zé)生成代碼來push它們)。這也是要求ISR盡量短小的原因,用更少的寄存器,以加快響應(yīng)。 2、查找中斷向量表。其實這一步跟第一步是并行的,只是為了分別介紹我,列了序號。ARM是有D-Code(數(shù)據(jù)總線)和I-Code(指令總線),兩條總線??梢钥吹絇C是第一個壓棧的,此時數(shù)據(jù)總線正忙于壓棧操作,與此同時指令總線就可以查找中斷向量表,查詢中斷服務(wù)程序的入口地址。在CM3中中斷向量表位于地址從0x00000000開始的一段存儲空間,每個表項占一個字(4byte)。這是中斷向量表沒有重定位的情況,當(dāng)然中斷向量表也可以重定位,即存儲在其他地方。這個需要設(shè)置相應(yīng)的寄存器,我個人認(rèn)為還是讓其固定在這個默認(rèn)的位置比較好,以免出現(xiàn)以外情況。在看中斷向量表的時候我遇到了一個很有意思的問題: 中斷服務(wù)函數(shù)的入口地址為0x67C(圖1所示),但是中斷向量表中存儲的地址確是0x67D(圖2所示),竟然加了1。
這讓我糾結(jié)了很久,后來一位整ARM7的大牛解答了我的問題。ARM的PC最低位是0的時候ARM會進(jìn)入ARM模式,但是最低位是1的時候會進(jìn)入thumb模式。而我們的CM只支持thumb模式,所以PC最低位必須為1。而且thumb指令集是16位的,所以0x67D就是指向0x67C所存儲的指令,但是減一就不行了,就變成了指令空間內(nèi)上一個地址存儲的指令。
把CM3中斷跳轉(zhuǎn)過程寫出來跟大家分享,若有不妥之處,望大家斧正。 圖1 方框內(nèi)為所對應(yīng)中斷服務(wù)函數(shù)入口地 圖2 方框內(nèi)為中斷向量表中中斷服務(wù)函數(shù)入口地址 *************************************************************************** 記得在DSP TMS32F2812中,中斷向量的初始化是由一段地址拷貝代碼完成的,在STM32(Cortex-M3)中沒有顯示的代碼拷貝,只有啟動代碼進(jìn)行了向量的初始化,一直以為是編譯器在程序影像中自己完成了相關(guān)向量的拷貝,即,拷貝到固定的NVIC區(qū),事實上并不是這樣,cortex-m3并沒有一塊專門用于存放NVIC向量表的地方,這張表實際是存放在代碼(程序映像)的開始,下面引用cortex-M3權(quán)威指南進(jìn)行解釋: 當(dāng)發(fā)生了異常并且要響應(yīng)它時,CM3需要定位其服務(wù)例程的入口地址。這些入口地址存儲在所謂的“(異常)向量表”中。缺省情況下,CM3認(rèn)為該表位于零地址處,且各向量占用4字節(jié)。因此每個表項占用4字節(jié),如表7.6所示。
因為地址0處應(yīng)該存儲引導(dǎo)代碼,所以它通常映射到Flash或者是ROM器件,并且它們的值不得在運行時改變。然而,為了支持動態(tài)重分發(fā)中斷,CM3允許向量表重定位——從其它地址處開始定位各異常向量。這些地址對應(yīng)的區(qū)域可以是代碼區(qū),但更多是在RAM區(qū)。在RAM區(qū)就可以修改向量的入口地址了。為了實現(xiàn)這個功能,NVIC中有一個寄存器,稱為“向量表偏移量寄存器”(在地址0xE000_ED08處),通過修改它的值就能重定位向量表。但必須注意的是:向量表的起始地址是有要求的:必須先求出系統(tǒng)中共有多少個向量,再把這個數(shù)字向上“圓整”到2的整次冪,而起始地址必須對齊到后者的邊界上。例如,如果一共有32個中斷,則共有32+16(系統(tǒng)異常)=48個向量,向上圓整到2的整次冪后值為64,因此向量表重定位的地址必須能被64*4=256整除,從而合法的起始地址可以是:0x0, 0x100, 0x200等。向量表偏移量寄存器的定義如表7.7所示。 如果需要動態(tài)地更改向量表,則對于任何器件來說,向量表的起始處都必須包含以下向量:
? 復(fù)位向量 ? NMI ? 硬fault服務(wù)例程 后兩者也是必需的,因為有可能在引導(dǎo)過程中發(fā)生這兩種異常。 可以在SRAM中開出一塊空間用于存儲向量表。在引導(dǎo)期間先填寫好各向量,然后在引導(dǎo)完成后,就可以啟用內(nèi)存中的新向量表,從而實現(xiàn)向量可動態(tài)調(diào)整的能力。 關(guān)鍵字:ARM Cortex-M3 中斷跳轉(zhuǎn)編輯:什么魚 引用地址:http://www./mcu/2018/ic-news120342309.html本網(wǎng)站轉(zhuǎn)載的所有的文章、圖片、音頻視頻文件等資料的版權(quán)歸版權(quán)所有人所有,本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如果本網(wǎng)所選內(nèi)容的文章作者及編輯認(rèn)為其作品不宜公開自由傳播,或不應(yīng)無償使用,請及時通過電子郵件或電話通知我們,以迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。
上一篇:STM32的"異?!啊ⅰ爸袛唷焙汀笆录眳^(qū)別和理解
0
推薦閱讀 s3c2410 ARM 時鐘與設(shè)置),一個是MPLL, 用于產(chǎn)生FCLK, HCLK, PCLK三種頻率, 這三種頻率分別有不同的用途:FCLK是CPU提供的時鐘信號,如果提到CPU的主頻是400MHz,就是指的這個時鐘信號。 HCLK是為AHB總線提供的時鐘信號, Advanced High-performance Bus,主要用于高速外設(shè),比如內(nèi)存控制器,中斷控制器,LCD控制器, DMA 以及USB host 。 PCLK是為APB總線提供的時鐘信號,Advanced Peripherals Bus
發(fā)表于 2018-12-18
S3C2410(ARM9)的啟動方式1、Nand Flash啟動為了從Nand Flash啟動,S3C2410配置了一個叫做Steppingstone的4KB內(nèi)部SRAM緩沖器,當(dāng)系統(tǒng)被配置為從Nand Flash啟動時(配置由硬件工程師在電路板設(shè)置),Nandflash控制器會自動的將Nand Flash前4KB代碼將會被自動裝入內(nèi)部RAM(Steppingstone)中,并把0x0地址設(shè)置為內(nèi)部RAM的起始地址(存儲器映射),然后CPU開始從內(nèi)部RAM的0x0地址啟動,這個過程不需要程序的干涉。通常nandflash前4KB的代碼會將nandflash中的CPU啟動初始化代碼拷貝到SDRAM中,然后跳到SDRAM中開始執(zhí)行。所以程序員需要做的就是將最核心的啟動代碼
發(fā)表于 2018-12-18
ARM裸機(jī)——FS2410按鍵控制LED燈(查詢方式)亮著則熄滅,反之相反 GPFDAT |= (0x4 << 4); else GPFDAT &= (0xb << 4); } } } return 0;}Makefile:led.bin: start.S led_key.c arm-none-linux-gnueabi-gcc -c start.S -o start.o arm-none-linux-gnueabi-gcc -c led_key.c -o led_key.o arm-none-linux-gnueabi-ld -Ttext 0x30008000 start.o led_key.o -o
發(fā)表于 2018-12-18
基于S3C6410的ARM11學(xué)習(xí)(六) 核心初始化之關(guān)閉所有中斷時鐘的。而沒有對應(yīng)外部中斷以及一些外設(shè)的中斷的。我認(rèn)為的話,復(fù)位后,外部中斷及外設(shè)的中斷都是不使能的呢?為什么了,因為時鐘沒有開啟。STM32比ARM11多了門控時鐘這個東西。即每個外設(shè)都有對應(yīng)的門控時鐘,當(dāng)要使用該外設(shè)的時候,要開啟對應(yīng)外設(shè)的時鐘。復(fù)位的時候,外設(shè)時鐘是默認(rèn)關(guān)閉的。這個就看外設(shè)時鐘使能寄存器就可以了,外設(shè)的話,是掛在不同的總線上的,有的在AHB總線,有的在APB1,有的在APB2上,所以就有3個寄存器來配置各個總線對應(yīng)的時鐘使能。 這里,就以APB2外設(shè)時鐘使能說明。復(fù)位默認(rèn)值是0x0,所以每一位都是0.從列表就可以看出,0就是對應(yīng)功能的時鐘關(guān)閉。比如位
發(fā)表于 2018-12-18
基于S3C6410的ARM11學(xué)習(xí)(七) 核心初始化之關(guān)閉MMU和CACHE在關(guān)閉了所有中斷后,就要關(guān)閉MMU和CACHE了。因為這個時候,還在初始化環(huán)境,這兩個東西是用不到的。所以就需要把他們都關(guān)閉,免得影響我們的初始化。 MMU是Memory Management Unit的縮寫,中文名是存儲器管理單元。主要是兩個功能:1、虛擬地址轉(zhuǎn)換為物理地址2、實現(xiàn)內(nèi)存的保護(hù) 至于具體的MMU的一些知識,等后面用到了在說明了。目前,只需要將MMU給關(guān)掉即可。這個時候,我們需要查看S3C6410的核ARM1176JZFS手冊。在這里,我們要接觸到一個系統(tǒng)控制處理器,CP15。也叫做協(xié)處理器。手冊中說明了,CP15系統(tǒng)控制處理器的作用,主要是6個:1、整個系統(tǒng)
發(fā)表于 2018-12-18
基于S3C6410的ARM11學(xué)習(xí)(一) 基礎(chǔ)知識手上有一塊OK6410的板子,就想起來花點時間學(xué)習(xí)下經(jīng)典的ARM系列ARM11。了解一下ARM11的開發(fā)流程,以及怎么跑系統(tǒng)。ARM11和之前學(xué)習(xí)的STM32的開發(fā)是很不一樣的。STM32,都是把代碼燒到STM32芯片F(xiàn)LASH中,然后代碼從FLASH中執(zhí)行,而且程序執(zhí)行是不需要外部掛ram的,因為芯片的內(nèi)部就集成了一定大小的ram。而ARM11是不一樣的,內(nèi)部沒有FLASH和ram,所以就需要外掛flash設(shè)備和ram設(shè)備,然后ARM11通過存儲控制器來操作這些設(shè)備。從圖中就可以直觀的看出區(qū)別了。對于S3C6410,因為內(nèi)部沒有存儲器,所以需要將代碼燒錄到外掛的FLASH設(shè)備,這里FLASH設(shè)備可以有多種,但是一定要芯片支持
發(fā)表于 2018-12-18
|
|
|
來自: 刀首木 > 《中斷/異?!?/a>