当前位置:首页 > 芯闻号 > 充电吧
[导读]标准C堆初始化,RVDS4.0+6410初始化C堆malloc之前试了很多次使用汇编初始化堆的方法,在KEIL上面可以,但是在RVDS4.0上面一直没有成功,今天找到了一种直接在C中初始化堆的方法.首

标准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);
	}


结果


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


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