搜索
bottom↓
回复: 16

单片机不上操作系统,会有栈帧这个概念吗?

[复制链接]

出0入0汤圆

发表于 2017-3-21 14:57:18 | 显示全部楼层 |阅读模式


如果单片机不上操作系统,编译器会给每个函数分配一个栈区吗?
我个人理解是,上了操作系统才需要,因为上了操作系统,就意味着每个函数在运行的过程中都有可能被切换到其他地方,
等下次运行到这个函数的时候,就继续从上次的中断的地方执行!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

发表于 2017-3-21 15:03:54 | 显示全部楼层
调用函数需要保留现在执行的现场,所以堆栈是需要的。

出0入0汤圆

 楼主| 发表于 2017-3-21 15:08:20 | 显示全部楼层
TBG3 发表于 2017-3-21 15:03
调用函数需要保留现在执行的现场,所以堆栈是需要的。

那就是说就算是不是上操作系统,编译器也会给每个函数划定一个堆栈咯?

出0入0汤圆

 楼主| 发表于 2017-3-21 15:09:05 | 显示全部楼层
TBG3 发表于 2017-3-21 15:03
调用函数需要保留现在执行的现场,所以堆栈是需要的。

那就是说不上操作系统,编译器也会给每个函数划定一个栈区咯?

出0入0汤圆

发表于 2017-3-21 15:09:17 | 显示全部楼层
51汇编入门就有压栈出栈。。。    不提调用子程序的情况,就说中断,也是会突然打断执行滴。

出0入0汤圆

发表于 2017-3-21 15:11:02 | 显示全部楼层
本帖最后由 snoopyzz 于 2017-3-21 15:12 编辑
188089942 发表于 2017-3-21 15:09
那就是说不上操作系统,编译器也会给每个函数划定一个栈区咯?


正常都是动态在栈上分配的, 函数返回时释放, 其实通常就是个SP指针之类的在变化,

只有极少数MCU比较弱, 编译器需要静态划分RAM给函数

出0入0汤圆

 楼主| 发表于 2017-3-21 15:22:13 | 显示全部楼层
我发现我理解错了 这个图是用来表示函数调动的情况的!

出0入0汤圆

发表于 2017-3-21 15:38:52 | 显示全部楼层
有全局的栈,系统初始化的时候会分配的。如果有rtos的话,rtos会有自己管理的栈供各线程使用。

出0入0汤圆

发表于 2017-3-21 16:08:00 | 显示全部楼层
栈是肯定有的。堆得看你程序中是否使用malloc方法了,否则木有。

出0入0汤圆

发表于 2017-3-21 16:17:14 | 显示全部楼层
和RTOS无关,和芯片架构有关,目前的MCU都有栈

出0入0汤圆

 楼主| 发表于 2017-3-21 16:28:48 | 显示全部楼层
snoopyzz 发表于 2017-3-21 15:11
正常都是动态在栈上分配的, 函数返回时释放, 其实通常就是个SP指针之类的在变化,

只有极少数MCU比较弱,  ...

是不是每调用一次子函数,对应的就要在栈区记录下,调整前的指针,和参数?   并且这个格式是有规定好的。  

出0入0汤圆

 楼主| 发表于 2017-3-21 16:45:40 | 显示全部楼层
flamma 发表于 2017-3-21 15:38
有全局的栈,系统初始化的时候会分配的。如果有rtos的话,rtos会有自己管理的栈供各线程使用。 ...

是不是每调用一次子函数,对应的就要在栈区记录下跳转前的PC指针 SP指针 FP指针  局部参数等?   并且这个格式是有规定好的。

出0入0汤圆

发表于 2017-3-21 17:06:43 来自手机 | 显示全部楼层
函数的栈是编译时确定的,编译时可以确定调用树及各函数被调用时需保存的寄存器。

出0入0汤圆

发表于 2017-3-21 17:10:47 | 显示全部楼层
188089942 发表于 2017-3-21 16:45
是不是每调用一次子函数,对应的就要在栈区记录下跳转前的PC指针 SP指针 FP指针  局部参数等?   并且这 ...

一点汇编的知识都没有吗?

出0入0汤圆

发表于 2017-3-21 17:56:04 | 显示全部楼层
栈帧就是指当前函数可以使用的栈范围,超越范围调用肯定是不对的,cortex m系列只有sp而没有fp,但是编译器通过在函数体代码前后添加修改sp的代码,从而实现栈帧

出0入0汤圆

发表于 2017-3-21 21:13:14 来自手机 | 显示全部楼层
没有操作系统,可以看做只有一个进程在跑。还有中断,可以看做是一个特殊的进程。

出0入0汤圆

发表于 2017-3-21 22:20:14 | 显示全部楼层
个人理解:栈帧包括函数调用栈帧和中断栈帧,它们两个是不一样的.因为函数调用栈帧可能需要暂存从Caller传递过来的实参,而中断栈帧需要暂存PSR,所以两者是有区别的.
一般情况下,操作系统就是利用中断返回实现任务切换,所以说中断是操作系统的入口.
所以不管是不是上操作系统,应该都是有栈帧这个概念的.

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

本版积分规则

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

GMT+8, 2024-4-16 20:46

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

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