ARM处理器的分散加载及特殊应用研究

[11-20 15:54:43]   来源:http://www.88dzw.com  arm嵌入式   阅读:8318

文章摘要:注意:①每一个分散加载文件必须至少包含一个根区,每个根区的加载地址等于执行地址。②每一个引导区必须至少包含一个执行区,每一个执行区必须至少包含一个代码段或数据段;一个引导区可以包含几个执行区,每一个执行区只能属于一个引导区。4 分散加载时连接器生成的预定义符号在编译连接时如果指定了分散加载文件(.scf文件),在连接后会自动生成如下变量:5 重新实现_user_initial_stEickheap()函数分散加载机制提供了一种指定代码和静态数据布局的方法。使用分散加载时,必须重新放置堆栈和堆。应用程序的堆栈(stack)和堆(heap)是在C库函数初始化过程中建立起来的,在ADSl.2或更新版

ARM处理器的分散加载及特殊应用研究,标签:arm嵌入式系统,arm系统,http://www.88dzw.com


  注意:

  ①每一个分散加载文件必须至少包含一个根区,每个根区的加载地址等于执行地址。

  ②每一个引导区必须至少包含一个执行区,每一个执行区必须至少包含一个代码段或数据段;一个引导区可以包含几个执行区,每一个执行区只能属于一个引导区。

  4 分散加载时连接器生成的预定义符号

  在编译连接时如果指定了分散加载文件(.scf文件),在连接后会自动生成如下变量:


  5 重新实现_user_initial_stEickheap()函数

  分散加载机制提供了一种指定代码和静态数据布局的方法。使用分散加载时,必须重新放置堆栈和堆。

  应用程序的堆栈(stack)和堆(heap)是在C库函数初始化过程中建立起来的,在ADSl.2或更新版本中,在缺省状态下C库函数初始化代码会将连接器生成的符号Image$$ZI$$Limit地址作为堆的基地址。在分散加载时,连接器会将用户的__user_initidl_stackheap()函数代替C库函数默认的堆栈和堆初始化函数,并将其连接到用户的镜像文件中,用户可通过重新实现__user_initial_stackheap()函数来改变堆栈和堆的位置,从而适合自己的目标硬件。

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

  r0—堆基地址;

  r1—堆栈基地址;

  r2—堆长度限制值(需要的话);

  r3—堆栈长度限制值(需要的话)。

  当用户使用分散加载功能的时候,必须重新实现一user_initial_staacklaeap(),否则连接器会报错:

  Error:L6218E:Undefined symbol Imager$$ZI$$一Limit(referred from sys_stackheap.o)。

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


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

  (1)共用一个存储区

  汇编语言如下:


  这种方式定义的堆栈和堆共用一个存储区,采用相向的增长方向,如图3所示。


  (2)使用两个存储区

  汇编语言如下:



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

上一页  [1] [2] [3]  下一页


Tag:arm嵌入式arm嵌入式系统,arm系统arm嵌入式

《ARM处理器的分散加载及特殊应用研究》相关文章

分类导航
最新更新
热门排行