ads 下 malloc堆分配问题

昨天晚上碰到个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 *)进行类型

转换。

你可能感兴趣的:(嵌入式,编译器,user,image,c,os)