




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第6章章C語言和匯編語言程序混合編程語言和匯編語言程序混合編程方法及中斷處理方法方法及中斷處理方法6.1 C語言和匯編語言程序混合編程方法語言和匯編語言程序混合編程方法 數(shù)據(jù)類型 寄存器變量6.1.1 在在C語言中嵌入?yún)R編語言程序語言中嵌入?yún)R編語言程序在用在用C語言開發(fā)語言開發(fā)DSP應(yīng)用程序時(shí),需要對(duì)應(yīng)用程序時(shí),需要對(duì)DSP的底層的底層資源進(jìn)行操作的場(chǎng)合。資源進(jìn)行操作的場(chǎng)合。 用用C語言編寫相應(yīng)的代碼有一定的難度;語言編寫相應(yīng)的代碼有一定的難度; 某些操作某些操作C語言根本就無法實(shí)現(xiàn)(如對(duì)語言根本就無法實(shí)現(xiàn)(如對(duì)OVM、CNF等位的操作)。等位的操作)。在在C語言中嵌入單條匯編語句語言中嵌入
2、單條匯編語句asm(需要嵌入的匯編語句需要嵌入的匯編語句) / 系統(tǒng)初始化子程序系統(tǒng)初始化子程序 void initial( )asm( setcSXM);/ SXM位置位置1,抑制,抑制符號(hào)位擴(kuò)展符號(hào)位擴(kuò)展 asm( clrcOVM);/ OVM位清位清0,累,累加器中結(jié)果正常溢出加器中結(jié)果正常溢出 asm( clrcCNF);/ CNF位清位清0,B0被被配置為數(shù)據(jù)存儲(chǔ)空間配置為數(shù)據(jù)存儲(chǔ)空間 2. 訪問訪問I/O空間空間3. 訪問數(shù)據(jù)空間訪問數(shù)據(jù)空間預(yù)先定義如:預(yù)先定義如:volatile unsigned int *IMR=(volatile unsigned int *)0X0004;
3、volatile unsigned int *IFR=(volatile unsigned int *)0X0006;實(shí)例中:實(shí)例中: *IMR=0X0; *IFR=0X0FFFFH;4. 存儲(chǔ)器模式存儲(chǔ)器模式5. 系統(tǒng)堆棧系統(tǒng)堆棧6. 在在C語言中嵌入語言中嵌入實(shí)現(xiàn)某一完整功能的多條匯編語句實(shí)現(xiàn)某一完整功能的多條匯編語句把需要嵌入的多條匯編語句編制成一個(gè)子程序,并在把需要嵌入的多條匯編語句編制成一個(gè)子程序,并在其入口和出口處遵循其入口和出口處遵循C語言的調(diào)用規(guī)范進(jìn)行一些必要語言的調(diào)用規(guī)范進(jìn)行一些必要的操作,就可以方便地在的操作,就可以方便地在C語言中調(diào)用匯編語言程序語言中調(diào)用匯編語言程序 。
4、在在C語言中調(diào)用匯編語言程序編寫的子程序時(shí),應(yīng)特語言中調(diào)用匯編語言程序編寫的子程序時(shí),應(yīng)特別注意使用的堆棧不是別注意使用的堆棧不是DSP的硬件堆棧,而是的硬件堆棧,而是.CMD文件定義的軟堆棧。文件定義的軟堆棧。 (1)調(diào)用函數(shù)時(shí)堆棧的使用情況調(diào)用函數(shù)時(shí)堆棧的使用情況(2)C語言調(diào)用子程序的規(guī)范語言調(diào)用子程序的規(guī)范1)主程序的操作)主程序的操作 主程序把需要向子程序傳遞的參數(shù)按反序壓入堆主程序把需要向子程序傳遞的參數(shù)按反序壓入堆棧(最右邊的參數(shù)最先被壓入堆棧,最左邊的參數(shù)棧(最右邊的參數(shù)最先被壓入堆棧,最左邊的參數(shù)最后被壓入堆棧);最后被壓入堆棧); 主程序調(diào)用子程序;主程序調(diào)用子程序; 在子
5、程序返回前,在子程序返回前,ARP已設(shè)置為已設(shè)置為AR1; 當(dāng)子程序調(diào)用完畢后,主程序要彈出先前壓入堆當(dāng)子程序調(diào)用完畢后,主程序要彈出先前壓入堆棧的傳遞參數(shù)。棧的傳遞參數(shù)。操作語句:操作語句:SBRK n(n是主程序向子程序傳遞的參數(shù)的個(gè)數(shù))是主程序向子程序傳遞的參數(shù)的個(gè)數(shù))注意:注意:ARP已經(jīng)由編譯器自動(dòng)設(shè)置為已經(jīng)由編譯器自動(dòng)設(shè)置為AR1。 子程序的操作子程序的操作在子程序的入口處,假設(shè)在子程序的入口處,假設(shè)ARP已經(jīng)被設(shè)置為已經(jīng)被設(shè)置為AR1(由(由C編譯器自動(dòng)完成的)。編譯器自動(dòng)完成的)。 從硬件堆棧中彈出返回地址,再把它壓入軟件堆棧;從硬件堆棧中彈出返回地址,再把它壓入軟件堆棧; 將
6、主程序的數(shù)據(jù)結(jié)構(gòu)指針將主程序的數(shù)據(jù)結(jié)構(gòu)指針FP壓入堆棧;壓入堆棧; 若在子程序中要改變?nèi)粼谧映绦蛑幸淖傾R6或者或者AR7,需要把它們壓入,需要把它們壓入堆棧;堆棧; 分配局部數(shù)據(jù)結(jié)構(gòu);分配局部數(shù)據(jù)結(jié)構(gòu); 執(zhí)行子程序的實(shí)際任務(wù)代碼;執(zhí)行子程序的實(shí)際任務(wù)代碼; 如果子程序有返回值,則把此返回值放入累加器中;如果子程序有返回值,則把此返回值放入累加器中; 設(shè)置設(shè)置ARP為為AR1; 解除分配的局部數(shù)據(jù)結(jié)構(gòu);解除分配的局部數(shù)據(jù)結(jié)構(gòu); 如果保存了如果保存了AR6和和AR7,則從軟件堆棧恢復(fù)它們,則從軟件堆?;謴?fù)它們的值;的值; 從軟件堆?;謴?fù)從軟件堆?;謴?fù)FP; 把軟件堆棧中存儲(chǔ)的返回地址壓入硬件堆
7、棧;把軟件堆棧中存儲(chǔ)的返回地址壓入硬件堆棧; 返回。返回。說明說明如果是如果是C語言主程序調(diào)用語言主程序調(diào)用C語言子程序,則上面所述語言子程序,則上面所述的調(diào)用規(guī)范是的調(diào)用規(guī)范是C編譯器在生成匯編語言程序代碼時(shí)自編譯器在生成匯編語言程序代碼時(shí)自動(dòng)完成的;動(dòng)完成的;如果是如果是C語言主程序調(diào)用匯編語言程序編寫的子程序,語言主程序調(diào)用匯編語言程序編寫的子程序,則子程序的編寫必須遵循前述則子程序的編寫必須遵循前述“子程序需要進(jìn)行的操子程序需要進(jìn)行的操作作”規(guī)范,而規(guī)范,而“主函數(shù)需要進(jìn)行的操作主函數(shù)需要進(jìn)行的操作”則由則由C編譯編譯器自動(dòng)完成。器自動(dòng)完成。6.1.2 分開編寫分開編寫C語言和匯編語言
8、程序語言和匯編語言程序1分離的分離的C語言程序和匯編語言程序接口語言程序和匯編語言程序接口在編寫匯編語言程序時(shí)應(yīng)注意:在編寫匯編語言程序時(shí)應(yīng)注意: 必須遵守有關(guān)的調(diào)用規(guī)則和寄存器規(guī)則,這樣必須遵守有關(guān)的調(diào)用規(guī)則和寄存器規(guī)則,這樣不會(huì)影響不會(huì)影響C語言程序的運(yùn)行環(huán)境。語言程序的運(yùn)行環(huán)境。C語言程序既可以調(diào)用匯編語言程序,也可以訪語言程序既可以調(diào)用匯編語言程序,也可以訪問匯編語言程序中定義的變量。問匯編語言程序中定義的變量。I. 匯編語言程序也可以調(diào)用匯編語言程序也可以調(diào)用C語言函數(shù)或訪問語言函數(shù)或訪問C語語言程序中定義的變量。言程序中定義的變量。 2在在C語言程序中訪問匯編語言程序的變量語言程序
9、中訪問匯編語言程序的變量根據(jù)變量或常數(shù)定義的方式,可用以下根據(jù)變量或常數(shù)定義的方式,可用以下3種方法來實(shí)種方法來實(shí)現(xiàn)這種操作。現(xiàn)這種操作。(1)匯編變量在)匯編變量在.bss段中定義。段中定義。訪問在訪問在.bss中定義的變量按以下步驟可進(jìn)行正常訪問:中定義的變量按以下步驟可進(jìn)行正常訪問: 采用采用.bss命令定義變量;命令定義變量; 采用采用.global命令定義變量;命令定義變量; 在變量名前加一下劃線在變量名前加一下劃線“_”; 在在C語言程序中將變量說明為外部變量。語言程序中將變量說明為外部變量。 (2)變量不在)變量不在.bss段中定義。段中定義。訪問不在訪問不在.bss中定義的變量
10、按以下步驟可進(jìn)行正常訪中定義的變量按以下步驟可進(jìn)行正常訪問:?jiǎn)枺海?)用)用.set和和.global命令定義全局常數(shù)。命令定義全局常數(shù)。從從C語言程序中訪問在匯編語言程序中用語言程序中訪問在匯編語言程序中用.set和和.global命令定義的常數(shù),按以下步驟可進(jìn)行正常訪問:命令定義的常數(shù),按以下步驟可進(jìn)行正常訪問: 在匯編語言程序中將常數(shù)(符號(hào))定義為全局常數(shù);在匯編語言程序中將常數(shù)(符號(hào))定義為全局常數(shù);C語言程序中訪問匯編語言程序中的常數(shù)時(shí),應(yīng)在語言程序中訪問匯編語言程序中的常數(shù)時(shí),應(yīng)在常數(shù)名之前加一個(gè)地址操作符常數(shù)名之前加一個(gè)地址操作符“&”。3在匯編語言程序中訪問在匯編語言程
11、序中訪問C語言程序變量語言程序變量從匯編語言程序中訪問從匯編語言程序中訪問C語言程序變量按以下步語言程序變量按以下步驟可進(jìn)行正常訪問:驟可進(jìn)行正常訪問: 在在C語言程序中定義變量(如語言程序中定義變量(如 x););在匯編語言程序中使用時(shí)前面加下劃線在匯編語言程序中使用時(shí)前面加下劃線“_”。(如(如_x)。)。6.2 用用C語言處理語言處理DSP中斷中斷F240X內(nèi)核提供了一個(gè)不可屏蔽的中斷內(nèi)核提供了一個(gè)不可屏蔽的中斷NMI和和6個(gè)按個(gè)按優(yōu)先級(jí)獲得服務(wù)的可屏蔽中斷優(yōu)先級(jí)獲得服務(wù)的可屏蔽中斷INT1INT6。F240X系列系列DSP通過中斷系統(tǒng)中的一個(gè)兩級(jí)中斷來擴(kuò)通過中斷系統(tǒng)中的一個(gè)兩級(jí)中斷來擴(kuò)
12、展系統(tǒng)可響應(yīng)的中斷個(gè)數(shù)。展系統(tǒng)可響應(yīng)的中斷個(gè)數(shù)。DSP的中斷請(qǐng)求的中斷請(qǐng)求/應(yīng)答硬件邏輯和中斷服務(wù)程序軟件應(yīng)答硬件邏輯和中斷服務(wù)程序軟件是一個(gè)兩級(jí)的層次結(jié)構(gòu)。是一個(gè)兩級(jí)的層次結(jié)構(gòu)。如果一個(gè)引起中斷的外設(shè)事件發(fā)生且相應(yīng)的中斷使能如果一個(gè)引起中斷的外設(shè)事件發(fā)生且相應(yīng)的中斷使能位被置位被置1,則會(huì)產(chǎn)生一個(gè)從外設(shè)到中斷控制器的中斷,則會(huì)產(chǎn)生一個(gè)從外設(shè)到中斷控制器的中斷請(qǐng)求。請(qǐng)求。從幾個(gè)外設(shè)來的外設(shè)中斷請(qǐng)求(從幾個(gè)外設(shè)來的外設(shè)中斷請(qǐng)求(PIRQ)在中斷控制)在中斷控制器處器處“或或”產(chǎn)生一個(gè)到產(chǎn)生一個(gè)到CPU的中斷請(qǐng)求(的中斷請(qǐng)求(INTn)。)。如果一個(gè)外設(shè)中斷請(qǐng)求如果一個(gè)外設(shè)中斷請(qǐng)求PIRQ在在CP
13、U對(duì)對(duì)INTn應(yīng)答后的應(yīng)答后的一個(gè)周期內(nèi)仍然有效時(shí),則另一個(gè)中斷請(qǐng)求脈沖一個(gè)周期內(nèi)仍然有效時(shí),則另一個(gè)中斷請(qǐng)求脈沖INTn也會(huì)產(chǎn)生。也會(huì)產(chǎn)生。而而CPU總是響應(yīng)優(yōu)先級(jí)高的外設(shè)中斷請(qǐng)求??偸琼憫?yīng)優(yōu)先級(jí)高的外設(shè)中斷請(qǐng)求。 CPU應(yīng)答外設(shè)中斷時(shí),從應(yīng)答外設(shè)中斷時(shí),從PIVR寄存器中讀取相應(yīng)中寄存器中讀取相應(yīng)中斷的向量,并產(chǎn)生一個(gè)轉(zhuǎn)到該中斷服務(wù)子程序入口的斷的向量,并產(chǎn)生一個(gè)轉(zhuǎn)到該中斷服務(wù)子程序入口的向量。向量。 用用C語言實(shí)現(xiàn)可屏蔽中斷程序的兩種方法語言實(shí)現(xiàn)可屏蔽中斷程序的兩種方法 : 通過軟件識(shí)別中斷標(biāo)志的方法。通過軟件識(shí)別中斷標(biāo)志的方法。優(yōu)點(diǎn):實(shí)現(xiàn)中斷程序代碼少、易于理解。優(yōu)點(diǎn):實(shí)現(xiàn)中斷程序代碼
14、少、易于理解。 2. 通過外圍中斷向量寄存器通過外圍中斷向量寄存器PIVR的值識(shí)別中斷。的值識(shí)別中斷。實(shí)現(xiàn):用實(shí)現(xiàn):用C語言中的語言中的SWITCH在中斷服務(wù)程序,在中在中斷服務(wù)程序,在中斷程序入口處,根據(jù)斷程序入口處,根據(jù)PIVR的值來判斷發(fā)生的中斷是的值來判斷發(fā)生的中斷是否為需要的中斷。否為需要的中斷。 例例1:用軟件識(shí)別中斷標(biāo)志的方法實(shí)現(xiàn)捕捉單元:用軟件識(shí)別中斷標(biāo)志的方法實(shí)現(xiàn)捕捉單元4的中的中斷(斷(CAP4INT)。)。1. 建立一個(gè)復(fù)位和中斷向量文件建立一個(gè)復(fù)位和中斷向量文件vectors.asm:.titlevectors.asm.ref_c_int0,_nothing,_capi
15、nt ;定義符號(hào);定義符號(hào).sect.vectorsreset:b _c_int0 ;復(fù)位向量;復(fù)位向量 INT1:b _nothingINT2: b _nothingINT3:b _nothingINT4:b _capint;當(dāng)發(fā)生;當(dāng)發(fā)生int4中斷時(shí),中斷時(shí),程序跳轉(zhuǎn)至程序跳轉(zhuǎn)至“capint”所標(biāo)志的中斷服務(wù)程序。所標(biāo)志的中斷服務(wù)程序。INT5:b _nothingINT6:b _nothing ;當(dāng)發(fā)生其它級(jí)別的;當(dāng)發(fā)生其它級(jí)別的中斷時(shí),直接跳轉(zhuǎn)至中斷時(shí),直接跳轉(zhuǎn)至nothing所標(biāo)志的中斷服務(wù)程序所標(biāo)志的中斷服務(wù)程序 2. 中斷源辨別中斷源辨別 當(dāng) 發(fā) 生當(dāng) 發(fā) 生 C A P 4
16、 I N T 時(shí) , 其 相 應(yīng) 的 中 斷 標(biāo) 志 位時(shí) , 其 相 應(yīng) 的 中 斷 標(biāo) 志 位(EVBIFRC最低位)置最低位)置1。在在capint標(biāo)號(hào)的中斷服務(wù)程序?qū)χ袛嘣磁袛啵簶?biāo)號(hào)的中斷服務(wù)程序?qū)χ袛嘣磁袛啵喝羧鬍VBIFRC的最低位為的最低位為1,則執(zhí)行后面的中斷服務(wù)程,則執(zhí)行后面的中斷服務(wù)程序;序;若若EVBIFRC的最低位為的最低位為0,表明沒有發(fā)生,表明沒有發(fā)生CAP4INT中中斷,則中斷直接返回(或跳到與該中斷標(biāo)志相對(duì)應(yīng)的斷,則中斷直接返回(或跳到與該中斷標(biāo)志相對(duì)應(yīng)的中斷服務(wù)程序)。中斷服務(wù)程序)。/ CAPINT4中斷服務(wù)程序中斷服務(wù)程序 void interrupt c
17、apint() int flag; flag=EVBIFRC&0X01; / 判斷是否是判斷是否是CAP4中斷中斷 if(flag!=0 x01) asm( clrc INTM); / 返回前開中斷返回前開中斷 return;/ 如果不是如果不是CAP4中斷,則直接返中斷,則直接返回回 ;/ 如果是如果是CAP4中斷,則執(zhí)行響應(yīng)中斷,則執(zhí)行響應(yīng)的中斷操作的中斷操作 EVBIFRC=EVBIFRC|0 x01;/ 寫寫1清除清除CAP4中斷標(biāo)志中斷標(biāo)志 asm( clrc INTM);/ 返回前開中斷返回前開中斷 return;/ 中斷返回中斷返回 例例2:用外設(shè)中斷向量寄存器:用外設(shè)中
18、斷向量寄存器PIVR的值識(shí)別中斷的方的值識(shí)別中斷的方法,來實(shí)現(xiàn)法,來實(shí)現(xiàn)CAP4INT 。當(dāng)某一個(gè)外設(shè)中斷發(fā)生時(shí),當(dāng)某一個(gè)外設(shè)中斷發(fā)生時(shí),CPU就會(huì)把相應(yīng)的中斷就會(huì)把相應(yīng)的中斷向量裝載到外設(shè)中斷向量寄存器向量裝載到外設(shè)中斷向量寄存器PIVR中,并且每一中,并且每一個(gè)中斷向量和各個(gè)外設(shè)中斷一一對(duì)應(yīng)。個(gè)中斷向量和各個(gè)外設(shè)中斷一一對(duì)應(yīng)。 CAP4INT:PIVR=0X0036/ 中斷服務(wù)子程序中斷服務(wù)子程序 void interrupt capint() switch(*PIVR) case 0 x0036: 。 /用戶程序用戶程序 EVBIFRC=EVBIFRC|0 x01;/ 寫寫1清除清除CAP4中斷標(biāo)志中斷標(biāo)志 break;/ 如果是如果是CAP4中斷,則執(zhí)行響應(yīng)的中斷服務(wù)程序代碼中斷,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 屏幕維保方案(3篇)
- 裝修客戶維系方案(3篇)
- 軟件實(shí)施方案(3篇)
- DB23-T2969-2021-寒地蘋果套種草莓栽培技術(shù)規(guī)程-黑龍江省
- DB23-T2844-2021-電子政務(wù)云平臺(tái)安全管理規(guī)范-黑龍江省
- 公司崗變薪變管理制度
- 古茗企業(yè)成本管理制度
- 制鞋工廠日常管理制度
- 加盟方案保密協(xié)議(3篇)
- 勘探公司安全管理制度
- 2024年江蘇省昆山市事業(yè)單位公開招聘教師崗考試題帶答案分析
- 2025年無人機(jī)操控師考試試題及答案
- 2025年蘇州市中考英語二模模擬試題(六)(含解析)
- 第六單元不規(guī)則或組合圖形的周長“拓展型”專項(xiàng)練習(xí)-五年級(jí)數(shù)學(xué)下冊(cè)典型例題(原卷版)蘇教版
- 2025年中考物理答題技巧與模式專題08壓強(qiáng)與浮力的常考難點(diǎn)綜合計(jì)算(學(xué)生版+解析)
- 2025年中考化學(xué)模擬考試試卷附帶答案
- 2025年六五環(huán)境日生態(tài)環(huán)保常識(shí)及法律知識(shí)有獎(jiǎng)競(jìng)答題庫及答案(共90題)
- 上海市社區(qū)工作者管理辦法
- 湖南師范大學(xué)學(xué)位英語歷年考試真題
- 初中物理公式總結(jié)
- NLP神經(jīng)語言學(xué)培訓(xùn)課件(PPT 164頁)
評(píng)論
0/150
提交評(píng)論