您的位置 首页 解答

从ADS到RealView MDK(MDK ARM)

Keil是业界最受欢迎的51单片机开发工具之一,它拥有流畅的用户界面与强大的仿真功能。而ARM微控制器的开发工具RealViewMicrocontroller…

Keil是业界最受欢迎的51单片机开发东西之一,它具有流通的用户界面与强壮的仿真功用。而ARM微操控器的开发东西RealView Microcontroller Development Kit (简称为RealView MDK 或许 MDK)将ARM开发东西RealView Development Suite(简称为 RVDS)的编译器RVCT与Keil的工程办理、调试仿真东西集成在一起。

许多嵌入式体系开发工程师对ARM的老版别开发东西ADS十分了解,而RealView MDK与ADS比较较,从外观、仿真流程以及内部二进制编译链接东西上都有了不少改善,用法稍有不同。本主的宗旨是介绍通用的流程,以及一些留意事项,协助ADS用户将老的、留传的ADS工程转化成在RealView MDK中进行开发调试的工程。
  
东西结构的改善

作为ARM的新一代微操控器开发东西,RealView MDK不光包括ARM的最新版别编译链接东西,即RVDS3.0的编译链接东西,并且依据微操控器调试开发的特色选用了与ADS、RVDS彻底不同的调试、仿真环境,μVision debugger与simulator。因而,MDK与ADS在东西架构组成上有一些不同,包括了不同的工程办理器,不同版别的ARM编译器(compiler),不同的调试器(debugger),不同的仿真器(simulator),以及不同的硬件调试单元(见表1)。

1编译东西例化方式

在ADS中,当用户需求将高档言语代码编译成方针文件时,需求依据方针机器码的不同(16位的Thumb代码或许32位的ARM代码),以及高档言语的不同(C代码或许C++代码)挑选不同的编译器可履行文件。RVCT3.0编译器则将它们悉数共同为armcc,只是经过不同的编译选项进行区别。表2较为详细的列出了其间的不同(表2中“默许的编译选项”是指在没有其他编译选项时编译器的缺省选项)。

2 POSIX格局

MDK集成了RVDS的编译东西RVCT,与ADS比较,除掉编译、链接东西的可履行二进制文件不同之外,两个不同版别编译器的许多编译链接选项也有所不同。有关编译链接选项的改变用户能够参阅ARM东西文档“RVCT Compiler and Libraries Guide中Table E-2 Mapping of compiler options。

RVCT选用了POSIX格局的编译链接选项,一切的多字符选项前有必要运用双下划线。例如:ADS的编译选项-cpu,在MDK中需求改写成–cpu,不然用户在MDK中直接运用ADS的makefile时,东西会发生一个如下正告:

Warning: L3910W: Old syntax, please use ‘–cpu’

3 ARM ABI的改变

ARM ABI是Application Binary Interface for the ARM Architecture的简称,是一系列ARM体系架构规范的调集,包括了ARM二进制代码交互、开发东西以及操作体系等方面。

对方针文件进行链接之前,MDK东西的链接器会严厉查看各个方针文件(objects),判别它们是否复合ARM体系结构的ABI规范。而 MDK与ADS编译链接东西所遵从的ARM ABI是不同版别的,所以将ADS的留传工程直接移植到MDK并进行链接时,用户或许会遇到如下的过错或许正告:

Error: L6238E: foo.o(.text) contains invalid call from‘~PRES8’function to ‘REQ8’ function
Warning: L6306W: ‘~PRES8’section foo.o(.text) should not use the address of ‘REQ8’ function foobar

这是因为新东西的ABI要求在函数调用时,体系有必要保证仓库指针8byte对齐,即每次进栈或许出栈的寄存器数目有必要为偶数。这是为了能够愈加高效的运用STM与LDR指令对“double”或许“long long”类型的数据进行拜访。而老的ARM开发东西ADS并没有考虑到新的ARM内核架构,其ABI关于仓库的操作只是要求4byte对齐。所以当用户将在ADS中编译链接成功的工程代码移植到MDK上,或许将老的、ADS留传的方针文件、库文件在新东西MDK中进行链接时,MDK的链接器就会报出以上的过错。

关于以上状况,用户能够经过简略修正代码偏从头编译链接,或许运用特别的编译选项来处理。

● 从头编译一切代码

当用户具有该ADS留传工程的一切源代码时,运用MDK从头编译链接悉数代码是最好的处理办法。MDK中的新版别编译东西会从头生成满意仓库8byte对齐要求的方针文件,防止因为仓库不对齐引起的链接过错。

当工程中包括汇编代码时,用户或许还需求做少数的代码修正。这些修正包括:

① 查看汇编源码中的指令,保证仓库操作指令是8byte对齐的。

如例1中,ADS的留传代码一次性将5个寄存器压栈,因为ARM的指令寄存器宽度为32位,即4byte,明显5个寄存器入栈之后,仓库指针不能够满意64位,8byte对齐。为了处理这种状况,咱们能够将别的一个并不需求压栈的寄存器、R12,一起压栈,这样当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”栏中来。这是因为因为编译器版别的改变,其对应的编译选项也有所改变的原因。留意:-W选项能够遏止一切的warning。

对ADS工程中的链接选项作恰当修正如下,使其复合POSIX格局。

–info totals –entry 0x00000000 –scatter .\src\Scatterload.scf –info sizes

挑选Linker标签,将修正过的链接选项仿制至MDK工程特点的Linker特点中,并单击“确认”按钮。

3 Build工程并恰当修正代码

当一切的工程特点都设置好之后,单击“Build all target file”快捷键,对整个工程进行编译链接。在MDK窗口的build输出一栏中,咱们会发现体系呈现了一个链接过错L6238E,这是因为MDK中新版别编译链接东西与ADS的老版别build东西选用不同的ABI形成的。

4 从头编译链接该工程

代码修正结束之后,单击“Build all target file”快捷键,对该工程进行二次编译链接。MDK将成功生成New_MDK.axf文件,并显现其代码尺度信息为:
Program Size: Code=”1576″ RO-data=64 RW-data=0 ZI-data=1128
这些信息相同能够从链接生成的New_MDK.map文件中得到。

5 代码调试与固化

与其他ARM开发东西比较较,MDK具有十分超卓的仿真功用,能够协助用户在纯软件的渠道上进行较为准确的调试。用户能够在工程特点设置窗口挑选simulator调试或许经过硬件调试东西(uLink)进行调试。

当挑选simμlator调试时,单击debμg快捷键,翻开simulator调试窗口。为了验证该程序在LPC2294硬件渠道上是否能够正确履行,经过GPIO口驱动LED进行循环闪耀,用户能够单击Peripherals->GPIO->Port2,将GPIO端口2的仿真界面翻开。

单击运转快捷键,能够看到在GPIO端口2的仿真调试窗口中,IO口的输出在不断的循环改变。

当程序经过了仿真调试之后,用户就能够经过MDK的硬件调试东西,uLink,将终究代码固化在非易失性的存储器中了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/275707.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部