×
嵌入式 > 嵌入式开发 > 详情

KEIL C51的#pragma NOIV

发布时间:2020-08-20 发布时间:
|
CYRESS给出的USB例程,在periph.c中普遍在开头一行加了下列编译指令:
#pragma NOIV

它的注释是,不产生中断向量。查找C51手册,说明如下:

NOINTVECTOR Compiler Directive

Abbreviation

NOIV


Arguments

None.

Default

INTVECTOR (0)

µVision

Options —C51— Interrupt vectors at address.

Description

TheNOINTVECTORdirective inhibits interrupt vector generation. This flexibility allows the user to provide interrupt vectors with other programming tools.

See Also

INTERVAL,INTVECTOR

Example
C51SAMPLE.C NOINTVECTOR 
#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在这一部分的差别,不加的最坏可能是效率的降低,这个要查看汇编代码才能了解,不用就好了。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC18FXX8单片机通用同步异步收发器的接口电路和C源代码