标准C堆初始化,RVDS4.0+6410初始化C堆malloc
扫描二维码
随时随地手机看文章
标准C堆初始化,RVDS4.0+6410初始化C堆malloc
之前试了很多次使用汇编初始化堆的方法,在KEIL上面可以,但是在RVDS4.0上面一直没有成功,今天找到了一种直接在C中初始化堆的方法.
首先汇编入口不做任何处理
;----------------------------------------------------------------------- ;跳入C语言主函数 ;----------------------------------------------------------------------- IMPORT main BL main B .
然后在C程序中添加头文件与编译器指令,同时将一个函数进行实现
//标准C堆支持 #include "rt_heap.h" #pragma import (__use_realtime_heap) //这个函数在rt_heap.h中声明,需要用户自己去实现,返回任意值 unsigned __rt_heap_extend(unsigned size, void **block) { return 0; }
最后在进入main函数后初始化堆空间,我用的是OK6410将内存最后100MB设置为堆空间
_init_alloc(0x56400000, 0x60000000-8); //初始化堆的范围
以上就完成了堆的初始化,现在就可以使用malloc了,当然别忘了释放.
在RVDS4.0里面也找到了一句简单的说明,够简洁的
最后开始测试一下看看
//第一次请求堆空间 p1 = (u8 *)malloc(1024); if((int)p1 == 0) { uart_printf("malloc error!rn"); } else { uart_printf("malloc ok = 0x%08Xrn",p1); } //第二次请求堆空间 p2 = (u8 *)malloc(1024); if((int)p2 == 0) { uart_printf("malloc error!rn"); } else { uart_printf("malloc ok = 0x%08Xrn",p2); } //释放第一次请求的堆空间 free(p1); //第三次请求堆空间 p3 = (u8 *)malloc(1024); if((int)p3 == 0) { uart_printf("malloc error!rn"); } else { uart_printf("malloc ok = 0x%08Xrn",p3); }
结果
结果可以看到申请的堆刚好都在定义的范围内,并且第一次申请的堆空间释放后第三次又被申请到了.