关于可重入关键字reentrant的使用:
现象:
在一个项目中警告信息如下,提示该函数多次调用,因为该函数在串口中断和主循环中都有被调用。
影响:
如果在使用该函数期间被中断打断,而中断也调用了该函数,那么该函数的局部变量会被覆盖。当中断结束返回,则此时的变量已经被中断修改了,此时的数据不对,会出现意想不到的结果。
原因:
C51的变量是编译时预先分配好的,每个变量地址已经固定,不会变动。
(51单片机资源有限,为了提高运行效率,C51采用静态分配局部变量的方式,所以不可递归。而标准C语言的堆栈是动态分配的。)
解决方案:
给需要重复调用的函数加上 reentrant
关键字,使用方式如下图
最后再编译发现警告消失。
参考文章:
1、C51的再入函数 reentrant RECURSIVE CALL TO SEGMENT
2、51单片机与递归的问题