您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

ARM仿真看ADS与RealView MDK比较

发布日期:2011-06-13

 realview mdk arm   realview mdk   realview mdk 下载   realview mdk介绍   realview mdk 破解  

        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,将终极代码固化在非易失性的存储器中了。

realview mdk4   realview mdk 4.20   realview mdk 3.5   realview mdk 4.12   arm ads realview mdk