標(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ù)進(jìn)行實(shí)現(xiàn)
//標(biāo)準(zhǔn)C堆支持 #include?"rt_heap.h" #pragma?import?(__use_realtime_heap) //這個函數(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里面也找到了一句簡單的說明,夠簡潔的
最后開始測試一下看看
//第一次請求堆空間 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); }
結(jié)果
結(jié)果可以看到申請的堆剛好都在定義的范圍內(nèi),并且第一次申請的堆空間釋放后第三次又被申請到了.