ARM裸机开发中内存管理库RT_HEAP的使用
首先,应该初始化C堆,初始化代码如下
本文引用地址:https://www.eepw.com.cn/article/201611/318216.htm
#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文件哦
评论