用MounRiver Studio做CH573的程序,关于内存管理malloc()和free()的问题。

在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文件加入:


image.png

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


参考:

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

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




谢谢回复!!!


只有登录才能回复,可以选择微信账号登录