20552|3

155

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

Keil开发过程使用malloc申请动态内存问题 [复制链接]

在STM32F429上面运行FreeRTOS,在软件模块整合的过程中,发现多次malloc()后出现返回NULL的情形,开发板单独跑这一部分代码没有问题。感觉应该是Heap空间大小的问题,在网上寻找答案,发现提供的方法一般都是在启动.s文件中更改以下部分:

Heap_Size       EQU     0x010000 -->更改此处

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base

Heap_Mem        SPACE   Heap_Size

__heap_limit

此时使用的是Keil的MicroLib,使用的是非标准的C库。
不过之后测试发现,这样的更改并没有什么效果,观察编译后的.map文件  发现这段HEAP_SIZE声明的空间是被连接器移除。

勾选去掉use MicroLib,尝试使用标C库编译代码,这次虽然连接器分配了启动文件中设置的Heap空间,但发现代码在系统中根本无法运行,调试都到不了Main()。

结论:startup_stm32xxx.s中的HeapSize设置是给标准C库设计的。
在ARM Keil官方提供的说明文档中的方法:http://www.keil.com/support/man/ ... hr1358938939726.htm

Creating the heap for use with microlib

Home » The ARM C Micro-library » Creating the heap for use with microlib
2.7 Creating the heap for use with microlib
To use the heap functions, for example, malloc(), calloc(), realloc() and free(), you must specify the location and size of the heap region.

There are a number of methods you can use to specify the start and end of the heap.
Procedure
  • Use a scatter file.The scatter file method uses ARM_LIB_HEAP and ARM_LIB_STACKHEAP.
  • Define symbols __heap_base and __heap_limit. The __heap_limit symbol must point to the byte beyond the last byte in the heap region.

ExamplesTo set up the heap pointers using assembly language:
EXPORT __heap_base__heap_base EQU 0x400000        
; equal to the start of the heap   

EXPORT __heap_limit__heap_limit EQU 0x800000      

; equal to the end of the heapTo set up the heap pointer using embedded assembler in C:
__asm void dummy_function(void)

{   

EXPORT __heap_base

__heap_base EQU 0x400000      

; equal to the start of the heap   

EXPORT __heap_limit

__heap_limit EQU 0x800000      

; equal to the end of the heap

}


上面的方法并不奏效,在测试的过程中,编译链接后并没有因为更改__heap_limit ,__heap_base  使得链接后的文件的RW ZI有任何的变动。




现在的问题就是:如何在Keil 使用MicrLib的情况下设置Heap的大小?



还有一种解决方法还没有尝试,直接使用FreeRTOS提供的内存分配与回收函数---pvPortMalloc()和vPortFree(),这样的空大小应该直接可以从FreeRTOS的Config.h中配置, 使用上应该没有差别吧。




此帖出自stm32/stm8论坛

最新回复

MDK的malloc free 似乎不是可重入的, 小心使用.  详情 回复 发表于 2015-8-4 13:31
点赞 关注
 

回复
举报

165

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
.s文件后面好像是这个样子的:

                 IF      :DEF:__MICROLIB           
               
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
               
                 ELSE
               
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

按理说MicroLib是支持的.
此帖出自stm32/stm8论坛
 
 

回复

165

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
MDK的malloc free 似乎不是可重入的, 小心使用.
此帖出自stm32/stm8论坛
 
 

回复

155

帖子

1

TA的资源

一粒金砂(中级)

4
 
之后将启动文件重新替换了一下,就好了。。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表