在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文件加入:
其中,上面的 0x800即為heap的大小.
參考:
https://github.com/riscv/riscv-gnu-toolchain/issues/571
https://github.com/lowRISC/ibex/issues/1415
謝謝回復(fù)?。?!