搜索
bottom↓
回复: 19

单片机程序,一个函数调用很多其它函数,中断的时候会怎么样

[复制链接]

出0入0汤圆

发表于 2022-3-12 11:55:14 | 显示全部楼层 |阅读模式
比如函数a调用很多其它函数,当运行到函数a的时候,突然来个中断,那么芯片是把a函数里面所调用的函数内容(如变量)地址也保存到堆栈中去吗?,如果是这样是不是一个函数调用很多其它函数会很占用堆栈

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

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

出0入442汤圆

发表于 2022-3-12 12:17:20 来自手机 | 显示全部楼层
不切换线程不用保存环境。中断函数会单独保存用到的寄存器,不用的不动。

出0入4汤圆

发表于 2022-3-12 12:33:18 | 显示全部楼层
你理解有误呀,函数A运行时中断,只需要保存当前PC指针和用到的寄存器值就可以了。中断返回继续从刚才位置运行,和调用多少关系不大呀。和用了多少局部变量有关系

出0入0汤圆

发表于 2022-3-12 13:34:09 | 显示全部楼层
要a调用b,会把a的堆栈调整,相当于保存了a的局部变量,b调用c时同样会调整,跟中断没关系,中断只是把当前的pc和寄存器保存就好。

所以调用的路径越深,对堆栈的要求越高,特别是递归调用时,很容易爆内存,因为递归很容易调用很多很多次,深圳很深。

出615入1076汤圆

发表于 2022-3-12 14:30:07 来自手机 | 显示全部楼层
本帖最后由 dukelec 于 2022-3-12 14:34 编辑

中斷的本質相當於你在某函數發生中斷處,主動寫了一句中斷函數的軟件調用

出0入0汤圆

发表于 2022-3-13 10:19:03 来自手机 | 显示全部楼层
局部变量超过寄存器的部分本来就是开栈用的,只有寄存器部分可能要压栈。
堆和栈两码事,两个字一定要分开用。

出0入0汤圆

发表于 2022-3-13 12:29:51 来自手机 | 显示全部楼层
中断时进入异常,寄存器及栈指针都切换为另一套,完美

出0入18汤圆

发表于 2022-3-13 12:46:02 来自手机 | 显示全部楼层
xuekcd 发表于 2022-3-13 12:29
中断时进入异常,寄存器及栈指针都切换为另一套,完美
(引用自7楼)

不一定吧,除非你的代码平时用的线程堆栈指针psp

出0入4汤圆

发表于 2022-3-13 19:04:00 来自手机 | 显示全部楼层
楼主如果写过汇编程序就不会问这些问题了

出0入0汤圆

发表于 2022-3-13 20:18:06 | 显示全部楼层
被调用函数如果使用的有全局变量,要小心
如果使用的都是局部变量,就没事

出10入61汤圆

发表于 2022-3-13 20:24:10 | 显示全部楼层
即使没中断 一层层调用局部变量也要保存到堆栈啊  中断只是保存中断控制器会用到的少量寄存器。大脑要和CPU一样能跑代码,当然前提是CPU架构原理要有了解

出0入0汤圆

发表于 2022-3-14 08:03:45 | 显示全部楼层
mcu和cpu的编译不同,多数的mcu编译器不会保存所有的堆栈,只是PC指针和中断用到的通用寄存器,这些是可以预见的,pc和动态app中不能静态分析的才为每个应用分配堆栈

出10入46汤圆

发表于 2022-3-14 08:45:51 | 显示全部楼层
保证函数可重入,就不用担心。

出0入0汤圆

发表于 2022-3-14 09:41:08 | 显示全部楼层
单片机核心/RTOS必备_硬件编程大全 你值得拥有,里面有怎么汇编怎么调用C传参的和压栈
大概了解下就行,编译器干的活

PS
堆和栈是两个东东,
堆保存全局变量,栈保存的是局部变量,在函数调用时修改栈指针实现,函数结束改回去(函数有多少局部变量,编译时已经确定的)大概这样子,如果还有不当的地方请大家指正谢谢

出0入0汤圆

发表于 2022-3-14 14:18:23 | 显示全部楼层
任何计算机系统,前台程序被打断后(包括中断和任务切换),自己的私有变量和运行环境不会有任何改变,否则就是有bug。

出0入217汤圆

发表于 2022-3-18 17:26:06 | 显示全部楼层
a分别调用b,c,d,e,f。中断堆栈占用最多是2个函数的用量
最怕是a调用b,b调用c,c调用d……

出0入17汤圆

发表于 2022-3-18 21:26:50 来自手机 | 显示全部楼层
ehengio 发表于 2022-3-18 17:26
a分别调用b,c,d,e,f。中断堆栈占用最多是2个函数的用量
最怕是a调用b,b调用c,c调用d…… ...

(引用自16楼)

a调用几层都没啥关系,只要堆栈够用,编译器能支持。

中断堆栈占用最多用2个函数的用量,这个说法从何而来?


出5入16汤圆

发表于 2022-3-18 21:28:30 来自手机 | 显示全部楼层
学习汇编,就明白了

出0入217汤圆

发表于 2022-3-18 21:30:02 | 显示全部楼层
wicy001 发表于 2022-3-18 21:26
a调用几层都没啥关系,只要堆栈够用,编译器能支持。

中断堆栈占用最多用2个函数的用量,这个说法从何而 ...
(引用自17楼)

LZ关心的十堆栈占用大小的问题。我告诉他一个函数调用多个函数和调用一个函数占用的堆栈是一样的。

出0入17汤圆

发表于 2022-3-18 21:54:04 | 显示全部楼层
ehengio 发表于 2022-3-18 21:30
LZ关心的十堆栈占用大小的问题。我告诉他一个函数调用多个函数和调用一个函数占用的堆栈是一样的。 ...
(引用自19楼)

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

本版积分规则

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

GMT+8, 2024-6-9 09:47

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

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