新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > arm中斷學習及變量長度

        arm中斷學習及變量長度

        作者: 時間:2016-11-11 來源:網絡 收藏
        本人正在ARM的學習中,以前只學過51,沒學過ARM和系統,現在開始學習ARM。

        使用的的是PHILIPS 的ARM控制器LPC2000系列

        本文引用地址:http://www.104case.com/article/201611/316771.htm

        1.I/O配置

        LPC2000有管腳功能配置寄存器,一個管腳可以通過PINSEL0~2的配置,可以有1~4個功能(有的只有一個),但不是說任意一個管腳可以配置為任意功能,只能通過器件手冊的規定選擇規定功能中的一個。

        2.中斷

        LPC2000的中斷專門有一套寄存器來管理,這套寄存器稱為VIC(向量中斷控制器)。

        向量中斷控制器(VIC)具有32 個中斷請求輸入,可將其編程分為3 類:FIQ、向量IRQ 和非向量IRQ。可編程分配機制意味著不同外設的中斷優先級可以動態分配并調整。

        所謂FIQ,就是快速中斷,要求具有最高優先級。如果分配給FIQ 的請求多于1 個,VIC將中斷請求“相或”后向ARM 處理器產生FIQ 信號。當只有一個中斷被分配為FIQ 時可實現最短的FIQ 等待時間,因為FIQ 服務程序只要簡單地啟動器件的處理就可以了。但如果分配給FIQ 級的中斷多于1 個,FIQ 服務程序從VIC 中讀出一個字來識別產生中斷請求的FIQ 中斷源是哪一個。

        向量IRQ,具有中優先級,就是IRQ下還可以分為16個優先級,根據VICVectAddr0~15 來排列模塊的優先級,0為最高級別,15為最低優先級

        非向量IRQ,具有最低優先級,多個中斷共用一個中斷服務子程序(ISR)入口,入口地址放到VICDefVectAddr中,并通過讀取中斷的狀態來判斷是哪個中斷被響應。

        FIQ和IRQ的選擇由寄存器VICIntEnable、VICIntSelect來配置,向量IRQ和非向量IRQ由VICVectCntl0~15的第5位來選擇,VICVectAddr0~15 所決定的中斷入口地址對應的中斷是由VICVectCntl0~15的低4位所代表的中斷號(通道,詳見芯片的數據手冊)決定。

        雖然可以選擇多個中斷源(通過VICIntSelect)來產生FIQ 請求,但是只有一個專門的中斷服務程序來服務響應所有可用/出現的FIQ 請求。因此,如果分配為FIQ 的中斷多于一個,FIQ 中斷服務程序就必須讀取VICFIQStatus 的內容來決定如何處理中斷請求。不過還是建議只將一個中斷分配為FIQ。多個FIQ 中斷源會增加中斷延遲。

        一旦產生中斷號為N的向量IRQ請求,VICVectAddr 和分配給中斷號為N的ISR地址相同,即VICVectAddr=VICVectAddr X,而VICVectCnt X=0X0000 002N,VICVectAddr X=ISR地址。通常,獲得ISR地址,可以通過將ISR的函數強制由void轉換為usigned long實現,比如VICVectAddr0=(unsigned long)time_int();

        一旦產生非向量IRQ請求,那么VICVectAddr 的內容與VICDefVectAddr 相同。

        在中斷服務程序執行完畢后,對外設中斷標志的清零將會對VIC 寄存器(VICRawlntr,VICFIQStatus 和VICIRQStatus)當中的對應位產生影響。另外,為了能夠服務下次中斷,必須在中斷返回之前對ICVectAddr 寄存器執行寫操作。該寫操作將清零內部中斷優先級硬件當中對應的中斷標志。

        如果看門狗只在溢出或無效喂狗時產生中斷,那么無法清除中斷。唯一的方法是通過VICIntEnClr 禁止VIC 中斷來實現中斷返回。

        VICIRQStatus IRQ 狀態寄存器。該寄存器讀出定義為IRQ 并使能的中斷的狀態。

        VICFIQStatus FIQ 狀態請求。該寄存器讀出定義為FIQ 并使能的中斷的狀態。

        VICRawIntr 所有中斷的狀態寄存器。該寄存器讀出32 個中斷請求/軟件中斷的狀態,不管中斷是否使能或分類

        VICIntSelect 中斷選擇寄存器。該寄存器將32 個中斷請求的每個都分配為FIQ 或IRQ

        VICIntEnable 中斷使能寄存器。該寄存器控制將32 個中斷請求和軟件中斷中的哪些使能為FIQ 或IRQ

        VICIntEnClr 中斷使能清零寄存器。該寄存器允許軟件將中斷使能寄存器中的一個或多個位清零

        VICSoftInt 軟件中斷寄存器。該寄存器的內容與32 個不同外設的中斷請求“相或”。

        VICSoftIntClear 軟件中斷清零寄存器。該寄存器允許軟件將軟件中斷寄存器中的一個或多個位清零。

        VICProtection 保護使能寄存器。該寄存器允許特權模式下運行的軟件對VIC 寄存器進行有限的訪問,運行在用戶模式下的軟件使用該1 位寄存器來控制對VIC 寄存器的訪問。

        VICVectAddr 向量地址寄存器。當發生一個IRQ 中斷時,IRQ 服務程序可讀出該寄存器并跳轉到讀出的地址。

        VICDefVectAddr 默認向量地址寄存器。該寄存器保存了非向量IRQ的中斷服務程序(ISR)地址。

        VICVectAddr0~15 向量地址0~15 寄存器。向量地址寄存器0-15 保存了16個向量IRQ slot 的中斷服務程序地址。

        VICVectCntl0~15 向量控制0~15 寄存器。向量控制寄存器0-15 分別控制16 個向量IRQ slot 中的一個。Slot0 優先級最高,而Slot15 優先級最低。在VICVectCntl 寄存器中禁止一個向量IRQ slot 不會禁止中斷本身,中斷只是變為非向量的形式。

        bit 5 1:向量IRQ 使能,當分配的中斷請求或軟件中斷使能,被分配為IRQ 并聲明時,可產生一個唯一的ISR 地址對應位的中斷請求使能并分配為FIQ并且聲明。

        bit 4:0 分配給此向量IRQ slot 的中斷請求或軟件中斷的編號。作為一個良好的編程習慣,不要將把相同的中斷編號分配給多于一個使能的向量IRQ slot。但如果這樣做了,當中斷請求或軟件中斷使能,被分配為IRQ 并聲明時,會使用最低編號的slot。

        VIC 將所有向量和非向量IRQ“相或”向ARM 處理器產生IRQ 信號。IRQ 服務程序可通過讀取VIC 的一個寄存器立即啟動并跳轉到相應地址。如果有任意一個向量IRQ 發出請求,VIC 則提供最高優先級請求IRQ 服務程序的地址,否則提供所默認程序的地址。該默認程序由所有非向量IRQ 共用。默認程序可讀取另一個VIC 寄存器以確定哪個IRQ被激活。

        筆者正在學習uCOS-II,移植到ARM時考慮到數據類型的定義,但對于Keil MDK編譯器的數據類型定義還是很模糊,主要就是區分不了short int、int、long 和long int占用多少字節。為了得到一個權威的答案,改用編譯器自身得出。

        一、先定義幾個變量,用于存放各數據類型的字節數。

        //#include

        #include

        unsigned char a,b,c,d,e,f,g;

        main()

        {

        a=sizeof(char);

        b=sizeof(short int);

        c=sizeof(int);

        d=sizeof(long);

        e=sizeof(long int);

        f=sizeof(float);

        g=sizeof(double);

        while(1);

        }

        二、查看各變量的存放地址。View---Symbols Window。

        三、查看各地址存放的值。View---memory Window。

        由上圖可知得出:

        char占用1個字節

        short int占用2字節

        int占用4字節

        long占用4字節

        long int占用4字節

        float占用4字節

        double占用8字節

        我們即可這樣定義宏:

        typedef unsigned char uint8; // 無符號8位整型變量

        typedef signed char int8; // 有符號8位整型變量

        typedef unsigned short uint16; // 無符號16位整型變量

        typedef signed short int16; // 有符號16位整型變量

        typedef unsigned int uint32; // 無符號32位整型變量

        typedef signed int int32; // 有符號32位整型變量

        typedef float fp32; // 單精度浮點數(32位長度)

        typedef double fp64; // 雙精度浮點數(64位長度)



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 邳州市| 勐海县| 济阳县| 肥东县| 聂拉木县| 襄垣县| 安塞县| 布尔津县| 禹州市| 图木舒克市| 英山县| 英德市| 浠水县| 阳春市| 靖安县| 婺源县| 建阳市| 报价| 望谟县| 汕尾市| 余江县| 昌图县| 乐山市| 宜春市| 会宁县| 宣恩县| 东光县| 广宁县| 博湖县| 南召县| 托克逊县| 遂昌县| 南岸区| 永昌县| 桃园市| 枣强县| 山阴县| 方山县| 东宁县| 宝山区| 沈阳市|