新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 不同編譯器中斷函數(shù)的表示方法

        不同編譯器中斷函數(shù)的表示方法

        作者: 時(shí)間:2016-11-13 來(lái)源:網(wǎng)絡(luò) 收藏
        1.keil對(duì)51單片機(jī)中斷函數(shù)表示:

        void 函數(shù)名() interrupt n using n
        {
        …….
        }

        其中函數(shù)名可以任意取,關(guān)鍵字interrupt用來(lái)指明這是一個(gè)中斷服務(wù)函數(shù),后面的n表示中斷號(hào),關(guān)鍵字using加后面的n表示使用哪一組寄存器。

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

        2.GCC for AVR,對(duì)于中斷函數(shù)支持兩種關(guān)鍵字ISR與SIGNAL,其格式如下:
        ISR(vect)
        {
        ………
        }

        SIGNAL(vect)
        {
        ……..
        }
        其中的vect就是中斷向量名,根據(jù)不同的型號(hào)的AVR單片機(jī)的不同的中斷源都會(huì)有相對(duì)應(yīng)的中斷向量名,比如外部中斷0對(duì)于ISR格式的中斷向量名為INT0_vect,對(duì)SIGNAL則為SIG_INTERRUPT0。

        3.IAR C430 for MSP430

        interrupt [vect] void 函數(shù)名(void)
        {
        …….
        }
        其中vect也是中斷向量名,函數(shù)名可以任取。

        4.IAR for AVR

        在IAR編譯器里用關(guān)鍵字來(lái)__interrupt來(lái)定義一個(gè)中斷函數(shù)。用#pragma vector來(lái)提供中斷函數(shù)的入口地址
        #pragma vector=0x12//定時(shí)器0溢出中斷入口地址
        __interrupt void time0(void)
        {
        ;
        }
        上面的入口地址寫成#pragma vector=TIMER0_OVF_vect更直觀,每種中斷的入口地址在頭文件里有描述。函數(shù)名稱time0可以為任意名稱。中斷函數(shù)會(huì)自動(dòng)保護(hù)局部變量,但不會(huì)保護(hù)全局變量

        在IAR for SAMSUNG s3c9234中中斷函數(shù)只有一個(gè)入口0x00,中斷的優(yōu)先級(jí)有軟件來(lái)定。
        #pragma vector=0x00
        __interruptvoid itp(void)
        {
        if(MARCO_READ_TIMER_PEND) //讀相應(yīng)中斷標(biāo)志位
        {
        MARCO_CLEAR_TIMER_PEND;//清相應(yīng)的中斷標(biāo)志位
        .....
        }
        if(MARCO_READ_WATCHTIMER_PEND)
        {
        MARCO_CLEAR_WATCHTIMER_PEND;

        .....
        }

        .....

        }
        5.ICC for AVR

        #pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF
        void timer0_ovf_isr(void)
        {
        TCNT0 = 0x00 /*INVALID SETTING*/; //reload counter value
        }

        6.AVR GCC for AVR

        由于C語(yǔ)言設(shè)計(jì)目標(biāo)為硬件無(wú)關(guān),因此各種編譯器在處理中斷時(shí)使用的方法都是編譯器設(shè)計(jì)者自己的方法。
        在AVR-GCC環(huán)境里,向量表已經(jīng)預(yù)先定義,并指向具有預(yù)定義名稱的中斷例程。通過(guò)使用合適的名稱,用戶例程就可以由相應(yīng)的中斷所調(diào)用。如果用戶沒(méi)有定義自己的中斷例程,則器件庫(kù)的缺省例程被加入。
        除了中斷向量表的問(wèn)題,編譯器還必須處理相關(guān)寄存器保護(hù)的問(wèn)題。中斷API解決了細(xì)節(jié)問(wèn)題。用戶只要將中斷例程定義為INTERRUPT()或SIGAL()即可。而對(duì)于用戶沒(méi)有定義的中斷,缺省例程的處理是reti指令。
        函數(shù)定義可參見(jiàn)interrupt.h,中斷信號(hào)符號(hào)表參見(jiàn)sig-avr.h。
        6.1 cli
        用法:void cli(void);
        說(shuō)明:通過(guò)置位全局中斷屏蔽位來(lái)禁止中斷。其編譯結(jié)果僅為一條匯編指令
        6.2 enable_external_int
        用法:void enable_external_int(uint8_t ints);
        說(shuō)明:此函數(shù)訪問(wèn)GIMSK寄存器(對(duì)于MEGA器件則是EIMSK寄存器)。功能與宏outp()一樣。
        6.3 INTERRUPT
        用法:INTERRUPT(signame)
        說(shuō)明:定義中斷源signame對(duì)應(yīng)的中斷例程。在執(zhí)行時(shí),全局屏蔽位將清零,其他中斷被使能。ADC結(jié)束中斷例程的例子如下所示:
        INTERRUPT(SIG_ADC)
        {
        }
        6.4 sei
        用法:void sei(void);
        說(shuō)明:通過(guò)清零全局中斷屏蔽位來(lái)使能中斷。其編譯結(jié)果僅為一條匯編指令。
        6.5 SIGNAL
        用法:SIGNAL(signame)
        說(shuō)明:定義中斷源signame對(duì)應(yīng)的中斷例程。在執(zhí)行時(shí),全局屏蔽位保持置位,其他中斷被禁止。ADC結(jié)束中斷例程的例子如下所示:
        SIGNAL(SIG_ADC)
        {
        }
        6.6 timer_enable_int
        用法:void timer_enable_int(uint8_t ints);
        說(shuō)明:此函數(shù)操作TIMSK寄存器。也可以通過(guò)outp()來(lái)設(shè)置。



        關(guān)鍵詞: 編譯器中斷函

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 曲靖市| 永清县| 仁化县| 沙田区| 大关县| 波密县| 巴彦县| 锡林浩特市| 中宁县| 保定市| 鄂伦春自治旗| 绥江县| 石屏县| 综艺| 昌宁县| 保定市| 区。| 泽库县| 徐闻县| 晋江市| 姜堰市| 沙田区| 府谷县| 云霄县| 长岛县| 育儿| 利川市| 新沂市| 广西| 鄂伦春自治旗| 海兴县| 青阳县| 通化市| 林州市| 柏乡县| 临海市| 沅陵县| 台中县| 新宾| 饶河县| 巴林左旗|