0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

矜辰所致 来源:矜辰所致 作者:矜辰所致 2023-05-16 09:57 次阅读
对于初学者来说,对于RTOS经常提到的任务栈和我们裸机编程说的栈经常傻傻分不清楚
虽然我其他博文在有些地方提到过他们的区别,但还是单独写一篇文章描述一下

总结

总结写在前面:

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

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

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

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

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

1、占用空间的区别

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

图片.png

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

图片.png

为什么是上面图示的样子,不理解的朋友先查看我另一篇博文关于内存问题的单独介绍 :《STM32的内存管理相关(内存架构,内存管理,map文件分析)》,发烧友的小伙伴需要等等,我有时间也会发表到发烧友这边。

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

图片.png

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

图片.png

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

2、用途的区别

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

FreeRTOS 的 任务栈

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

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

系统栈

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RTOS
    +关注

    关注

    22

    文章

    811

    浏览量

    119593
  • 栈空间
    +关注

    关注

    0

    文章

    5

    浏览量

    5438
收藏 人收藏

    评论

    相关推荐

    嵌入式系统中USB-HOST协议该如何设计?

    USB协议的基本知识包括哪些?嵌入式系统中USB-HOST协议该如何设计?
    发表于 04-27 07:10

    嵌入式网络协议基础知识

    第2章 嵌入式网络协议基础知识本章教程为大家介绍嵌入式网络协议基础知识,本章先让大家有一个全面的认识,后面章节中会为大家逐一讲解用到的协议。基础知识整理自百度百科,wiki百科等。
    发表于 08-03 06:24

    介绍嵌入式网络协议基础知识

    第2章 嵌入式网络协议基础知识本章教程为大家介绍嵌入式网络协议基础知识,本章先让大家有一个全面的认识,后面章节中会为大家逐一讲解用到的协议。基础知识整理自百度百科,wiki百科等。
    发表于 08-04 08:17

    LwIP协议开发嵌入式网络的三种方法有何关系

    LwIP协议开发嵌入式网络的三种方法分析 轻量级的TCP/IP协议LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操作系统
    发表于 08-05 07:55

    什么是嵌入式网络协议

    什么是嵌入式网络协议
    发表于 10-13 07:33

    什么是嵌入式网络协议

    什么是嵌入式网络协议
    发表于 10-13 09:26

    什么是嵌入式网络协议

    什么是嵌入式网络协议
    发表于 10-13 08:42

    什么是堆?什么是

    嵌入式编程中,是一个很重要的概念,不管是裸机编程还是基于RTOS编程。函数形参、局部变量、函数调用现场的保护及返回地址、中断函数执行前线程保护及中断嵌套的现场的保护都依赖于空间。
    发表于 12-22 06:09

    主流的小型嵌入式网络协议

    新产品、新技术也是层出不穷,本章节就为大家介绍当前主流的小型嵌入式网络协议。目录第1章 当前主流的小型嵌入式网络协议1.1 当前主流的嵌入式
    发表于 12-23 06:18

    为什么嵌入式软件系统很难评估出所需的实际大小?

    为什么嵌入式软件系统很难评估出所需的实际大小?的原理为什么嵌入式软件系统很难评估出所需
    发表于 12-24 07:53

    嵌入式VxWorks网络协议的Mutiplexer接口及其使用方法

    嵌入式系统网络协议的灵活性在应用上是一个重要指标。介绍嵌入式实时操作系统VxWorks网络协议
    发表于 04-09 10:00 10次下载

    嵌入式TCPIP协议LWIP的内部结构

    分析了嵌入式 TCPIP协议主要对LWIP的基本结构,介绍了嵌入式TCPIP协议LWIP的内存管理方式,同时给出了对UDP、TCP、IP等协议的处理方法,最后给出了LWlP的应用层
    发表于 02-17 15:55 76次下载
    <b class='flag-5'>嵌入式</b>TCPIP协议<b class='flag-5'>栈</b>LWIP的内部结构

    嵌入式小型TCPIP协议

    一个专为嵌入式系统编写的小型TCP/IP协议 TCP/IPLean
    发表于 10-08 17:23 50次下载

    一个专为嵌入式系统编写的小型TCP IP协议

    一个专为嵌入式系统编写的小型TCP IP协议
    发表于 02-08 01:38 17次下载

    基于USB嵌入式主机

    基于USB嵌入式主机
    发表于 10-31 08:52 4次下载
    基于USB<b class='flag-5'>嵌入式</b>主机<b class='flag-5'>栈</b>