单片机应用中,堆栈是个特殊存储区,堆栈属于RAM空间的一部分,堆栈用于函数调用、中断切换时保存和恢复现场数据。堆栈中的物体具有一个特性:第一个放入堆栈中的物体总是被最后拿出来,这个特性通常称为先进后出(FILO-First-In/Last-Out)。堆栈中定义了一些 *** 作,两个最重要的是PUSH和POP。PUSH(入) *** 作:堆栈指针(SP)加1,然后在堆栈的顶部加入一个元素。POP(出栈) *** 作相反,出栈则先将SP所指示的内部ram单元中内容送入直接地址寻址的单元中(目的位置),然后再将堆栈指针(SP)减1。这两种 *** 作实现了数据项的插入和删除。
RAM的特点就是高速存储。形象的说:堆栈是一种存储部件,即数据的写入跟读出不需要提供地址,而是根据写入的顺序决定读出的顺序 ;而在RAM中设置堆栈是为了存储程序运行过程中的变量或数据的;提高代码的执行速率。
例如:现在有一个函数调用了一个子函数;那么调用前的一些变量或数据就要放入堆栈中;当子函数执行完后又把变量或数据从中堆栈取出来。
但是你要注意堆和栈是两种不同的数据结构;
堆( *** 作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
栈( *** 作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 *** 作方式类似于数据结构中的栈
堆(数据结构):堆可以被看成是一棵树,如:堆排序
栈(数据结构):一种后进先出的的数据结构
首先来看第一个式子RAM总需求=应用程序的RAM需求+(任务栈需求+最多中断嵌套需求)*任务数
其中应用程序的RAM需求指的是应用程序的代码、数据这部分所占的内存,除去这一部分之外,ucos为每个任务分配了各自的任务栈,这个栈有两个作用:
1.用来保存函数调用信息(比如返回地址,局部参数等这些)
2.程序运行时可能会被中断所打断,此时需要保存现场,这也得靠这些栈来完成
但是问题出现了!中断是允许嵌套的,也就是说程序运行时可能会有很多中断一个接一个要处理,它们的信息都得保存在栈上。ucos为保险起见,不得不为每个任务都分配一个充分大的栈来保存所有这些信息。但是你知道RAM对于嵌入式系统十分宝贵,为了节约资源,提出了一种改进方案:
让所有应用程序共享一个中断嵌套栈,因为中段发生时应用程序不能切换,所以大家完全可以共用一个中断嵌套栈,这样一来,相当于把“(任务栈需求+最多中断嵌套需求)*任务数”括号中的中断栈移到了括号外,不再为每个任务都分别定义中断嵌套所需栈空间,结果节约了RAM。
引入这个改进后,公式就变成了:
RAM总需求=应用程序的RAM需求+内核数据区的RAM需求+各任务需求之和+最多中断嵌套栈需求
可以看到,“最多中断嵌套栈需求”被单独拿了出来,不再乘以任务数了,而基本的用于存储函数调用信息的栈空间还是每个任务都要有一个的,所以是“各任务需求之和”
不知道有没有说清楚,如有问题欢迎继续追问!
满意的话别忘了加分啊……
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)