最近在搞电子设计大赛的事,一直没时间写这个问题,现在吃饱没事干就讨论一下这问题。我当时是在写温度传感器18b20的初始化程序过程中发现的。初始化程序是inti_18b20( ).当检测到温度传感器时,标识位flag接收温度传感器送来的相应数据(flag=0);当没有检测到温度传感器时,flag=1,此时需要重新调用初始化程序inti_18b20( )本身(并且调用BEEP()函数报警),直到检测到温度传感器为止。那么,keil中的函数是否可以递归呢?递归过程中局部变量又是怎样安排的呢?我为此差了很多资料,最终有一些头绪了。
keil中的函数递归调用可分为两种情况,一种是普通函数递归,调用时,新调用函数的程序储存空间覆盖原来的相同函数调用的程序储存空间,使得原来的局部变量消失了;还有一种是再入函数(用reentrant说明)的递归,每次递归,keil为再入函数生成一个模拟栈,再入函数参数和局部变量被放在这模拟栈中,这样使得原来调用函数的局部变量就没有消失了,而新的调用函数参数和局部变量又可以继续。
再入函数的定义:
函数类型 [reentrent] 函数名 (形式参数)
例如:int [reentrent] fution(char n)
{ if(n<1)return(1);
else return(n*fution(n-1));
}
使用再入函数注意事项:
1: 再入函数不能传送bit类型的参数,函数内部也不能定义局部位变量,不能有位操作。总之与位有关的定义和操作在再入函数中都不能实现。
2: 同一程序中可以有不同储存模式的再入函数,但是注意,任意模式的再入函数不能调用不同储存模式的再入函数,但可以调用不同储存模式的非再入函数。
3 参数传递上,实际参数可以传递给间接调用的再入函数;非再入函数不能包含调用参数,因为那样会覆盖了原来的参数;但是,可以用全局变量来进行参数传递。
转载自:
http://bbs.ednchina.com/BLOG_ARTICLE_252636.HTM