微型計(jì)算機(jī)技術(shù)與匯編語(yǔ)言程序設(shè)計(jì):第6章 C語(yǔ)言和匯編語(yǔ)言混合編程方法和C語(yǔ)言中斷處理方法_第1頁(yè)
微型計(jì)算機(jī)技術(shù)與匯編語(yǔ)言程序設(shè)計(jì):第6章 C語(yǔ)言和匯編語(yǔ)言混合編程方法和C語(yǔ)言中斷處理方法_第2頁(yè)
微型計(jì)算機(jī)技術(shù)與匯編語(yǔ)言程序設(shè)計(jì):第6章 C語(yǔ)言和匯編語(yǔ)言混合編程方法和C語(yǔ)言中斷處理方法_第3頁(yè)
微型計(jì)算機(jī)技術(shù)與匯編語(yǔ)言程序設(shè)計(jì):第6章 C語(yǔ)言和匯編語(yǔ)言混合編程方法和C語(yǔ)言中斷處理方法_第4頁(yè)
微型計(jì)算機(jī)技術(shù)與匯編語(yǔ)言程序設(shè)計(jì):第6章 C語(yǔ)言和匯編語(yǔ)言混合編程方法和C語(yǔ)言中斷處理方法_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第6章C語(yǔ)言和匯編語(yǔ)言程序混合編程方法及中斷處理方法6.1 C語(yǔ)言和匯編語(yǔ)言程序混合編程方法數(shù)據(jù)類(lèi)型寄存器變量6.1.1 在C語(yǔ)言中嵌入?yún)R編語(yǔ)言程序在用C語(yǔ)言開(kāi)發(fā)DSP應(yīng)用程序時(shí),需要對(duì)DSP的底層資源進(jìn)行操作的場(chǎng)合。 用C語(yǔ)言編寫(xiě)相應(yīng)的代碼有一定的難度; 某些操作C語(yǔ)言根本就無(wú)法實(shí)現(xiàn)(如對(duì)OVM、CNF等位的操作)。在C語(yǔ)言中嵌入單條匯編語(yǔ)句asm(需要嵌入的匯編語(yǔ)句) / 系統(tǒng)初始化子程序 void initial( )asm( setcSXM);/ SXM位置1,抑制符號(hào)位擴(kuò)展 asm( clrcOVM);/ OVM位清0,累加器中結(jié)果正常溢出 asm( clrcCNF);/ CNF位清

2、0,B0被配置為數(shù)據(jù)存儲(chǔ)空間 2. 訪問(wèn)I/O空間3. 訪問(wèn)數(shù)據(jù)空間預(yù)先定義如:volatile unsigned int *IMR=(volatile unsigned int *)0X0004;volatile unsigned int *IFR=(volatile unsigned int *)0X0006;實(shí)例中: *IMR=0X0; *IFR=0X0FFFFH;4. 存儲(chǔ)器模式5. 系統(tǒng)堆棧6. 在C語(yǔ)言中嵌入實(shí)現(xiàn)某一完整功能的多條匯編語(yǔ)句把需要嵌入的多條匯編語(yǔ)句編制成一個(gè)子程序,并在其入口和出口處遵循C語(yǔ)言的調(diào)用規(guī)范進(jìn)行一些必要的操作,就可以方便地在C語(yǔ)言中調(diào)用匯編語(yǔ)言程序 。在C

3、語(yǔ)言中調(diào)用匯編語(yǔ)言程序編寫(xiě)的子程序時(shí),應(yīng)特別注意使用的堆棧不是DSP的硬件堆棧,而是.CMD文件定義的軟堆棧。 (1)調(diào)用函數(shù)時(shí)堆棧的使用情況(2)C語(yǔ)言調(diào)用子程序的規(guī)范1)主程序的操作 主程序把需要向子程序傳遞的參數(shù)按反序壓入堆棧(最右邊的參數(shù)最先被壓入堆棧,最左邊的參數(shù)最后被壓入堆棧); 主程序調(diào)用子程序; 在子程序返回前,ARP已設(shè)置為AR1; 當(dāng)子程序調(diào)用完畢后,主程序要彈出先前壓入堆棧的傳遞參數(shù)。操作語(yǔ)句:SBRK n(n是主程序向子程序傳遞的參數(shù)的個(gè)數(shù))注意:ARP已經(jīng)由編譯器自動(dòng)設(shè)置為AR1。 子程序的操作在子程序的入口處,假設(shè)ARP已經(jīng)被設(shè)置為AR1(由C編譯器自動(dòng)完成的)。

