昨天晚上碰到个ads下c库的malloc内存分配的问题。
程序一跑到malloc和memset就异常中断,一直都不知道原因。 今天查了些资料,稍微对ads下无os支持下的malloc有
了初步的认识。
一:堆的基地址
由于malloc是需要在堆空间上进行内存分配的,因此需要知道堆空间的基地址,而堆空间的地址一般
有2种方式获取:
1. 是由编译器默认获取,编译器会默认将堆的地址设置在ZI区的末端,也就是变量 IMAGE$$ZI$$LIMITE的值为
堆地址基地址。
2. 由scatter文件来设置。 看有些资料上说,如果用分散加载文件进行堆空间的划分,则需要进行堆栈空间的初始化
操作。也就是要需要进行 __user_initial_stackheap来设置堆栈地址
二。设置了堆栈地址,系统如何知道分配
要让系统在调用malloc的时候知道堆地址,有2种方式:
1. 调用c标准main函数,而非Main等。
系统在调用main函数的时候,会调用系统的__main函数,在这个函数里头获取系统的堆栈地址,比如
__user_initial_stackheap就是在这个时候进行调用,获取堆栈地址的。
2. 调用自定义Main函数
这个时候就需要自己设定堆栈地址,_init_alloc(base,top)来进行设置堆栈地址。
总结: 需要用系统的malloc函数的话,则需要让系统知道堆栈的空间, 如果用c的跳转接口用c标准main
函数的话,则不需要手动进行设置堆栈空间,如果用了分散加载文件就需要进行_user_intial_stackheap
初始化。
另外一个memset的问题,目前还不清楚,可能是memset的参数没有进行(void *)或者(char *)进行类型
转换。