对于 stm32c8t6 来说 rom 是64k ram 是 20k。使用静态库的libnosys.a 实现的_sbrk 函数 是可以使用malloc 和free的。但是有个问题就是没有边界检查。
ram 的范围是0x20000000-0x20005000,申请的内存会超过 0x20005000。这样就好引发HardFault_Handler 异常。
可以这样重定向_sbrk 函数。堆增长的时候可以检查是否跟当前的栈内服重叠。
caddr_t _sbrk(int increment)
{
extern char end asm("end"); //在ld文件定义 __bss_end__ , __end__ ,end
register char *pStack asm("sp"); //栈寄存器SP指针
static char *s_pHeapEnd;
if (!s_pHeapEnd)
s_pHeapEnd = &end;
if (s_pHeapEnd + increment > pStack) //跟当前栈内存重叠,申请失败 返回 -1
return (caddr_t)-1;
char *pOldHeapEnd = s_pHeapEnd;
s_pHeapEnd += increment;
return (caddr_t)pOldHeapEnd;
}
链接 参数 -mcpu=cortex-m3 -mthumb --specs=nano.specs --specs=nosys.specs