野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21327|回复: 9

裸机下如何使用STM32的堆空间,不使用malloc等函数

[复制链接]
发表于 2020-8-26 21:02:10 | 显示全部楼层 |阅读模式
40火花
你好,请问如何在不使用库函数的前提下,使用!!!堆空间!!!存储数据,既然启动文件设置了HEAP的大小,那么一定有方法去使用它,当然使用ucos这些嵌入式系统是可以的,但是这些系统也是人写的,那么在没有这些系统的时候,如何使用HEAP的内存空间?有没有这方面的参考资料,百度全是说使用malloc?那没有malloc这种函数该怎么办呢?

最佳答案

查看完整内容

查看startup_stm32xxxxxx.s文件 获取默认堆的起始地址和结束地址,自己就能管理了
回复

使用道具 举报

发表于 2020-8-26 21:02:11 | 显示全部楼层
Yourmyheartbeat 发表于 2020-8-27 19:49
好的,谢谢,我在启动文件中有看到__heap_base堆的起始地址的标号,是否可以通过这个使用堆空间? ...

查看startup_stm32xxxxxx.s文件
  1. Heap_Size      EQU     0x200

  2.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
  3. __heap_base
  4. Heap_Mem        SPACE   Heap_Size
  5. __heap_limit

  6.                 PRESERVE8
  7.                 THUMB
复制代码

  1.                  IF      :DEF:__MICROLIB
  2.                
  3.                  EXPORT  __initial_sp
  4.                  EXPORT  __heap_base
  5.                  EXPORT  __heap_limit
  6.                
  7.                  ELSE
  8.                
  9.                  IMPORT  __use_two_region_memory
  10.                  EXPORT  __user_initial_stackheap
  11.                  
  12. __user_initial_stackheap

  13.                  LDR     R0, =  Heap_Mem
  14.                  LDR     R1, =(Stack_Mem + Stack_Size)
  15.                  LDR     R2, = (Heap_Mem +  Heap_Size)
  16.                  LDR     R3, = Stack_Mem
  17.                  BX      LR

  18.                  ALIGN

  19.                  ENDIF
复制代码
获取默认堆的起始地址和结束地址,自己就能管理了
回复

使用道具 举报

发表于 2020-8-27 10:49:22 | 显示全部楼层
要使用汇编程序把这个堆空间用起来就行了,不用的时候就会被编译器优化掉
回复

使用道具 举报

发表于 2020-8-27 12:45:48 | 显示全部楼层
是不是可以理解为自己写个malloc管理堆呢?
回复

使用道具 举报

发表于 2020-8-27 14:24:08 | 显示全部楼层
malloc这个是C库函数,与用什么系统没有任何关系的
一般keil iar gcc都会有个c库,里面malloc函数应该都是帮你封装好的,会没有吗?
不清楚你为什么不使用库函数。memset memcopy这类都不用,自己实现吗?
回复

使用道具 举报

 楼主| 发表于 2020-8-27 19:39:28 | 显示全部楼层
a5820736 发表于 2020-8-27 14:24
malloc这个是C库函数,与用什么系统没有任何关系的
一般keil iar gcc都会有个c库,里面malloc函数应该都是 ...

只是想了解malloc函数的底层实现机制,用函数很简单,但是得弄清楚内存的管理机制才能提升自己啊
回复

使用道具 举报

 楼主| 发表于 2020-8-27 19:44:56 | 显示全部楼层
lizimu 发表于 2020-8-27 12:45
是不是可以理解为自己写个malloc管理堆呢?

可以这么理解,但是不是使用大数组的方式,就是必须要用堆空间,有没有这种方法或者参考的资料?
回复

使用道具 举报

 楼主| 发表于 2020-8-27 19:49:26 | 显示全部楼层
Yuhailong 发表于 2020-8-27 10:49
要使用汇编程序把这个堆空间用起来就行了,不用的时候就会被编译器优化掉 ...

好的,谢谢,我在启动文件中有看到__heap_base堆的起始地址的标号,是否可以通过这个使用堆空间?
回复

使用道具 举报

发表于 2020-8-28 07:58:24 | 显示全部楼层
Yourmyheartbeat 发表于 2020-8-27 19:39
只是想了解malloc函数的底层实现机制,用函数很简单,但是得弄清楚内存的管理机制才能提升自己啊 ...

底层实现看cubeide生成的sbrk函数即可
回复

使用道具 举报

 楼主| 发表于 2020-8-31 12:45:26 | 显示全部楼层
lizimu 发表于 2020-8-28 17:13
查看startup_stm32xxxxxx.s文件

谢谢,已经实现了一版
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-3 03:04 , Processed in 0.041681 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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