在uCOSii中,每一个任务都有一个独立的任务堆栈。那么:堆栈的深度该如何的设置更为合理呢?
堆栈作用的就是用来保存局部变量,从本质上讲也就是将CPU寄存器的值保存到RAM中。任务堆栈至始至终伴随着任务,与之生死与共,它的作用可以概括为两点:
第一,当任务运行时,它用来保存一些局部变量;
第二,当任务挂起时,它负责保存任务的运行现场,也就是CPU寄存器的值。
在实际应用中和大部分的例程中有时会做“任务堆栈大小应是固定值”的默认处理。其实任务堆栈的大小和任务在系统中的实际状态有关的,平时讲的(变量的)初始化似乎指的是将变量的所有成员都一一初始化。而此处的堆栈的初始化仅仅是初始化了很大一个堆栈的一小部分,因为当前只有这部分是有用的,而剩余的大部分用不到,所以不用初始化,就像有些变量不用初始化一样(有默认值或随机值)。更深入一点考虑,当任务挂起时,任务堆栈中保存任务挂起前CPU寄存器的这一连续的区域肯定在整个堆栈的最上面;当任务重新开始运行时,SP弹出寄存器的值,这段区域变成空白的区域。而且,任务每次挂起前用来保存当前CPU寄存器这一连续区域在整个任务堆栈空间中是浮动的。
讨论一下,如果堆栈初始化太小了,程序占用超过初始化值时会发生什么情况呢?
堆栈相对于来说每一个任务来说就像是他的一个仓库,而任务运行的关键因素都保存在这个仓库中。每一个任务都有这样一个仓库。每一次任务决定放弃CPU时都会把自己的重要信息先保存到自己的仓库中。以便于下次再次获得CPU使用权时使用。如果堆栈较小,也就是仓库容量不足,就会出现两种可能,一个是自己重要的信息无法全部保存,此时会造成任务再次运行时得不到全部的资源而无法正常运行另外一种情况下占用了别的任务的仓库。第二种情况会修改别的任务的重要信息而造成别的任务无法正常运行。当任务无法正常运行时就会造成任务之间的相互干扰。最终导致系统的崩溃。所以堆栈的分配就至关重要。