在Keil中,有两个参数Stack_Size和Heap_Size可以设置,Heap_Size就是用来设置程序中内存申请的最大空间,malloc()申请的内存大小要小于Heap_Size,那么在MounRiver Studio中,这个参数在哪设置?
CH573 官方提供的example中,其栈 是从ram最高地址 向低处放, 用多少,并没有严格的声明一个大小出来,例程工程的LD文件里的_eusrstack 即为栈顶地址:
.stack ORIGIN(RAM)+LENGTH(RAM) : { . = ALIGN(4); PROVIDE(_eusrstack = . ); } >RAM
而至于堆,
例程中,只是定义了其起始地址(LD 文件里):
PROVIDE( end = . );
这种参数将会在malloc之类的操作时候最终被调用:
代码原型:https://github.com/riscv/riscv-newlib/blob/riscv-newlib-3.1.0/libgloss/libnosys/sbrk.c
由于默认代码中,只有起始地址,没有结束地址约束,这样最终会导致malloc永远都不会返回NULL.
至于解决你可以定义一个自己的这个函数,然后ld文件里加一个自己的_sbrk 实现如:
函数 可以放在任意的工程的.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
谢谢回复!!!