標(biāo)準(zhǔn)C堆初始化,RVDS4.0+6410初始化C堆malloc
標(biāo)準(zhǔn)C堆初始化,RVDS4.0+6410初始化C堆malloc
之前試了很多次使用匯編初始化堆的方法,在KEIL上面可以,但是在RVDS4.0上面一直沒有成功,今天找到了一種直接在C中初始化堆的方法.
首先匯編入口不做任何處理
;----------------------------------------------------------------------- ;跳入C語言主函數(shù) ;----------------------------------------------------------------------- IMPORT main ????????BL main B .
然后在C程序中添加頭文件與編譯器指令,同時(shí)將一個(gè)函數(shù)進(jìn)行實(shí)現(xiàn)
//標(biāo)準(zhǔn)C堆支持
#include?"rt_heap.h"
#pragma?import?(__use_realtime_heap)
//這個(gè)函數(shù)在rt_heap.h中聲明,需要用戶自己去實(shí)現(xiàn),返回任意值
unsigned?__rt_heap_extend(unsigned?size,?void?**block)
{
?????return?0;
}最后在進(jìn)入main函數(shù)后初始化堆空間,我用的是OK6410將內(nèi)存最后100MB設(shè)置為堆空間
_init_alloc(0x56400000,?0x60000000-8); //初始化堆的范圍
以上就完成了堆的初始化,現(xiàn)在就可以使用malloc了,當(dāng)然別忘了釋放.
在RVDS4.0里面也找到了一句簡(jiǎn)單的說明,夠簡(jiǎn)潔的
最后開始測(cè)試一下看看
//第一次請(qǐng)求堆空間
p1?=?(u8?*)malloc(1024);
if((int)p1?==?0)
{
uart_printf("malloc?error!rn");
}
else
{
uart_printf("malloc?ok?=?0x%08Xrn",p1);
}
//第二次請(qǐng)求堆空間
p2?=?(u8?*)malloc(1024);
if((int)p2?==?0)
{
uart_printf("malloc?error!rn");
}
else
{
uart_printf("malloc?ok?=?0x%08Xrn",p2);
}
//釋放第一次請(qǐng)求的堆空間
free(p1);
//第三次請(qǐng)求堆空間
p3?=?(u8?*)malloc(1024);
if((int)p3?==?0)
{
uart_printf("malloc?error!rn");
}
else
{
uart_printf("malloc?ok?=?0x%08Xrn",p3);
}
結(jié)果
結(jié)果可以看到申請(qǐng)的堆剛好都在定義的范圍內(nèi),并且第一次申請(qǐng)的堆空間釋放后第三次又被申請(qǐng)到了.





