这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » uCOSII任务堆栈深度?

共10条 1/1 1 跳转至

uCOSII任务堆栈深度?

高工
2014-03-14 20:55:38     打赏

    在uCOSii中,每一个任务都有一个独立的任务堆栈。那么:堆栈的深度该如何的设置更为合理呢?    

    堆栈作用的就是用来保存局部变量,从本质上讲也就是将CPU寄存器的值保存到RAM中。任务堆栈至始至终伴随着任务,与之生死与共,它的作用可以概括为两点:

    第一,当任务运行时,它用来保存一些局部变量;

    第二,当任务挂起时,它负责保存任务的运行现场,也就是CPU寄存器的值。

    在实际应用中和大部分的例程中有时会做“任务堆栈大小应是固定值”的默认处理。其实任务堆栈的大小和任务在系统中的实际状态有关的,平时讲的(变量的)初始化似乎指的是将变量的所有成员都一一初始化。而此处的堆栈的初始化仅仅是初始化了很大一个堆栈的一小部分,因为当前只有这部分是有用的,而剩余的大部分用不到,所以不用初始化,就像有些变量不用初始化一样(有默认值或随机值)。更深入一点考虑,当任务挂起时,任务堆栈中保存任务挂起前CPU寄存器的这一连续的区域肯定在整个堆栈的最上面;当任务重新开始运行时,SP弹出寄存器的值,这段区域变成空白的区域。而且,任务每次挂起前用来保存当前CPU寄存器这一连续区域在整个任务堆栈空间中是浮动的。

    讨论一下,如果堆栈初始化太小了,程序占用超过初始化值时会发生什么情况呢?

    堆栈相对于来说每一个任务来说就像是他的一个仓库,而任务运行的关键因素都保存在这个仓库中。每一个任务都有这样一个仓库。每一次任务决定放弃CPU时都会把自己的重要信息先保存到自己的仓库中。以便于下次再次获得CPU使用权时使用。如果堆栈较小,也就是仓库容量不足,就会出现两种可能,一个是自己重要的信息无法全部保存,此时会造成任务再次运行时得不到全部的资源而无法正常运行另外一种情况下占用了别的任务的仓库。第二种情况会修改别的任务的重要信息而造成别的任务无法正常运行。当任务无法正常运行时就会造成任务之间的相互干扰。最终导致系统的崩溃。所以堆栈的分配就至关重要。




关键词: uCOSII     任务堆栈    

院士
2014-03-14 23:05:36     打赏
2楼

这个堆会不会在编译的时候就会检查大小啊~~

比例 分配出去的容量已经超过堆的大小后,编译器就会告诉,您了余额不足~~


高工
2014-03-14 23:11:11     打赏
3楼

我在想任务堆栈和内存池

有点不清晰了


高工
2014-03-14 23:21:23     打赏
4楼

之前在使用ucos的时候就纠结过给每个任务分配多少的堆栈空间。大了怕浪费,小了又担心出问题。。就在网找解决的办法。最后大概是两种结论吧,第一是,创建任务时采用OSTaskCreateExt();第二是,先分配大一点,然后慢慢的去减小。


高工
2014-03-15 00:32:32     打赏
5楼
应该会检查,但是在余额足的情况下,是不是分配的越大越安全呢?

高工
2014-03-15 00:33:34     打赏
6楼
差不多,内存池也牵扯到大小的问题,我觉得可以参考程序应用来个大概值

高工
2014-03-15 00:35:27     打赏
7楼
第二种得实验多少次才能求得最优呢,第一种扩展创建任务的方式还没试过,学习下

工程师
2014-03-18 19:36:03     打赏
8楼
友情支持。

高工
2014-03-18 21:44:07     打赏
9楼
3Q

菜鸟
2014-07-29 12:02:12     打赏
10楼
同感

共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]