标准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!\r\n");
}
else
{
uart_printf("malloc ok = 0x%08X\r\n",p1);
}
//第二次请求堆空间
p2 = (u8 *)malloc(1024);
if((int)p2 == 0)
{
uart_printf("malloc error!\r\n");
}
else
{
uart_printf("malloc ok = 0x%08X\r\n",p2);
}
//释放第一次请求的堆空间
free(p1);
//第三次请求堆空间
p3 = (u8 *)malloc(1024);
if((int)p3 == 0)
{
uart_printf("malloc error!\r\n");
}
else
{
uart_printf("malloc ok = 0x%08X\r\n",p3);
}
结果
结果可以看到申请的堆刚好都在定义的范围内,并且第一次申请的堆空间释放后第三次又被申请到了.