标准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里面也找到了一句简单的说明,够简洁的

标准C堆初始化,RVDS4.0+6410初始化C堆malloc_第1张图片



最后开始测试一下看看

//第一次请求堆空间
	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);
	}

结果


结果可以看到申请的堆刚好都在定义的范围内,并且第一次申请的堆空间释放后第三次又被申请到了.


你可能感兴趣的:(malloc,OK6410,裸机,堆初始化,RVDS4.0)