在使用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_LENGTH unsigned __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文件哦
时间: 2024-11-06 14:58:47