KEIL C51的#pragma NOIV
#pragma NOIV
它的注釋是,不產(chǎn)生中斷向量。查找C51手冊,說明如下:
NOINTVECTOR Compiler Directive
Abbreviation | NOIV 本文引用地址:http://www.butianyuan.cn/article/201611/320372.htm |
Arguments | None. |
Default | INTVECTOR (0) |
µVision | Options — |
Description | The |
See Also | INTERVAL, |
Example | C51 #pragma noiv |
它的意思是,不產(chǎn)生8051缺省的中斷向量。對68013A來說,缺省的中斷有13個,分別排列在中斷向量表,位于內(nèi)存0x0003~0x0063,默認優(yōu)先級0~12。一般在編譯選項里預(yù)留出0x80以下的內(nèi)存,就是供這個中斷向量表使用。
實際上,在程序開頭加上#pragma NOIV,表示該文件使用的中斷函數(shù)統(tǒng)統(tǒng)不遵循上述缺省的中斷向量分配,而是自行分配中斷向量,自行分配中斷優(yōu)先級。
這樣才有了大量的USB函數(shù)采用interrupt 0的寫法:
void ISR_Ep2eflag(void) interrupt 0;
void ISR_Ep4eflag(void) interrupt 0;
這樣的寫法,人為地把所有USB中斷當成了最高優(yōu)先級的中斷0。(缺省的中斷0只有WAKEUP/WU2引腳或者USB喚醒,其它25個USB中斷是中斷8)
從這一設(shè)置可以看出,位于該文件中的其它中斷,也要人為地約定中斷號。我的經(jīng)驗是,不如把其它類型的中斷,如定時器,外部中斷等,寫到其它文件,只要這個文件不包含#pragma noiv,那么該文件中的中斷還是可以使用缺省中斷的(僅僅中斷0被USB占用,其它都可用)。
另外C51中斷語句后的using不用也罷!實在是沒時間搞清68013和老51在這一部分的差別,不加的最壞可能是效率的降低,這個要查看匯編代碼才能了解,不用就好了。
評論