KEIL C51的#pragma NOIV
#pragma NOIV
它的注释是,不产生中断向量。查找C51手册,说明如下:
NOINTVECTOR Compiler Directive
Abbreviation | NOIV 本文引用地址:https://www.eepw.com.cn/article/201611/320372.htm |
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在这一部分的差别,不加的最坏可能是效率的降低,这个要查看汇编代码才能了解,不用就好了。
评论