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

目录

  • 总结
  • 1、占用空间的区别
  • 2、用途的区别

总结

总结写在前面:

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、占用空间的区别

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

为什么是上面图示的样子,不理解的朋友先查看我另一篇博文关于内存问题的单独介绍 :STM32的内存管理相关(内存架构,内存管理,map文件分析)

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

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

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

2、用途的区别

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

FreeRTOS 的 任务栈

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

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

系统栈

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

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

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

相关知识博文:

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

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

嵌入式RTOS的 任务栈 和 系统栈相关推荐

  1. 系统栈与用户栈 以及 栈的内部实现

    系统栈(也叫核心栈.内核栈)是内存中属于操作系统空间的一块区域,其主要用途为:               (1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出: ...

  2. freeRTOS系统栈与任务栈

    中断过来之后,由任务栈切换到main stack(系统栈) 任务栈保存 系统栈的地址范围为0xfede8000 4K,向下生长,所以按照ld的定义,0xfede9000 开始,切换到系统栈 这样可以减 ...

  3. PythonStock(37)股票系统:Python股票系统发布V2.0版本,改个名字吧,叫Python全栈股票系统2.0,可以实现数据的抓取(akshare),统计分析,数据报表展示。

    目录 前言 1,关于Python全栈股票系统V2.0 2,在CSDN上居然有人给代码打包收费下载!! 2,更新docker镜像 3,总结 前言 使用Python开发一个web股票项目. [github ...

  4. 栈(stack)简单实现,系统栈是如何保存函数调用信息的?

    系统栈和栈 自己实现个栈很简单,但是用栈的思想在有时候比较抽象,尤其是在使用系统栈的时候(递归).栈的主要特点就像是你放很多大木板子在你的收纳盒里,模板放入后,每次只能取走最后放入的模板,是" ...

  5. SSI技术的前端动态实现(AJAX+SSI,适用于任何系统,包括搭载嵌入式RTOS的STM32系列开发板)

    SSI技术的前端动态实现(AJAX+SSI,适用于任何系统,包括搭载嵌入式RTOS的STM32系列开发板) 前言 RTOS简述及开发困难所在 开发环境 详细的解决方案 SSI初加载 基础的动态操作 伪 ...

  6. 用于时间序列异常值检测的全栈机器学习系统

    在本文中,我想介绍一个开源项目,用于构建机器学习管道以检测时间序列数据中的异常值.本文将简要介绍三种常见的异常值以及相应的检测策略.然后将提供基于两个支持的 API 的示例代码:用于开发时间序列异常值 ...

  7. 51单片机SP指向的系统栈中都有什么?LCALL、RETI等解析

    在调用函数时,也即当执行LCALL.ACALL等汇编指令时,硬件首先把PC指针压入到SP指向的系统栈(PC不可寻址,无法用程序出入栈,只能由硬件自动完成),随着函数调用链条不断加长,SP指向的系统栈被 ...

  8. PythonStock(38)全栈股票系统:Python全栈股票系统,使用vue进行前端界面开发,修改接口可以展示股票数据,持续开发中。

    目录 前言 0,关于Python全栈股票系统2.0,github,5.8K星星 1,Python全栈股票系统,更改使用elementUI开发 2,使用vue-element-admin,进行开发 3, ...

  9. 几种嵌入式RTOS的分析与比较

    几种嵌入式RTOS的分析与比较 http://tech.ddvip.com   2008年07月10日    社区交流 Sailor_forever  sailing_9806@163.com 整理  ...

最新文章

  1. 程序员的幸福:上个月被裁拿赔偿,这个月找到涨薪50%的工作
  2. UTF-8 BOM(EF BB BF)
  3. 2-Tenor AF AFT400-实战-Lync Server 2010-集成-2012-01-19
  4. EasyExcle使用小结
  5. php Xdebug的安装与使用详解
  6. WebCombo 客户端绑定数据
  7. php什么是静态类,三.PHP静态类
  8. 【Python】利用pip下载Django超时失败的解决方法
  9. css 滚动条样式_那些你总是记不住但又总是要用的css
  10. 动态BGP和静态BGP的含义与区别
  11. mysql ---- DQL(单表查询)
  12. 【NOIP1997】【codevs1219】骑士游历
  13. android之下载文件
  14. 如何制作统计报表(盈帆报表: efreprt.com)
  15. 12款网盘搜索神器以备不时之需要
  16. 最新版Unity安装和启动教程
  17. 【机器学习手册】【1】熟练使用向量矩阵和数组 —— 二维矩阵叉乘公式
  18. CentOS 5 全功能WWW服务器搭建全教程 V3.0 【转】
  19. c语言日历程序 带农历,一个完整的日历(含有农历)
  20. 帝国站长php主动推送,帝国CMS 链接主动推送插件设置帮助

热门文章

  1. 欧拉(Euler)定理
  2. uniapp 微信签名不对解决方案
  3. 什么样的企业需要舆情优化系统?什么样的企业需要手工监测?
  4. (十三)Java工具类StringUtils中strip、stripStart、stripEnd剥离方法源码详解
  5. 哦耶OYE-0001 OpenWrt路由器折腾记(by quqi99)
  6. kafka(一):kafka架构
  7. 时间格式处理获取本年份的起止时间
  8. android:ListView的局部刷新
  9. Latex【Error】Reference:Something‘s wrong--perhaps a missing \item. \end{thebibliography} 参考文献报错
  10. 美标 三段式、四段式 耳机头 以旧换新