4、從硬件堆棧中彈出返回地址,再把它壓入軟件堆棧; 將主程序的數(shù)據(jù)結(jié)構(gòu)指針FP壓入堆棧; 若在子程序中要改變AR6或者AR7,需要把它們壓入堆棧; 分配局部數(shù)據(jù)結(jié)構(gòu); 執(zhí)行子程序的實(shí)際任務(wù)代碼; 如果子程序有返回值,則把此返回值放入累加器中; 設(shè)置ARP為AR1; 解除分配的局部數(shù)據(jù)結(jié)構(gòu); 如果保存了AR6和AR7,則從軟件堆?;謴?fù)它們的值; 從軟件堆?;謴?fù)FP; 把軟件堆棧中存儲(chǔ)的返回地址壓入硬件堆棧; 返回。說(shuō)明如果是C語(yǔ)言主程序調(diào)用C語(yǔ)言子程序,則上面所述的調(diào)用規(guī)范是C編譯器在生成匯編語(yǔ)言程序代碼時(shí)自動(dòng)完成的;如果是C語(yǔ)言主程序調(diào)用匯編語(yǔ)言程序編寫(xiě)的子程序,則子程序的編寫(xiě)必須遵循前述“子程序

5、需要進(jìn)行的操作”規(guī)范,而“主函數(shù)需要進(jìn)行的操作”則由C編譯器自動(dòng)完成。6.1.2 分開(kāi)編寫(xiě)C語(yǔ)言和匯編語(yǔ)言程序1分離的C語(yǔ)言程序和匯編語(yǔ)言程序接口在編寫(xiě)匯編語(yǔ)言程序時(shí)應(yīng)注意: 必須遵守有關(guān)的調(diào)用規(guī)則和寄存器規(guī)則,這樣不會(huì)影響C語(yǔ)言程序的運(yùn)行環(huán)境。C語(yǔ)言程序既可以調(diào)用匯編語(yǔ)言程序,也可以訪問(wèn)匯編語(yǔ)言程序中定義的變量。匯編語(yǔ)言程序也可以調(diào)用C語(yǔ)言函數(shù)或訪問(wèn)C語(yǔ)言程序中定義的變量。 2在C語(yǔ)言程序中訪問(wèn)匯編語(yǔ)言程序的變量根據(jù)變量或常數(shù)定義的方式,可用以下3種方法來(lái)實(shí)現(xiàn)這種操作。(1)匯編變量在.bss段中定義。訪問(wèn)在.bss中定義的變量按以下步驟可進(jìn)行正常訪問(wèn): 采用.bss命令定義變量; 采用.g

6、lobal命令定義變量; 在變量名前加一下劃線“_”; 在C語(yǔ)言程序中將變量說(shuō)明為外部變量。 (2)變量不在.bss段中定義。訪問(wèn)不在.bss中定義的變量按以下步驟可進(jìn)行正常訪問(wèn):(3)用.set和.global命令定義全局常數(shù)。從C語(yǔ)言程序中訪問(wèn)在匯編語(yǔ)言程序中用.set和.global命令定義的常數(shù),按以下步驟可進(jìn)行正常訪問(wèn):在匯編語(yǔ)言程序中將常數(shù)(符號(hào))定義為全局常數(shù);C語(yǔ)言程序中訪問(wèn)匯編語(yǔ)言程序中的常數(shù)時(shí),應(yīng)在常數(shù)名之前加一個(gè)地址操作符“&”。3在匯編語(yǔ)言程序中訪問(wèn)C語(yǔ)言程序變量從匯編語(yǔ)言程序中訪問(wèn)C語(yǔ)言程序變量按以下步驟可進(jìn)行正常訪問(wèn):在C語(yǔ)言程序中定義變量(如 x);在匯編語(yǔ)言程序

7、中使用時(shí)前面加下劃線“_”。(如_x)。6.2 用C語(yǔ)言處理DSP中斷F240X內(nèi)核提供了一個(gè)不可屏蔽的中斷NMI和6個(gè)按優(yōu)先級(jí)獲得服務(wù)的可屏蔽中斷INT1INT6。F240X系列DSP通過(guò)中斷系統(tǒng)中的一個(gè)兩級(jí)中斷來(lái)擴(kuò)展系統(tǒng)可響應(yīng)的中斷個(gè)數(shù)。DSP的中斷請(qǐng)求/應(yīng)答硬件邏輯和中斷服務(wù)程序軟件是一個(gè)兩級(jí)的層次結(jié)構(gòu)。如果一個(gè)引起中斷的外設(shè)事件發(fā)生且相應(yīng)的中斷使能位被置1,則會(huì)產(chǎn)生一個(gè)從外設(shè)到中斷控制器的中斷請(qǐng)求。從幾個(gè)外設(shè)來(lái)的外設(shè)中斷請(qǐng)求(PIRQ)在中斷控制器處“或”產(chǎn)生一個(gè)到CPU的中斷請(qǐng)求(INTn)。如果一個(gè)外設(shè)中斷請(qǐng)求PIRQ在CPU對(duì)INTn應(yīng)答后的一個(gè)周期內(nèi)仍然有效時(shí),則另一個(gè)中斷請(qǐng)求

