硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3378|回复: 8
收起左侧

[FreeRTOS] freertos的内存管理中的堆设置

[复制链接]

3

主题

28

回帖

37

积分

新手上路

积分
37
发表于 2017-9-24 19:40:19 | 显示全部楼层 |阅读模式
eric,你好

在使用MDK对stm32进行程序设计时,通过.s的汇编文件可以修改堆栈的大小。但是在采用heap4方案时,我在对应的map文件中并没有发现heap的分配。在采用heap3方案是,map文件中有heap的分配。
对此,并不是很明白。
难道在freertos中,采用heap4模式,汇编中的heap设置无效?
期待你的回答。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2017-9-25 09:16:53 | 显示全部楼层
详情可以看下我们FreeRTOS教程的动态内存管理章节:http://www.armbbs.cn/forum.php?mod=viewthread&tid=17658

对于heap4.c文件,他的全局动态内存就是个数组,即:
QQ截图20170925091320.png
回复

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2017-9-27 19:50:53 | 显示全部楼层
eric,你好,我还是疑惑为何选用heap4形式,用MDK编译代码生成的map文件中就不包含heap了,但是实际的汇编文件中设置了堆的大小。
例如,我现在自己设计程序,也不想使用heap,如何设置编译后的map不包含heap。
回复

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2017-9-27 19:57:51 | 显示全部楼层
heapForFreeRTOS.png
在附件的图中,除了heap3方式以外,freertos中的堆都是直接用的数组之类的形式,类似于全局变量,在bss段或者data段中。并非采用汇编中设置的heap。

但是编译器是如何忽略掉汇编中设置的堆呢?虽然汇编设置了堆,但是生成的map文件并不包含堆。
回复

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2017-9-28 21:00:31 | 显示全部楼层
虽然你没有回复,但是我依然把我的疑问回答上来吧。编译器是在使用malloc之类的函数时或者printf时自动生成heap,也就是说只要用到heap,那么汇编中的堆设置就有效,如果不使用,那么在map文件中就不会生成heap section。我的疑问解开了。如果有网友也有同样问题,希望能参考。
回复

使用道具 举报

6

主题

231

回帖

249

积分

高级会员

积分
249
发表于 2017-9-28 21:06:46 | 显示全部楼层

回 wyq200704 的帖子

wyq200704:虽然你没有回复,但是我依然把我的疑问回答上来吧。编译器是在使用malloc之类的函数时或者printf时自动生成heap,也就是说只要用到heap,那么汇编中的堆设置就有效,如果不使用,那么在map文件中就不会生成heap section。我的疑问解开了。如果有网友也有同样问题,希望能参考。 (2017-09-28 21:00)
你的理解是错误的。
.s中的heap对应CRT的malloc,FreeRTOS中的heap4是静态数组,跟malloc没有关系。
回复

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2017-9-29 08:59:28 | 显示全部楼层

回 novice 的帖子

novice:你的理解是错误的。
.s中的heap对应CRT的malloc,FreeRTOS中的heap4是静态数组,跟malloc没有关系。 (2017-09-28 21:06) 
嗯 你说的对。但是你和我理解的一样,请你仔细看我的留言。我的意思是代码中如果不使用堆heap,那么编译器不会给程序分配堆section,所以在map文件中找不到heap setcion。前提是你能看懂map文件,你要是不懂,也请你研究一下。

我的疑问是为何不产生heap section。我编译heap3的程序,heap3采用malloc方式申请的内存,所以申请的内在在汇编设置的堆中。而我编译heap4的程序时,由于程序中没有调用malloc,是以静态变量的形式申请的,所以没有占用.s中设置的heap空间,因此编译器生成可执行文件时直接忽略掉了heap section。希望你能理解我的意思。
回复

使用道具 举报

6

主题

231

回帖

249

积分

高级会员

积分
249
发表于 2017-9-29 15:01:33 | 显示全部楼层

回 wyq200704 的帖子

wyq200704:嗯 你说的对。但是你和我理解的一样,请你仔细看我的留言。我的意思是代码中如果不使用堆heap,那么编译器不会给程序分配堆section,所以在map文件中找不到heap setcion。前提是你能看懂map文件,你要是不懂,也请你研究一下。

我的疑问是为何不产生heap section。我编译heap3的 .. (2017-09-29 08:59)
s文件里面含有heap的初始化汇编代码,因此生成的*.o文件已经包含了对heap(地址)的引用,链接器无论如何聪明也是不敢删除它的。
回复

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2017-9-29 19:59:45 | 显示全部楼层
真的没有,你不信的话把prinft和malloc的函数删掉,自己创建一个新的工程,map文件中只有bss和data还有stack,确实没有heap section。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 05:38 , Processed in 0.245989 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表