用MounRiver Studio做CH573的程序,關(guān)于內(nèi)存管理malloc()和free()的問題。

在Keil中,有兩個參數(shù)Stack_Size和Heap_Size可以設(shè)置,Heap_Size就是用來設(shè)置程序中內(nèi)存申請的最大空間,malloc()申請的內(nèi)存大小要小于Heap_Size,那么在MounRiver Studio中,這個參數(shù)在哪設(shè)置?

CH573 官方提供的example中,其棧 是從ram最高地址 向低處放, 用多少,并沒有嚴(yán)格的聲明一個大小出來,例程工程的LD文件里的_eusrstack 即為棧頂?shù)刂罚?/p>

	.stack?ORIGIN(RAM)+LENGTH(RAM)?:
	{
		.?=?ALIGN(4);
		PROVIDE(_eusrstack?=?.?);
	}?>RAM


而至于堆,

例程中,只是定義了其起始地址(LD 文件里):

PROVIDE( end = . );

這種參數(shù)將會在malloc之類的操作時候最終被調(diào)用:

代碼原型:https://github.com/riscv/riscv-newlib/blob/riscv-newlib-3.1.0/libgloss/libnosys/sbrk.c

由于默認(rèn)代碼中,只有起始地址,沒有結(jié)束地址約束,這樣最終會導(dǎo)致malloc永遠(yuǎn)都不會返回NULL.


至于解決你可以定義一個自己的這個函數(shù),然后ld文件里加一個自己的_sbrk 實(shí)現(xiàn)如:

函數(shù) 可以放在任意的工程的.c文件里:

void?*_sbrk(ptrdiff_t?incr)?{
??extern?char?_end[];
??extern?char?_heap_end[];
??static?char?*curbrk?=?_end;

??if?((curbrk?+?incr?<?_end)?||?(curbrk?+?incr?>?_heap_end))
????return?NULL?-?1;

??curbrk?+=?incr;
??return?curbrk?-?incr;
}

然后LD文件加入:


image.png

其中,上面的 0x800即為heap的大小.


參考:

https://github.com/riscv/riscv-gnu-toolchain/issues/571

https://github.com/lowRISC/ibex/issues/1415




謝謝回復(fù)?。?!


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频