keil中函数递归调用问题

5 篇文章 0 订阅

最近在搞电子设计大赛的事,一直没时间写这个问题,现在吃饱没事干就讨论一下这问题。我当时是在写温度传感器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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值