微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 从ADS到RealView MDK(MDK ARM)

从ADS到RealView MDK(MDK ARM)

时间:11-10 来源:互联网 点击:

这样当6个32位寄存器进栈之后,堆栈就能满足64位对齐了。

例1

STMFD sp!,{r0-r3, lr} ; 将R0,R1,R2,R3,LR(奇数)寄存器入栈
……
STMFD sp!, {r0-r3, r12, lr}; 将偶数个寄存器入栈

② 在每个汇编文件的开头,添加“PRESERVE8”指令(见Ex2)。

例2

AREA Init, CODE, READONLY
……
PRESERVE8
AREA Init, CODE, READONLY

● 使用--apcs /adsabi编译选项

当用户没有该ADS遗留工程的全部源码,只拥有库文件或者目标文件时,可以通过--apcs/adsabi编译选项强制MDK的编译器产生复合ADS ABI要求的目标文件,以达到与遗留的ADS库文件、目标文件兼容的目的(ARM新工具将不会继续支持--apcs/adsabi选项。建议用户及时更新工具到最新版本)。

4 分散加载注意事项

MDK同样支持ADS的分散加载文件,但是当分散加载文件中涉及到必须被放置ROOT Region中的C库函数时,有时用户需要作少量修改。

ROOT Region的load address与execution address相同,所以这部分代码在系统初始化时无须进行搬移操作,很多库函数,如__scatter*.o或者__dc*.o,必须被放置在Root Region中。

例3 分散加载文件的修改;ADS 中的分散加载文件

ROM_LOAD 0x0
{
 ROM_EXEC 0x0
  { vectors.o (Vect, +First)
   __main.o (+RO)
   * (Region$$Table)
   * (ZISection$$Table)
  }
  RAM_EXEC 0x100000
  { *.o (+RO,+RW,+ZI) }
  }……;

MDK中的分散加载文件1; MDK中的分散加载文件2
ROM_LOAD 0x0 ROM_LOAD 0x0
{ {
ROM_EXEC 0x0 ROM_EXEC 0x0
{ {
vectors.o (Vect, +First) vectors.o (Vect, +First)
   * (InRoot$$Sections) __main.o(*)
} * (Region$$Table)
  RAM_EXEC 0x100000 __scatter*.o(*)
  { __dc*.o(*)
*.o (+RO,+RW,+ZI) }
} RAM_EXEC 0x100000
}
{ *.o (+RO,+RW,+ZI)}
  }

在ADS中,用户必须在分散加载文件中明确的将特定section代码放置在Root Region中。而MDK为了支持新的RW压缩机制,采用了新的region table格式,这种新的格式并不包含ZISection$$Table,而且新的scatter-loading (__scatter*.o) 与 decompressor (__dc*.o)必须被放置在root region中。所以EX3中ADS的分散加载文件应该被修改成新的形式。例3中提供了两种修改分散加载文件的方法,分散加载文件1通过 InRoot$$Sections自动将所有必须的库目标放至在root region中,而分散加载文件2则详细的注明了__scatter*.o与 __dc*.o的位置。

5 C库函数的差异

为了与新的ABI一致,MDK中的库函数名称与ADS可能会有不同。ADS中的__rt_*库函数被替换为__aeabi_*。如果用户的 ADS工程中曾经重定义(retarget)过这些库函数,那么在移植到MDK时,需要重新实现这些函数,以满足新ABI的要求。表3列出了部分函数的对应关系。

移植实例

结合以上对MDK与ADS差异的描述,本节将以实例的形式叙述如何将ADS1.2上的遗留代码移植到MDK上。

以Philip的LPC2294(ARM7TDMI)为处理器,将一个在ADS1.2上开发的由LPC2294控制LED闪烁的工程移植到 MDK上来。该工程(Legacy_ADS.mcp)共有4个源文件(Startμp.s、tartget.c、IRQ.s、main.c),以及一个分散加载文件(Scatterload)。

使用ADS1.2编译器,编译选项为:-O1 -g+;链接选项为:-info totals -entry 0x00000000 -scatter .\src\Scatterload.scf -info sizes,我们得到最终代码尺寸信息如下:

Total RO Size(Code + RO Data) 1640 (1.60kB)
Total RW Size(RW Data + ZI Data) 1128 (1.10kB)
Total ROM Size(Code + RO Data + RW Data) 1640 (1.60kB)

为了能够使用ARM新工具MDK的一系列特性,我们需要把ADS中的遗留工程移植到MDK上来。其具体步骤如下。

1 在MDK中新建工程

打开MDK,在主菜单中选择Project-->New…-->μVision Project,并给新工程命名为New_MDK.uv2并保存。

在MDK自动弹出的器件选择窗口(Select Device for Target)中选择该工程所对应的处理器型号,“LPC2294”。当MDK提示用户是否自动添加启动代码时,选择“否”。

2 添加源文件,并设置工程属性

将Legacy_ADS.mcp工程中所有的源文件都添加到新的New_MDK.uv2工程中来。单击工程属性快捷键,打开工程属性设置窗口,并选择C/C++标签页,设置编译器属性。用户可以根据以前ADS工程的编译属性设置,也可以根据当前具体需求重新设置编译属性。在本例中,我们将 ADS遗留工程的编译属性,“-O1 -g+”修改为“-O1 -g -W”后,复制到“Misc Controls”栏中来。这是因为

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top