標(biāo)準(zhǔn)C堆初始化,RVDS4.0+6410初始化C堆malloc
標(biāo)準(zhǔn)C堆初始化,RVDS4.0+6410初始化C堆malloc
之前試了很多次使用匯編初始化堆的方法,在KEIL上面可以,但是在RVDS4.0上面一直沒(méi)有成功,今天找到了一種直接在C中初始化堆的方法.
首先匯編入口不做任何處理
;----------------------------------------------------------------------- ;跳入C語(yǔ)言主函數(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)單的說(shuō)明,夠簡(jiǎn)潔的
最后開(kāi)始測(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)到了.