搜索
bottom↓
回复: 7

请问startup中stack_size定义的堆栈和UCOS中任务定义的堆栈区别

[复制链接]

出0入0汤圆

发表于 2013-6-21 15:42:29 | 显示全部楼层 |阅读模式
请问startup中stack_size定义的堆栈和UCOS中任务定义的堆栈区别。startup中定义的是不是给中断用的?

出0入0汤圆

发表于 2013-6-21 20:05:28 | 显示全部楼层
本帖最后由 fisherman2004 于 2013-6-21 20:10 编辑

不是 多任务才需要任务堆栈,用来保存每个任务的现场信息,在下次调度到该任务时,将这个任务块信息的堆栈点(上次任务切换前任务的堆栈地址)恢复到系统的堆栈寄存器,用来恢复现场用。

调度器的C代码就工作在那个startup后面的堆栈,而不能使用任务堆栈来做多任务的调度。

我看其他的OS是这样处理的 UCOS不知道是不是这样。

出0入0汤圆

 楼主| 发表于 2013-6-21 22:14:27 | 显示全部楼层
那中断用的堆栈是用的哪一个堆栈,你没直接回答这个问题。

出0入0汤圆

发表于 2013-6-22 08:50:48 | 显示全部楼层
中断当然用的startup后面那个堆栈 不可能用任务的堆栈

出0入0汤圆

发表于 2013-6-22 09:30:36 | 显示全部楼层
楼主的帖子是发在了M3里面,下面说的都是基于M3内核上面的,第四条是你问题的答案。
1. 首先楼主要清楚M3有两个堆栈指针,关于这个问题,详细的可以看一下权威指南,清楚这个问题
    相当关键。
2. 系统复位后默认使用的是MSP,复位后的状态是特权级线程状态,在这个状态下是允许修改寄存器
    CONTROL[1]的。进入到用户特权以后就不能修改这些寄存器了。
3. 用户特权的情况(也就是用户建立的非中断服务程序)下可以使用MSP或PSP,特权模式(中断
    服务程序)只能使用MSP。
4. 还有很重要的一条就是.假如在用户模式下使用的是PSP,那么寄存器的数值被保存到任务堆栈的空间,
    进入中断程序后就开始使用MSP,如果还有一个高优先级的中断难么就继续的使用MSP,在程序推出最
    后一级中断的时候就用用户堆栈恢复寄存器。

如果这个看着不是太清楚的话,看我以前发的一个帖子,有详细的总结
http://bbs.armfly.com/read.php?tid=63&fpage=3

出0入0汤圆

 楼主| 发表于 2013-6-22 10:25:57 | 显示全部楼层
非常感谢大家的回答。也就是说startup里的那个堆栈就是msp对应的堆栈。

出0入0汤圆

 楼主| 发表于 2013-6-22 10:36:25 | 显示全部楼层
我看UCOS一直没搞懂一个问题。任务里调用的函数所建立的局部变量,使用的是该任务所分配的堆栈空间。看其汇编,跟本没看到该局部变量和堆栈空间是怎么联系上去的,是编译器自己处理的?

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-11 15:24

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

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