新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Codewarrior for HCS12的中斷服務(wù)程序編寫說(shuō)明

        Codewarrior for HCS12的中斷服務(wù)程序編寫說(shuō)明

        作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏

        在CW4.6環(huán)境下,中斷編程主要有兩種方式:

        第一種是使用“interrupt”關(guān)鍵字,“interrupt”關(guān)鍵字是一個(gè)非標(biāo)準(zhǔn)ANSI-C的關(guān)鍵字,因此,它不能被所有ANSI-C編譯器廠商所支持。同樣,對(duì)不同的編譯器,interrupt”關(guān)鍵字的用法可能會(huì)改變。“interrupt”關(guān)鍵字同樣會(huì)提示編譯器下面的函數(shù)是一個(gè)中斷服務(wù)例程。
        例: void interrupt 20 SCI0_ISR(void);
        其中,interrupt表示該函數(shù)為終端服務(wù)程序,后面的20表示中斷號(hào)20,在這里SCI0的中斷向量號(hào)就是20.
        這種方法寫起來(lái)非常簡(jiǎn)單,但是,在S12單片機(jī)實(shí)際使用中,中斷號(hào)并沒(méi)有在手冊(cè)中給出,通常需要自己在中斷向量表中從上往下數(shù)出來(lái),或者根據(jù)中斷向量計(jì)算得到,很容易出錯(cuò)。
        于是有了第二種方法:
        在ISR程序之前,使用符號(hào)“#pragma TRAP_PROC”,TRAP_PROC 提示編譯器下面的函數(shù)是中斷服務(wù)例程。編譯器會(huì)用一個(gè)特殊的中斷返回指令來(lái)結(jié)束這個(gè)函數(shù)。
        此時(shí),中斷函數(shù)的書寫如下所示:
        #pragma TRAP_PROC
        void SCI0_ISR(void){
        ...
        }
        這時(shí)候編譯器不知道這個(gè)ISR指向那個(gè)中斷向量,我們需要在鏈接文件即:prm文件中指定之。
        使用 VECTOR命令來(lái)實(shí)現(xiàn)中斷向量與ISR程序的連接。
        例:
        VECTOR 0 _Startup//這是系統(tǒng)默認(rèn)prm文件中自帶的,即復(fù)位后0號(hào)中斷即復(fù)位中斷的ISR為_Startup()
        我們可以這樣寫:
        VECTOR 20 SCI0_ISR //指定中斷號(hào)
        或者
        VECTOR ADDRESS 0xFFD6 SCI0_ISR //直接指定中斷向量地址
        注:使用#pragma TRAP_PROC與修改prm文件的方法,在中斷服務(wù)子程序的結(jié)尾處必須要手動(dòng)加入返回主程序的指令,包括取出堆棧、中斷返回兩個(gè)步驟。
        在S12單片機(jī)中,可以寫作
        asm {
        pula;
        rti;
        }
        尾注:
        兩種方法所寫的中斷服務(wù)子程序必須被放在非分頁(yè)存儲(chǔ)區(qū)內(nèi),即non_blanked code seg.
        其中一種常用的方法是在服務(wù)子程序前聲明:
        //下面代碼放在NON_BANKED區(qū)
        #pragma CODE_SEG NON_BANKED
        在中斷程序后聲明:
        //下面內(nèi)容按默認(rèn)放置
        #pragma CODE_SEG DEFAULT



        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 江永县| 苍山县| 沙雅县| 慈利县| 门源| 上林县| 古田县| 开封县| 定结县| 资阳市| 库伦旗| 巴中市| 麟游县| 永胜县| 凤山县| 水富县| 榕江县| 邵阳县| 大连市| 湘西| 旬邑县| 新昌县| 乐亭县| 洱源县| 镇康县| 太和县| 盐池县| 富阳市| 策勒县| 莱阳市| 天水市| 浦县| 邯郸市| 兴化市| 双峰县| 兴宁市| 福贡县| 留坝县| 德令哈市| 西青区| 鲜城|