1308_探索FreeRTOS中的任务应该分配多大的堆栈空间

全部学习汇总: GitHub - GreyZhang/g_FreeRTOS: learning notes about FreeRTOS.

之前我使用FreeRTOS的时候遇到过很多次堆栈空间的问题,当时的项目时间紧急,一般来说我都是把堆栈的空间直接改大一点就结束了。而且,我的修改有时候简单粗暴,因为我用的MCU的资源相当丰富,估计我的项目用下来剩余的资源还是大半的那种。因此,我给每一个任务都分配了相同大小的堆栈空间,这样只要出错的时候我改一个数就可以了。

近段时间研究FreeRTOS的时候是想把这个RTOS的使用甚至是设计研究的深入一点,因此这一次我希望能够在理论上能够通过这一关。

其实,在最初我使用QEMU模拟环境来学习的时候这部分就已经看过了。当时的学习笔记: 1252_FreeRTOS_堆栈溢出检查方法与测试_grey_csdn的博客-CSDN博客_freertos堆栈溢出

这样,至少有一个明确的提示来告知我们是否有堆栈溢出的问题。

这个是我现在的工程中的具体配置情况,我把最小堆栈大小改成了64,而heap空间改成了2K,开启了堆栈溢出检测,也启用了堆栈水印的提取。

为什么修改注销的堆栈为64呢?其实,这个信息主要是用在idle task中。如果是仅仅存储通用寄存器,恰好是64个字节。自然,任务的堆栈也会保存任务的局部信息,但是这个可以直接从编码的角度避开。这样的配置之下,我的软件的运行提示效果如下:

以下是我的任务创建的代码,可以结合理解:

其中,每一个任务都分配了160个字节的空间,从现在的结果看,至少是看得出来现在的1000ms的任务堆栈空间是充足的但是500ms的任务堆栈空间不够。而且,整个系统已经出现了堆栈溢出,可能看到的信息都是错误的。接下来,我将进行相应的分配修改。为了能够看到正确的数值,我把heap以及每一个任务的堆栈空间都尽量调整大一些。heap改成了4096,而每一个任务的堆栈分配了256。

结合这段信息以及画出来的代码,可以知道这个4096其实是分配了4K的字节空间。

再查看一下人物创建的时候所指定的存储空间,这里的单位变了,不再是字节而是2字节。之前使用的时候,这里也一直没有弄清楚。这一次,直接在实际的工程中测试一下。

实际的软件测试中也能够看得出来,这个地方的存储分配其实是按照2个字节作为单位来分配的。这么看,其实我两个任务创建的时候就已经吃掉了1KB的RAM了。但是,从现在的堆栈水印值来看,其实只是用了一半。因此,可以在创建任务的时候稍微收敛一些。

这里水印值的获取,单位也不是字节而是word。从这一段描述看,其实我现在用的系统配置中默认的数据类型或许不是很正确。我查看代码找到了这是为了兼容之前的信息,可以做改写。接下来,我的系统配置中把堆栈的单位改成4个字节。相关的配置重新处理。

首先,配置文件中增加如上的71行的数据类型的替换配置。

创建任务的时候,先分配128看看情况。

结果,现在的软件中出现了堆栈溢出。接下来,还是得修改一下,每一个Task增加32个基础单位,也就是128个字节,这样一个任务分配160个4字节单元,之后看看效果。

这是目前的效果,多少让我有点感到疑惑。其实我的代码中,500ms的任务所处理的信息明显不如1000ms的多,但是现在的资源消耗上却没有符合这样的规律。而这样的测试以及梳理也让我看到了这个RTOS对于RAM的占用其实还是不小的。结合之前对于printf的分析,其实我觉得这里很大的一部分资源其实是被printf这个函数占用了。我尝试修改了printf的一部分资源占用,也的确看出来了改进的效果。

这样,综合上面的信息。如果是需要明确各个任务的堆栈分配,进而优化整个系统的存储使用是需要做几个配置调试的。首先得开启堆栈溢出检查,这样可以保证我们修改的配置最后是健壮的。另外,应该增加堆栈水印的获取功能,这样可以明确知道整个系统堆栈的使用情况。结合上面的信息,可以针对我们的系统实际应用进行针对性的优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值