新闻动态
你的位置:AG尊龙凯时官网 > 新闻动态 > 未来虫 嵌入式RTOS的任务栈和系统栈有什么区别?

未来虫 嵌入式RTOS的任务栈和系统栈有什么区别?

2025-02-04 19:30    点击次数:154

任务栈是指每个独立任务执行时所用的栈空间,用于存放任务执行时的上下文信息和临时数据,其大小和使用情况取决于任务的代码和操作。而系统栈则是整个嵌入式系统内核所使用的栈空间,用于保存进程/线程调用的一些临时变量和函数返回地址等信息,其大小一般在系统启动时就已经确定,并在系统运行期间不会改变。

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

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

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

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

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

1、占用空间的区别

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

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

2、用途的区别

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

FreeRTOS 的 任务栈

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

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

相关知识:

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

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

由于任务栈是每个任务私有的,并且随着任务的创建和销毁而动态变化,因此任务栈的大小和使用情况非常关键,如果栈大小不足或使用不当,可能会导致任务运行时堆栈溢出的问题。而系统栈则由整个系统共享,任何一个任务的堆栈溢出都可能会引起整个系统的异常或死机。

因此,在设计嵌入式系统时,需要谨慎地计算任务栈和系统栈的大小,并采用合适的算法和方法来防止堆栈溢出等问题的发生。



Powered by AG尊龙凯时官网 @2013-2022 RSS地图 HTML地图

Copyright Powered by站群 © 2013-2024