标题: 单片机可以执行多少次嵌套?原因是什么? [打印本页]

作者: leebin    时间: 2019-3-12 15:34
标题: 单片机可以执行多少次嵌套?原因是什么?
如题
作者: 正规007    时间: 2019-3-12 17:14
如果设计合理,N次嵌套都不是个事
作者: 736898032    时间: 2019-3-12 18:47
堆栈应该是跟C编译器有关和开辟的堆栈区空间的大小有关。因此,子程序能嵌套多少层是跟C编译器有关和开辟的堆栈区空间的大小有关。有的C编译器在编译时,如果溢出会有警告或者出错的提示,但是也有的C编译器如果溢出却不会有警告或者出错的提示,毕竟C编译器也是一种人为的软件,不同的版本也可能存在差异。我自己也开发过编译器的子程序嵌套的功能,因此我深知子程序的嵌套肯定是有层数限制的,嵌套越少越安全。我平时用keil4 编译M3和M4核的单片机,一般是把嵌套数控制在4层左右以内。应该以实际为准,如果程序出现了莫名其妙的明显错误,可以考虑是不是嵌套层数太多或者堆栈溢出的问题。

作者: a庚    时间: 2019-3-12 19:34
若是中断嵌套,最好都不要写这种代码。应当拒绝浪费内存这种无意义行为

作者: Y_G_G    时间: 2019-3-12 23:54
这个和单片机的硬件有关的,很多人是以8051的C语言开始学习的,8051的堆栈是程序自动分配的软件堆栈,理论上来说从030H到0FFH都可以作为堆栈,大概200层吧,那么在C中,大概就能嵌套200层,至少理论上来说是这样的
但别的单片机就不一样的了,有的是使用硬件堆栈,合泰单片机就是这样的硬件堆栈,有的型号只有4层硬件堆栈,也就是说最多只能嵌套4层,PIC的单片机也是大概如此,像这种硬件堆栈,而且只有几层堆栈的单片机,一般是不会嵌套的,函数的递归也是不允许的,就是中断函数里面都不用函数之类的要用到堆栈的语句
作者: liuguonianhua    时间: 2019-12-9 18:30
亲测,5层栈溢出
作者: liuguonianhua    时间: 2019-12-9 18:32
正规007 发表于 2019-3-12 17:14
如果设计合理,N次嵌套都不是个事

胡说!你试试最简单的递归看看!
作者: csmyldl    时间: 2019-12-9 23:26
Y_G_G 发表于 2019-3-12 23:54
这个和单片机的硬件有关的,很多人是以8051的C语言开始学习的,8051的堆栈是程序自动分配的软件堆栈,理论上来 ...

8051单片机即使把08H-FFH所有内存都作为堆栈,也不会有200层,因为只有240个存储单元,而第一个断点都有2个字节的地址需自动存入,这样也只有120层,如果程序真有120层调用,每一层的中间运行数据将无存储空间可用,一般编写程序都需要留出足够的内存空间供变量使用,堆栈移至内存的尾部,大概占16-30个字节地址,程序嵌套建议不超过8层为好
作者: linzhiqi1    时间: 2019-12-13 08:16
嵌套的层数与堆栈的深度有关,每次调用子程序,或者相应中断,都要在堆栈中保留返回值,如何堆栈满了,再嵌套,就无法返回了。我用过最PIC16c57,硬件堆栈2级。。 若是标准的51单片机,堆栈在128B的RAM中可以自己设置指针,但是R0-R7 用户的数据要占用一些RAM 剩余的可做堆栈,每次入栈2字节,可以计算出能嵌套多少次了,52多了128B的RAM 可以用l来做堆栈 128B的堆栈可以嵌套64次。当然每次嵌套要保存数据还需要RAM。
作者: 李泽训    时间: 2019-12-13 14:56
我用过最多4次
作者: 李一安    时间: 2019-12-13 15:30
不同的单片机可以执行的嵌套也不同,RAM大的单片机,多少级都是随便的
作者: 天风情    时间: 2019-12-13 16:53
受限于单片机硬件和C语言规范




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1