关于函数重入的说明
因为使用了中断等级划分,中断中调用函数必定使用using x,保证主循环、低等级中断、高等级中断对同一函数的调用,不使用相同的寄存器区,而同等级中不管优先级如何都不会发生中断嵌套,所以首先避免了使用寄存器做函数参数调用引起的重入问题。
对只要可能在中断中调用的任何函数,必须使用#pragma NOAREGS开关,避免编译器产生优化的地址直接寻址指令,而使用正确的寄存器寻址指令。
对可能中断中调用的指针,一定明确说明类型,不能使用通用指针。
对可能被嵌套的函数,在进行char以上(int、long、xdata指针等)超过两字节的变量操作时,必须进行中断保护:保存中断状态->关中断->操作->恢复中断状态,保证不会在两字节之间的操作中产生中断。
这样reentrant可以不被使用,它的代价太大了。如果还有重入问题,就将函数复制一遍并改名,让中断中调用不同名字的函数吧。 |