CYRESS给出的USB例程,在periph.c中遍及在最初一行加了下列编译指令:
#pragma NOIV
它的注释是,不发生中止向量。查找C51手册,阐明如下:
NOINTVECTOR Compiler Directive
Abbreviation |
NOIV |
Arguments |
None. |
Default |
INTVECTOR (0) |
µVision |
Options — |
Description |
The |
See Also |
INTERVAL, |
Example |
C51 #pragma noiv |
它的意思是,不发生8051缺省的中止向量。对68013A来说,缺省的中止有13个,别离摆放在中止向量表,坐落内存0x0003~0x0063,默许优先级0~12。一般在编译选项里预留出0x80以下的内存,便是供这个中止向量表运用。
实际上,在程序最初加上#pragma NOIV,表明该文件运用的中止函数通通不遵从上述缺省的中止向量分配,而是自行分配中止向量,自行分配中止优先级。
这样才有了很多的USB函数选用interrupt 0的写法:
void ISR_Ep2eflag(void) interrupt 0;
void ISR_Ep4eflag(void) interrupt 0;
这样的写法,人为地把一切USB中止当成了最高优先级的中止0。(缺省的中止0只需WAKEUP/WU2引脚或许USB唤醒,其它25个USB中止是中止8)
从这一设置能够看出,坐落该文件中的其它中止,也要人为地约好中止号。我的经历是,不如把其它类型的中止,如定时器,外部中止等,写到其它文件,只需这个文件不包括#pragma noiv,那么该文件中的中止仍是能够运用缺省中止的(只是中止0被USB占用,其它都可用)。
别的C51中止句子后的using不必也罢!实在是没时间搞清68013和老51在这一部分的不同,不加的最坏可能是功率的下降,这个要检查汇编代码才干了解,不必就好了。