泡泡鱼lu 发表于 2022-3-12 11:55:14

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

比如函数a调用很多其它函数,当运行到函数a的时候,突然来个中断,那么芯片是把a函数里面所调用的函数内容(如变量)地址也保存到堆栈中去吗?,如果是这样是不是一个函数调用很多其它函数会很占用堆栈

wye11083 发表于 2022-3-12 12:17:20

不切换线程不用保存环境。中断函数会单独保存用到的寄存器,不用的不动。

laujc 发表于 2022-3-12 12:33:18

你理解有误呀,函数A运行时中断,只需要保存当前PC指针和用到的寄存器值就可以了。中断返回继续从刚才位置运行,和调用多少关系不大呀。和用了多少局部变量有关系

xmlbb 发表于 2022-3-12 13:34:09

要a调用b,会把a的堆栈调整,相当于保存了a的局部变量,b调用c时同样会调整,跟中断没关系,中断只是把当前的pc和寄存器保存就好。

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

dukelec 发表于 2022-3-12 14:30:07

本帖最后由 dukelec 于 2022-3-12 14:34 编辑

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

huangqi412 发表于 2022-3-13 10:19:03

局部变量超过寄存器的部分本来就是开栈用的,只有寄存器部分可能要压栈。
堆和栈两码事,两个字一定要分开用。

xuekcd 发表于 2022-3-13 12:29:51

中断时进入异常,寄存器及栈指针都切换为另一套,完美

tang_qianfeng 发表于 2022-3-13 12:46:02

xuekcd 发表于 2022-3-13 12:29
中断时进入异常,寄存器及栈指针都切换为另一套,完美
(引用自7楼)

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

D.lovers 发表于 2022-3-13 19:04:00

楼主如果写过汇编程序就不会问这些问题了

tuy0326 发表于 2022-3-13 20:18:06

被调用函数如果使用的有全局变量,要小心
如果使用的都是局部变量,就没事

tcm123 发表于 2022-3-13 20:24:10

即使没中断 一层层调用局部变量也要保存到堆栈啊中断只是保存中断控制器会用到的少量寄存器。大脑要和CPU一样能跑代码,当然前提是CPU架构原理要有了解

mcu5i51 发表于 2022-3-14 08:03:45

mcu和cpu的编译不同,多数的mcu编译器不会保存所有的堆栈,只是PC指针和中断用到的通用寄存器,这些是可以预见的,pc和动态app中不能静态分析的才为每个应用分配堆栈

gonboy 发表于 2022-3-14 08:45:51

保证函数可重入,就不用担心。

cctv02 发表于 2022-3-14 09:41:08

单片机核心/RTOS必备_硬件编程大全 你值得拥有,里面有怎么汇编怎么调用C传参的和压栈
大概了解下就行,编译器干的活

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

vuo50z 发表于 2022-3-14 14:18:23

任何计算机系统,前台程序被打断后(包括中断和任务切换),自己的私有变量和运行环境不会有任何改变,否则就是有bug。

ehengio 发表于 2022-3-18 17:26:06

a分别调用b,c,d,e,f。中断堆栈占用最多是2个函数的用量
最怕是a调用b,b调用c,c调用d……

wicy001 发表于 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个函数的用量,这个说法从何而来?


abigpad 发表于 2022-3-18 21:28:30

学习汇编,就明白了

ehengio 发表于 2022-3-18 21:30:02

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

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

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

wicy001 发表于 2022-3-18 21:54:04

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

哦哦。
页: [1]
查看完整版本: 单片机程序,一个函数调用很多其它函数,中断的时候会怎么样