搜索
bottom↓
回复: 32

程序嵌套小问题

[复制链接]

出0入0汤圆

发表于 2014-11-24 13:54:23 | 显示全部楼层 |阅读模式
如下所示:这是一般的程序调用,我的问题是不同单片机对这种调用承受的深度不一样,我曾经试过在51单片机用四五级调用程序就跑飞了,在AVR 上运行就会多承受几级,那么这种现象怎么解释?是不同单片机的功能不同所造成的还是软件造成的?



void GOHEAD_ON(void)
{
   RF_GUNDEAD();
}       

voide RF_GUNDEAD(void)
{
   DIS_SMG();
}

void DIS_SMG(void)
{
  DisByte();
}

void DisByte()
{
   while(1);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入131汤圆

发表于 2014-11-24 14:15:14 | 显示全部楼层
应该是堆栈溢出了

出0入0汤圆

发表于 2014-11-24 14:41:54 | 显示全部楼层
堆棧深度不一樣,這根內存容量,堆棧設置深度和跳轉需要入棧資料的數量都有關係。

出0入0汤圆

发表于 2014-11-24 14:47:48 | 显示全部楼层
原来也遇到过这样的问题,后来换了一个型号的单片机就好了。坐等大神指点

出0入0汤圆

 楼主| 发表于 2014-11-24 14:48:10 | 显示全部楼层
farfar 发表于 2014-11-24 14:41
堆棧深度不一樣,這根內存容量,堆棧設置深度和跳轉需要入棧資料的數量都有關係。 ...

很有道理,那也就是说是由单片机本身的硬件设计有关系喽,那么不同单片机的相关设计现在是什么现在您了解吗

出0入0汤圆

发表于 2014-11-24 15:01:38 | 显示全部楼层
陶新成 发表于 2014-11-24 14:48
很有道理,那也就是说是由单片机本身的硬件设计有关系喽,那么不同单片机的相关设计现在是什么现在您了解 ...

這根硬件設計關係不大。芯片的內存容量是一定的,這要看您的選擇了,如果芯片的內存容量小,這就需要軟件設計人員在設計軟件的時候需要小心,因為受限於內存容量,在函式嵌套時需要小心處理,不能做過身的函式嵌套,否則會發生堆棧溢出事故。堆棧的設置跟你使用的變量數量也有關係,這需要軟件設計者權衡堆棧容量的大小是否需要修改系統的默認值。
當然,如果芯片內存夠大,只要速度允許,你就放心嵌套吧。
以上只是個人觀點,不一定都正確,還望仔細甄別。

出0入0汤圆

发表于 2014-11-24 15:01:39 | 显示全部楼层
陶新成 发表于 2014-11-24 14:48
很有道理,那也就是说是由单片机本身的硬件设计有关系喽,那么不同单片机的相关设计现在是什么现在您了解 ...

不是很有道理,是就是这么回事...

出0入0汤圆

发表于 2014-11-24 15:05:05 | 显示全部楼层
程序可以嵌套的循环数量是跟内存和堆栈息息相关的,大体来说是被内存限制,精确来说是被堆栈大小限制,当然堆栈的大小可以修改,这就又返回到内存大小问题上...

出0入0汤圆

发表于 2014-11-24 15:22:43 | 显示全部楼层
有些芯片的堆栈是不能设置的,固定的几层.
可以调整的就和RAM大小相关了.

出0入0汤圆

 楼主| 发表于 2014-11-24 15:24:05 | 显示全部楼层
wangkx1990 发表于 2014-11-24 15:05
程序可以嵌套的循环数量是跟内存和堆栈息息相关的,大体来说是被内存限制,精确来说是被堆栈大小限制,当然 ...

嵌套循环数和堆栈深度有关我能理解,但是一,堆栈是如何被内存限制的;二,堆栈能改变吗,我以为它是独立而且其深度是固定的呢;三就是堆栈式如何被内存限制的。希望您能不吝赐教!

出0入0汤圆

发表于 2014-11-24 15:30:28 | 显示全部楼层
定义为inline函数可以减少编译后的嵌套层数

出0入0汤圆

发表于 2014-11-24 15:31:39 | 显示全部楼层
陶新成 发表于 2014-11-24 15:24
嵌套循环数和堆栈深度有关我能理解,但是一,堆栈是如何被内存限制的;二,堆栈能改变吗,我以为它是独立 ...

看看ARM的启动代码,第一行有用的就是设置堆栈的!

出0入0汤圆

 楼主| 发表于 2014-11-24 15:32:59 | 显示全部楼层
liufabing 发表于 2014-11-24 15:22
有些芯片的堆栈是不能设置的,固定的几层.
可以调整的就和RAM大小相关了.

楼上几位的评价都提到了和内存有关,刚开始我以为内存小时当被调用的子函数里定义的临时变量超出了内存容量而导致的程序崩溃,但是现在看你们说的超出了这一点,它们是一种怎样的关系您能详细说一下吗

出0入0汤圆

发表于 2014-11-24 15:43:43 | 显示全部楼层
陶新成 发表于 2014-11-24 15:24
嵌套循环数和堆栈深度有关我能理解,但是一,堆栈是如何被内存限制的;二,堆栈能改变吗,我以为它是独立 ...

1、堆栈也是占内存的,内存只有1M,堆栈不可能有2M
2、堆栈是可以修改设置的
3、看1

出0入0汤圆

 楼主| 发表于 2014-11-24 15:49:11 | 显示全部楼层
wangkx1990 发表于 2014-11-24 15:43
1、堆栈也是占内存的,内存只有1M,堆栈不可能有2M
2、堆栈是可以修改设置的
3、看1 ...

非常感谢

出0入0汤圆

 楼主| 发表于 2014-11-24 15:50:45 | 显示全部楼层
y_square 发表于 2014-11-24 15:30
定义为inline函数可以减少编译后的嵌套层数

这个倒是很实用,谢谢

出0入0汤圆

 楼主| 发表于 2014-11-24 15:55:37 | 显示全部楼层
wangpengcheng 发表于 2014-11-24 15:31
看看ARM的启动代码,第一行有用的就是设置堆栈的!

我是用单片机做开发的,看不到RAM的启动程序,如果需要配置单片机的堆栈深度那应该用什么开发平台?还有顺便问一下如果做上位机开发或者ARM开发的话是不是就能直接对堆栈行堆栈深度设计?

出0入0汤圆

发表于 2014-11-24 15:56:30 | 显示全部楼层
陶新成 发表于 2014-11-24 15:55
我是用单片机做开发的,看不到RAM的启动程序,如果需要配置单片机的堆栈深度那应该用什么开发平台?还有 ...

单片机忘记了,N久没用过了,呵呵!

出0入0汤圆

 楼主| 发表于 2014-11-24 16:02:28 | 显示全部楼层
wangpengcheng 发表于 2014-11-24 15:56
单片机忘记了,N久没用过了,呵呵!

那您现在用的是什么开发平台

出0入0汤圆

 楼主| 发表于 2014-11-24 16:10:45 | 显示全部楼层
y_square 发表于 2014-11-24 15:30
定义为inline函数可以减少编译后的嵌套层数

您用的哪种开发平台,我用AVR单片机软件写的时候编译不过去啊

出0入0汤圆

发表于 2014-11-24 16:15:01 | 显示全部楼层
陶新成 发表于 2014-11-24 16:02
那您现在用的是什么开发平台

目前用的是飞思上卡尔的 ARM

出0入17汤圆

发表于 2014-11-24 16:55:15 | 显示全部楼层
陶新成 发表于 2014-11-24 15:55
我是用单片机做开发的,看不到RAM的启动程序,如果需要配置单片机的堆栈深度那应该用什么开发平台?还有 ...

记得51的启动文件里也有。 经典位置80H

另外程序嵌套的最大层数,与编译器也有关系,具体需要看编译器的手册。

出0入0汤圆

发表于 2014-11-24 22:13:45 来自手机 | 显示全部楼层
好像pic有限制,别的单片机对这么几层应该没压力的。只要不用递归就行。

出0入0汤圆

发表于 2014-11-24 22:47:08 | 显示全部楼层
堆栈溢出了吧

出0入0汤圆

发表于 2014-11-24 23:26:24 来自手机 | 显示全部楼层
开发环境IDE,提供修改堆栈大小

出0入0汤圆

发表于 2014-11-25 00:07:50 | 显示全部楼层
启动代码有设置项

出0入0汤圆

 楼主| 发表于 2014-11-25 11:14:48 | 显示全部楼层
wicy001 发表于 2014-11-24 16:55
记得51的启动文件里也有。 经典位置80H

另外程序嵌套的最大层数,与编译器也有关系,具体需要看编译器的 ...

如果说内存能影响到堆栈我能理解但是编译器是如何影响的?

出0入0汤圆

 楼主| 发表于 2014-11-25 11:17:06 | 显示全部楼层
wangpengcheng 发表于 2014-11-24 16:15
目前用的是飞思上卡尔的 ARM

您好,堆栈除了程序的嵌套能用到,还有什么地方用到?我是搞单片机开发的,对软件不是很精通,呵呵呵

出0入0汤圆

发表于 2014-11-25 11:27:47 | 显示全部楼层
陶新成 发表于 2014-11-25 11:17
您好,堆栈除了程序的嵌套能用到,还有什么地方用到?我是搞单片机开发的,对软件不是很精通,呵呵呵 ...

你所有的问题都可以在最基本的51单片机介绍CPU部分的章节可以找到答案,当然AVR也是一样。
我怀疑你连CPU最基本的工作原理,程序的执行过程都不甚理解。在此基础之外谈其他真的毫无意义。

出0入17汤圆

发表于 2014-11-25 12:02:12 | 显示全部楼层
陶新成 发表于 2014-11-25 11:14
如果说内存能影响到堆栈我能理解但是编译器是如何影响的?

编译器也是人编的, 计算机里的某类型变量,你见过无限大的吗? 凡是涉及数量的,都有限制。

if语句嵌套的层数,数据的间接访问层数,宏的嵌套层数等等,都有限制,编译器手册上都写的很明白。

出0入0汤圆

发表于 2014-11-25 12:18:52 | 显示全部楼层
陶新成 发表于 2014-11-25 11:17
您好,堆栈除了程序的嵌套能用到,还有什么地方用到?我是搞单片机开发的,对软件不是很精通,呵呵呵 ...

堆栈的作用是用来保存临时变量的!

出0入0汤圆

发表于 2014-11-25 23:10:52 | 显示全部楼层
陶新成 发表于 2014-11-24 16:10
您用的哪种开发平台,我用AVR单片机软件写的时候编译不过去啊

AVR的没用过,你可以参考这两个贴:  
http://www.amobbs.com/thread-893814-1-1.html
http://www.amobbs.com/thread-3948352-1-1.html

另外,有些编译器中内联函数的关键字是__inline,你都试试。
还不行的话把错误信息贴出来看看(恐怕需要另开一贴)

出0入0汤圆

发表于 2014-11-26 08:49:37 | 显示全部楼层
mark   学习了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 06:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表