8、脈沖INTn也會(huì)產(chǎn)生。而CPU總是響應(yīng)優(yōu)先級(jí)高的外設(shè)中斷請(qǐng)求。 CPU應(yīng)答外設(shè)中斷時(shí),從PIVR寄存器中讀取相應(yīng)中斷的向量,并產(chǎn)生一個(gè)轉(zhuǎn)到該中斷服務(wù)子程序入口的向量。 用C語(yǔ)言實(shí)現(xiàn)可屏蔽中斷程序的兩種方法 :通過(guò)軟件識(shí)別中斷標(biāo)志的方法。優(yōu)點(diǎn):實(shí)現(xiàn)中斷程序代碼少、易于理解。 2. 通過(guò)外圍中斷向量寄存器PIVR的值識(shí)別中斷。實(shí)現(xiàn):用C語(yǔ)言中的SWITCH在中斷服務(wù)程序,在中斷程序入口處,根據(jù)PIVR的值來(lái)判斷發(fā)生的中斷是否為需要的中斷。 例1:用軟件識(shí)別中斷標(biāo)志的方法實(shí)現(xiàn)捕捉單元4的中斷(CAP4INT)。1. 建立一個(gè)復(fù)位和中斷向量文件vectors.asm:.titlevectors.asm

9、.ref_c_int0,_nothing,_capint ;定義符號(hào).sect.vectorsreset:b _c_int0 ;復(fù)位向量 INT1:b _nothingINT2: b _nothingINT3:b _nothingINT4:b _capint;當(dāng)發(fā)生int4中斷時(shí),程序跳轉(zhuǎn)至“capint”所標(biāo)志的中斷服務(wù)程序。INT5:b _nothingINT6:b _nothing ;當(dāng)發(fā)生其它級(jí)別的中斷時(shí),直接跳轉(zhuǎn)至nothing所標(biāo)志的中斷服務(wù)程序 2. 中斷源辨別 當(dāng)發(fā)生CAP4INT時(shí),其相應(yīng)的中斷標(biāo)志位(EVBIFRC最低位)置1。在capint標(biāo)號(hào)的中斷服務(wù)程序?qū)χ袛嘣磁袛啵?/p>

10、若EVBIFRC的最低位為1,則執(zhí)行后面的中斷服務(wù)程序;若EVBIFRC的最低位為0,表明沒(méi)有發(fā)生CAP4INT中斷,則中斷直接返回(或跳到與該中斷標(biāo)志相對(duì)應(yīng)的中斷服務(wù)程序)。/ CAPINT4中斷服務(wù)程序 void interrupt capint() int flag; flag=EVBIFRC&0X01;/ 判斷是否是CAP4中斷 if(flag!=0 x01) asm( clrc INTM);/ 返回前開(kāi)中斷 return;/ 如果不是CAP4中斷,則直接返回 ;/ 如果是CAP4中斷,則執(zhí)行響應(yīng)的中斷操作 EVBIFRC=EVBIFRC|0 x01;/ 寫(xiě)1清除CAP4中斷標(biāo)志 as

11、m( clrc INTM);/ 返回前開(kāi)中斷 return;/ 中斷返回 例2:用外設(shè)中斷向量寄存器PIVR的值識(shí)別中斷的方法,來(lái)實(shí)現(xiàn)CAP4INT 。當(dāng)某一個(gè)外設(shè)中斷發(fā)生時(shí),CPU就會(huì)把相應(yīng)的中斷向量裝載到外設(shè)中斷向量寄存器PIVR中,并且每一個(gè)中斷向量和各個(gè)外設(shè)中斷一一對(duì)應(yīng)。 CAP4INT:PIVR=0X0036/ 中斷服務(wù)子程序 void interrupt capint() switch(*PIVR) case 0 x0036: 。 /用戶程序 EVBIFRC=EVBIFRC|0 x01;/ 寫(xiě)1清除CAP4中斷標(biāo)志 break;/ 如果是CAP4中斷,則執(zhí)行響應(yīng)的中斷服務(wù)程序代碼 case 0 x0040: /其他的中斷 。 /用戶程序 br

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論