mdk 启动代码 __user_initial_stackheap()解析

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。请勿用于商业用途,否则将追究法律责任。http://blog.csdn.net/wfq0624


详细可参考http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0206ic/Chdcgbjd.html

Realview 编译工具开发指南.pdf 【第三章】

使用分散载入描述文件(链接脚本文件)时,Image$$RW$$Base、Image$$RW$$Limit、Image$$RO$$Base、Image$$RO$$Limit、Image$$ZI$$Base 和Image$$ZI$$Limit 符号是未定义的。

因为默认的实现使用Image$$ZI$$Limit地址作为堆的基地址,所以使用分散加载文件,启动代码里一定要使用__user_initial_stackheap()来重新设置堆栈和堆

在分散加载时,连接器会将用户的__user_initial_stackheap()函数代替C库函数默认的堆栈和堆初始化函数,并将其连接到用户的镜像文件中,用户可通过重新实现__user_initial_stackheap()函数来改变堆栈和堆的位置,从而适合自己的目标硬件。

__user_initial_stackheap()可以用C或汇编语言来实现。它必须返回如下参数:

R0—堆基地址(heap base)

R1—堆栈基地址(Stack base)

R2—堆长度限制值(heap limit)

R3—堆栈长度限制值(Stacklimit)

当用户使用分散加载功能的时候,必须重新实现__user_initial_stackheap (),否则链接程序显示以下出错信息: Undefined symbol Image$$ZI$$Limit (referredfrom sys_stackheap.o)。

注:Image$$ZI$$Limit变量为零初始化段(ZI段)的末地址。未使用分散加载时,堆默认就定位在ZI段的末地址,如图2所示。


__user_initial_stackheap()函数的实现有两种方法。

共用一个存储区,汇编语言如下:

这种方式定义的堆栈和堆共用一个存储区,采用相向的增长方向

使用两个存储区,汇编语言如下:

这种方式定义的堆栈和堆分别采用两个不同存储区。堆栈采用向下增长,从地址0x40000到地址0x20000;堆采用向上增长,从地址0x28000000到地址0x28080000


你可能感兴趣的:(mdk 启动代码 __user_initial_stackheap()解析)