×
嵌入式 > 嵌入式开发 > 详情

ARM裸机开发中内存管理库RT_HEAP的使用

发布时间:2020-09-02 发布时间:
|
在使用arm芯片进行裸机开发的时候,很多时候都需要内存管理的功能,我们可以使用自己写的内存管理程序,也可以直接使用标准库,不过我一般比较喜欢标准库,速度快,今天就来说说在C语言环境下怎么样进行内存的动态使用

首先,应该初始化C堆,初始化代码如下

#include "malloc.h"#pragma import (__use_realtime_heap)//这个函数在rt_heap.h中声明,需要用户自己去实现,返回任意值  unsigned __rt_heap_extend(unsigned size, void **block)  {  return 0;  }  void MallocInit(void){_init_alloc(MALLOC_HEAP_ADDRESS_START,MALLOC_HEAP_ADDRESS_END);      //初始化堆的范围 }

这里面主要是几个工作,一个是导入运行库,第二是初始化C堆,其中定义了两个宏MALLOC_HEAP_ADDRESS_START和MALLOC_HEAP_ADDRESS_END

指示的是我们管理的堆的开始地址和结束地址,我的使用是这样(根据实际情况来)

#define MALLOC_HEAP_ADDRESS_START    SDRAM_BASE_ADDR#define MALLOC_HEAP_ADDRESS_END        SDRAM_BASE_ADDR+SDRAM_LENGTHunsigned __rt_heap_extend(unsigned size, void **block);void MallocInit(void);

这时候一般还不能编译过去,因为还需要一个错误报告函数,也就是库出现问题的时候把错误信息反馈出来的方式,一般可以选择串口打印,如下

//加入以下代码,支持printf函数,而不需要选择use MicroLIB      #pragma import(__use_no_semihosting)             //标准库需要的支持函数                 struct __FILE { int handle; }; FILE __stdout;       //定义_sys_exit()以避免使用半主机模式    _sys_exit(int x) { x = x; } _ttywrch(int ch)//这里就是我们要实现{ch = ch;}//重定义fputc函数 int fputc(int ch, FILE *f){      while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;}

这样就能够同时支持printf和动态内存管理了,

到这里,malloc和free函数就能够正常使用了,记得包含stdlib.h文件哦



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
发明专利在疫情影响下的逆势增长