C51函数声明对ANSI C作了扩展,详细包含:
1.中止函数声明:
中止声明办法如下:
void serial_ISR () interrupt 4 [using 1]
{
/* ISR */
}
为进步代码的容错才能,在没用到的中止入口处生成iret句子,界说没用到的中止。
/* define not used interrupt, so generate “IRET” in their entrance */
void extern0_ISR() interrupt 0{}/* not used */
void TImer0_ISR () interrupt 1{}/* not used */
void extern1_ISR() interrupt 2{}/* not used */
void TImer1_ISR () interrupt 3{}/* not used */
void serial_ISR () interrupt 4{}/* not used */
2.通用存储作业区3.选通用存储作业区由using x声明,见上例。4.指定存储形式
由small compact 及large阐明,例如:
void fun1(void) small {}
提示:small阐明的函数内部变量悉数运用内部RAM。要害的经常性的耗时的当地能够这样声明,以进步运转速度。
5.#pragma disable
在函数前声明,只对一个函数有用。该函数调用过程中将不可被中止。
6.递归或可重入函数指定
在主程序和中止中都可调用的函数,简单发生问题。因为51和PC不同,PC运用仓库传递参数,且静态变量以外的内部变量都在仓库中;而51一般运用寄存器传递参数,内部变量一般在RAM中,函数重入时会损坏前次调用的数据。能够用以下两种办法处理函数重入:
a、在相应的函数前运用前述“#pragma disable”声明,即只允许主程序或中止之一调用该函数;
b、将该函数阐明为可重入的。如下:
void func(param.。。) reentrant;
KeilC51编译后将生成一个可重入变量仓库,然后就能够模仿经过仓库传递变量的办法。
因为一般可重入函数由主程序和中止调用,所以一般中止运用与主程序不同的R寄存器组。
别的,对可重入函数,在相应的函数前面加上开关“#pragma noaregs”,以制止编译器运用肯定寄存器寻址,可生成不依赖于寄存器组的代码。
7.指定PL/M-51函数
由alien指定。