在运用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文件哦