打印

关于ARM上运行uC/OS-II时的堆栈设置问题

[复制链接]
2667|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
军用拖拉机|  楼主 | 2007-8-29 17:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位兄台,我一直有个疑问,在ARM上运行uC/OS-II的时候,究竟有没有必要为每个任务设置堆栈,比如说,整个操作系统运行在SVC(管理态)和IRQ态,任务主要运行SVC态,那么每次任务切换时,数据被压入的地方应是SVC态下的堆栈(不考虑中断的话),任务被抢占、数据压栈后只需要一定空间存储当前堆栈指针SP即可(即被抢占任务的OSTCBStkPtr中),而不需要再为每个任务分配堆栈。之所以想到这个问题,是因为小弟以前搞51单片机的,在上面跑过uC,那时候是绝对需要每个任务一个堆栈的,该运行哪个任务就把它堆栈中的数据全部拷贝到系统堆栈,再出栈、中断返回指令即可,但我认为在ARM上没有必要这样,只要在初始化的时候把SVC模式下的堆栈设置足够大即可,没有必要设置OS_STK        TaskStk[OSNTSKS][60];   这类的任务堆栈了吧,不知我的看法是否正确,请高手指点一二,谢谢!

相关帖子

沙发
ayb_ice| | 2007-8-30 18:34 | 只看该作者

看来你还没有入门。。。

每个任务肯定要独立的堆栈。。。
可以不一样大(最好是能独立设定),这样可以节约内存,如果一样大必须是按最大任务分配,这样浪费内存,但省事。。。

使用特权

评论回复
板凳
军用拖拉机|  楼主 | 2007-8-31 08:50 | 只看该作者

请教2楼的

您好,多谢指教,我的意思是为每个任务分配的堆栈是在哪个区域,我认为即使不为每个任务刻意的分配堆栈,只要能找到任务被抢占时候的SP指针(保存在任务控制块的OSTCBStkPtr中)就能恢复该任务,前提是在ARM初始化的时候把任务运行模式下的堆栈区设置足够大,请赐教

使用特权

评论回复
地板
军用拖拉机|  楼主 | 2007-8-31 08:59 | 只看该作者

补充

我认为在ARM上应用uC/OS-II没有必要为每个任务定义堆栈,打个比方,如果任务是运行在SVC模式下的,那么一个任务被抢占后,要保存该任务的“环境”,这些环境就是各个寄存器的当前值,将这些值压栈后,保存当前的SP到该任务的任务控制块中的OSTCBStkPtr,下次要运行该任务时,找到这个SP的值,出栈后即可恢复该任务,那么为每个任务分配的堆栈在什么时候使用了?请赐教

使用特权

评论回复
5
军用拖拉机|  楼主 | 2007-8-31 09:59 | 只看该作者

好象明白了

我刚才仔细看了一下uC/OS-II创建任务OSTaskCreate的代码,请高手看看我的理解对不对:在main()函数里进行各个任务堆栈设置后,每个任务的堆栈栈顶位置被保存到该任务控制块的OSTCBStkPtr中,在该任务第一次运行时,用OSTCBStkPtr保存的值设置当前SP值,如果任务都是在ARM的SVC模式下运行的,这样即可保证每个任务的SP和其它任务的SP不会冲突,那么在任务级切换的时候各个任务的寄存器值均被压入SVC模式的堆栈中,并且不会相互覆盖(如果为每个任务分配的堆栈够大的话),在中断级切换中,新的ISR打断的不是任务就是优先级低的ISR,考虑任务被打断的情况,SVC模式写运行的任务被IRQ中断后,系统进入IRQ模式,在找到被打断任务的CPSR和PC后,即可从IRQ模式返回到SVC模式,由于在运行该任务前,已经设置了该任务的SP指针,那么此时压栈操作就是将寄存器的值压到SVC模式堆栈中为该任务分配的那段堆栈中了。
现在我还有两个问题,一。:既然在上下文切换时每个任务需被保存的“环境”都一样大(即需要保存的寄存器数目一样多),那么有没有必要为每个任务设置不同长度的堆栈呢?二:在任务调度器运行某个任务之前用该任务堆栈的栈顶指针设置SP值,会不会这个被设置后的SP值已经不属于SVC模式下的堆栈范围内了呢??

使用特权

评论回复
6
jinan1861| | 2007-9-4 14:24 | 只看该作者

我也不明白

问题一:堆栈保存的不光要保存任务切换上下文,运行过程的局部变量也保存在堆栈中.
问题二:我也不是很明白svc的堆栈用来保存什么内容.

我的疑惑是:
既然任务都是运行svc模式下,且每个任务都有自己的堆栈,
那svc的堆栈有用吗?

使用特权

评论回复
7
ayb_ice| | 2007-9-5 07:53 | 只看该作者

堆栈的本质是后进先出,先进后出...

按LZ的意思,岂不乱了...
更何况局部变量也是堆栈,嵌套调用也要使用堆栈...

使用特权

评论回复
8
computer00| | 2007-9-5 08:46 | 只看该作者

ARM的任何RAM区都可以作为堆栈,你只要保证SP指在RAM区就可以

做为堆栈。

使用特权

评论回复
9
军用拖拉机|  楼主 | 2007-9-6 15:43 | 只看该作者

问一下7楼的

您的意思是不光是如果一个任务调用的嵌套越多,那么它所需要的堆栈也就越大,所以不同复杂度的任务应该有不同长度的堆栈,而复杂度的衡量标准之一就是看其涉及的嵌套的多少,可以这样理解吗?谢谢赐教!

使用特权

评论回复
10
ayb_ice| | 2007-9-6 16:47 | 只看该作者

回9楼...

这是基本的...

使用特权

评论回复
11
军用拖拉机|  楼主 | 2007-9-7 08:51 | 只看该作者

回8楼的

如果任务的堆栈和模式无关,只要保证在RAM中就行,那在ARM初始化的时候为SVC模式设置的堆栈有什么用处(假设任务是运行在SVC模式下)?据我观察,uC/OS-II在ARM上移植的各个版本有个共同点,就是若任务运行在某个模式下,那么该模式的堆栈一般都会设置的比较大,所以我任务为每个任务分配堆栈应该和任务所在的模式还是有关系的吧,请赐教

使用特权

评论回复
12
sodwell| | 2007-9-7 23:54 | 只看该作者

re

和模式没有关系,这个堆栈还要包括你使用的变量。你自己估计这个任务能用多大的内存你就大概给他多少。比如你搞个USB任务,不可能分10个bytes给他就行了吧。反正就是你认为它大它就大,你觉得它小它就小!

使用特权

评论回复
13
ruraliter| | 2007-9-9 10:11 | 只看该作者

用户态一定要在USR态

否则操作系统就没有意义了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