写点什么

嵌入式 RTOS 的 任务栈 和 系统栈

作者:矜辰所致
  • 2022 年 9 月 30 日
    江苏
  • 本文字数:1478 字

    阅读完需:约 5 分钟

嵌入式RTOS的 任务栈 和 系统栈
对于初学者来说,对于RTOS经常提到的任务栈和我们裸机编程说的栈经常傻傻分不清楚虽然我其他博文在有些地方提到过他们的区别,但还是单独写一篇文章描述一下,本文以FreeRTOS为例...更新一下 RT-Thread 分配空间的说明                             
复制代码


总结

总结写在前面:


FreeRTOS 任务栈 和 系统栈完全是两个不同的东西,在内存中的体现就是他们占用的是完全不同的内存区域。


FreeRTOS 的所有任务是在 FreeRTOS 最开始申请的内存一大片空间上面TOTAL_HEAP_SIZE,再次给每个任务分配不同的小空间,这每个不同的小空间就是 FreeRTOS 每个任务的任务栈,在 RAM 空间中,FreeRTOS 申请的这大片空间属于.bss段。而系统栈,我们申请的_Min_Stack_Size在 RAM 空间中,位置是在最后的部分,按照顺序排列.data-.bss-Heap-Stack。</font>


FreeRTOS 每个任务都有自己单独的栈空间,就是创建任务时候设置的大小,这个大小在内存中直接对应一篇内存空间 ,用来在任务切换的时候保存当前任务现场的内存空间,每一个任务都有一个自己的 PSP 指针。


系统栈 也是用来保存现场的,但是他用于 中断,库函数调用(比如 C 库函数),所有的中断都使用同一个栈空间,对于系统栈来说,他们使用的都是 MSP 指针。


额外说明,本文是以 FreeRTOS 为例,在 RT-Thread 系统中,不会预先定义堆的大小,他会把 .data 段 以及 系统 stack 占用的剩余所有空间都作为 堆,这个堆并不是系统堆,这个堆是受 RT-Thread 管理的"内存堆",RT-Thread 线程,申请动态空间都在这个内存堆空间中进行,统一管理。

1、占用空间的区别

下面来介绍一下,先来看一张图:



结合开头的总结,从上图可以看出来,FreeRTOS 的任务栈 和 系统栈 在 RAM 中的位置就是不一样的,如果跑的是裸机程序,上图中的 FreeRTOS 任务空间 那部分的空间是没有的,其他部分还是一样的,如下图:



为什么是上面图示的样子,不理解的朋友先查看我另一篇博文关于内存问题的单独介绍 :


STM32 的内存管理相关(内存架构,内存管理,map 文件分析)

https://xie.infoq.cn/article/625b2009e810086435349be30


我们也可以直接查看程序编译后的 .map 文件来证实上面的图片,我们先找到 RAM 区域,能看到和 FreeRTOS 有关的函数啊数据啊,所占用的 RAM 空间地址:



在.map 文件的最后,有系统栈 的地址:



其实上面的图示就很好的告诉了我们,系统栈就是系统栈,FreeRTOS 任务栈先不管他是怎么运作的,不管他是什么机制,在 RAM 里面 和系统栈的位置都不一样,完全是两个东西。

2、用途的区别

所谓栈,就是用来保存“现场”的东西。


FreeRTOS 的 任务栈


每个任务都有自己的栈空间,用来保存每个任务自己的现场。 函数总有被打断的时候,可能是中断来了,也可能是任务调度,也可能是自己调用函数,这些情况都需要保存自己的现场,就需要用到自己的任务栈。


(具体的分析,需要讲一大堆,在我其他的博文有些章节其实会有细说过相关知识,有时间的话,这里再来补充下)


系统栈


在裸机编程中,所有的“现场”保存都是用的系统栈,不管函数的调用,中断,中断嵌套。


在 FreeRTOS 中,中断使用的是系统栈。每一个 systick 中断都会使用到系统栈。


以下是个人理解,在系统中,只要开始了任务调度,除了中断,所有的调用,肯定都是在任务中进行的,只要在任务中进行,那么所有的函数调用需要保存的都是各个任务的现场,是用的任务栈。只有发生中断的时候用的是系统栈。


相关知识博文:


FreeRTOS 记录(三、FreeRTOS 任务调度原理解析_Systick、PendSV、SVC)

https://xie.infoq.cn/article/e0c671e5ca2d472ce40d272d4


STM32 的内存管理相关(内存架构,内存管理,map 文件分析)

https://xie.infoq.cn/article/625b2009e810086435349be30

发布于: 刚刚阅读数: 3
用户头像

矜辰所致

关注

CSDN、知乎、微信公众号: 矜辰所致 2022.08.02 加入

不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开! 为了活下去的嵌入式工程师,画画板子,敲敲代码,玩玩RTOS,搞搞Linux ...

评论

发布
暂无评论
嵌入式RTOS的 任务栈 和 系统栈_嵌入式_矜辰所致_InfoQ写作社区