求ARM开发工具arm ads1.2破解版下载安装包

C-Free中进行ARM开发(使用ADS1.2)
C-Free中进行ARM开发(使用ADS1.2)|最后更新
C-Free能够支持众多的C/C++编译器,除了我们知道的MinGW、Borland C++、Digital Mars和Open
Watcom C++、Ch等。我们将陆续根据大家的需要,介绍其他编译器在C-Free中集成、使用方法。
ARM ADS全称为ARM Developer
Suite,是ARM公司推出的新一代ARM集成开发工具。现在ADS的最新版本是1.2,它取代了早期的ADS1.1和ADS1.0。它可以安装在Windows
NT4,Windows 2000,Windows 98和Windows XP和Windows
Me操作系统。ADS由命令行开发工具,ARM实时库,GUI开发环境(Code Warrior和AXD),适用程序和支持软件组成。有了这些部件,用户就可以为ARM系列的RISC处理器编写和调试自己的应用程序。
虽然ADS1.2自带了的集成化开发工具(Code
Warrior),但是如果你想使用C-Free的强大功能,在C-Free中开发自己的ARM应用程序也是可行的。由于ADS包含的编译器都是以命令行的方式被使用的,因此,我们也很容易使这些编译器能够在C-Free中被使用。
下面的步骤帮助您在C-Free中配置、使用ADS编译器。
1、下载C-Free ADS开发包。
下载后,直接将此Zip包中的文件解压到C-Free的安装目录下。此开发包包含了(1)GCC-ARM和GCC-Thumb构建配置模版文件;(2)ARM应用程序的工程创建向导。
注:构建配置模版文件位于C-Free安装目录的data目录下;工程向导文件位于C-Free安装目录的templates目录下。
2、安装ADS1.2开发环境。在您的系统中安装ADS1.2环境,并且安装完成License,确保命令行工具能够使用。
3、在C-Free中配置ADS1.2。
(1)我们首先创建一个ARM或Thumb全局构建配置:
打开C-Free,选择“构建”-&“构建选项”菜单,弹出“构建选项”对话框,点击右上角的“&”符号按钮,在出现的菜单中,选择“新建配置”项,调出“新建构建配置”对话框。如下图所示:
编译器类型选择GCC-ARM或者GCC-Thumb,输入您希望的配置名称,如arm等。点击“确定”。出现“编译器位置”对话框,如下图。在这里你可以指定ADS的安装位置(告诉C-Free您ADS的安装位置),一般情况下,C-Free能够检测到您系统中的ADS安装位置。如果无法检测到,则请使用手动定位功能来指定ADS的安装位置。
“确定”后,C-Free会根据ADS的安装位置,自动设置好Include Files路径, Library
Files路径和Executable Files路径等。如下图:
点击确定,这样我们就完成了对ARM编译器的配置。同样如果您在编译器类型中选择了GCC-Thumb也就可以创建一个Thumb编译器的配置。
4、创建ARM应用程序。
进入“工程”菜单,选择“新建”选项,激活“新建工程”对话框。在工程类型中,我们选择“ARM”页,出现两种可供创建的工程类型“Executable
Image”和“Object Library”。如下图:
在对话框中,选择您希望创建的工程类型,并且指定工程名称和保存位置。点击确定后出现“选择程序类型”选择框,选择后,进入下一步,在这里我们选择应用于工程的构建配置。我们选择刚才创建的arm或者thumb,如下图所示。这样的话,创建完成的应用程序将能够用arm或者thumb编译器编译。你也可以在以后通过“工程设置”对话框来完成工程构建配置的添加、修改。
点击完成。完成了工程的创建。你可以往工程添加程序文件,管理程序文件,开发您的ARM应用程序。
5、运行ARM应用程序。下图是一个Hello World程序在AXD中的运行结果。
以上是作者对ADS1.2在C-Free中配置、使用的一个简要介绍。希望对您有一定的引导作用。由于作者对ADS的了解未深入,上面的介绍可能不能满足您的要求。如您仍有问题,请来信讨论:。谢谢!
& 版权所有.
保留所有权利从ADS1.2 到RV MDK移植
问题类别:ARM 开发工具 & MDK-ARM
浏览次数:1285
发布日期: 16:59:27
文章来源:米尔科技
回复日期: 16:11:14
MDK-ARM中国版3.05以上
ADS1.2与MDK-ARM中国版的比较,以及从ADS移植到MDK的过程
&&&&& 问题解答:&&&&& 1 概述&&&&& Keil是业界最好的51单片机开发工具之一,它拥有流畅的用户界面与强大的仿真功能。ARM将Keil公司收购之后,正式推出了针对AR
&&&&& 问题解答:&&&&& 1 概述&&&&& Keil是业界最好的51单片机开发工具之一,它拥有流畅的用户界面与强大的仿真功能。ARM将Keil公司收购之后,正式推出了针对ARM微控制器的开发工具RVMDK,它将ARM编译器RVCT与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM微控制器开发工具。2007年5月,ARM正式授权中国深圳英蓓特公司代理中文版RVMDK的出售事务。很多嵌入式系统开发工程师对ARM的老版本开发工具ADS1.2非常熟悉,而RVMDK与ADS相比较,从外观、仿真流程以及内部二进制编译链接工具上都有了不少改进,用法稍有不同。本主的主旨是介绍通用的流程,以及一些注意事项,帮助ADS1.2用户将老的,遗留的ADS1.2工程转化成在RVMDK上进行开发调试的工程。&&&&& 2 工具结构的改进&&&&& ARM新推出的微控制器开发工具RVMDK与ADS1.2在工具架构组成上有一些不同,这些区别包括:不同版本的ARM编译器(compiler),不同的调试器(debugger),不同的仿真器(simulator),以及不同的硬件调试单元。作为ARM的新一代微控制器开发工具,RVMDK不但包含ARM的最新版本编译链接工具,即RVDS3.0的编译链接工具,而且根据微控制器调试开发的特点采用了与ADS,RVDS完全不同的调试、仿真环境,uVision debugger 与simulator。&&&&&& RVMDK集成了RVDS3.0的编译工具RVCT3.0,与ADS1.2相比,除去编译、连接工具的可执行二进制文件不同之外,RVCT3.0的很多编译连接选项与ADS编译器也有不同。&&&&& 2.1 POSIX格式&&&&& RVCT3.0采用了POSIX格式的编译连接选项,所有的多字符选项前必须使用双下划线。例如:ADS的编译选项-cpu,在RVMDK中需要改写成--cpu,否则用户在RVMDK中直接使用ADS的makefile时,工具会产生一个如下警告:&&&&& Warning: L3910W: Old syntax, please use ‘--xxx’&&&&& 2.2 编译器例化形式&&&&& 在ADS中,当用户需要将高级语言代码编译成目标文件时,需要根据目标机器码的不同(16位的Thumb代码或者32位的ARM代码),以及高级语言的不同(C代码或者C++代码)选择不同的编译器可执行文件;RVCT3.0编译器则将它们全部统一为armcc,仅仅通过不同的编译选项进行区分。表1较为详细的罗列了其中的差别。
表1 RVMDK与ADS编译器的例化形式对比ADS1.2 RVMDK3.0 默认的编译选项 armcc armcc --c90 –arm Tcc armcc –thumb --c90 armcpp armcc --cpp --arm Tcpp armcc --thumb --cpp&
注&&&&& 表1中“默认的编译选项”是指在没有其它编译选项时指编译器的缺省选项。&&&&& 2.3 连接器的使用&&&&& 对目标文件进行链接之前,ARM工具的连接器会严格检查各个文件(objects),判断它们是否复合ARM体系结构的ABI表准。由于RVCT与ADS编译链接工具所遵循的ARM ABI不同,所以将ADS的遗留工程直接移植到RVMDK并进行连接时,用户可能会遇到如下的错误或者警告:
Error: L6238E: foo.o(.text) contains invalid call from '~PRES8' function to 'REQ8' functionWarning: 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中编译连接成功的工程代码移植到RVMDK上,或者将老的、ADS遗留的目标文件、库文件在新工具RVMDK中进行连接时,RVMDK的连接器就会报出以上的错误。&&&&&& 对于以上情况,用户可以通过简单修改代码并重新编译链接,或者使用特殊的编译选项来解决。&&&&& 2.3.1&& 重新编译所有代码&&&&& 当用户拥有该ADS遗留工程的所有源代码时,使用RVMDK重新编译链接全部代码是最好的解决方法。RVMDK中的新版本编译工具会重新生成满足堆栈8byte对齐要求的目标文件,避免由于堆栈不对齐引起的连接错误。当工程中包含汇编代码时,用户可能还需要做少量的代码修改。这些修改包括:1)&&&&&&& 检查汇编源码中的指令,确保堆栈操作指令是8byte对其的。如Ex1中,ADS的遗留代码一次性将5个寄存器压栈,由于ARM的指令寄存器宽度为32位,即4byte,显然5个寄存器入栈之后,堆栈指针不能够满足64位,8byte对齐。为了解决这种情况,我们可以将另外一个并不需要压栈的寄存器,R12,同时压栈,这样当6个32位寄存器进栈之后,堆栈就能满足64位对齐了。Ex.1&&&&&& STMFD sp!, {r0-r3, lr}&&&&&&&&&&&&& ; 将R0,R1,R2,R3,LR(奇数)寄存器入栈êSTMFD sp!, {r0-r3, r12, lr}&&&&&& ; 将偶数个寄存器入栈2)&&&&&&& 在每个汇编文件的开头,添加“PRESERVE8”指令。见Ex2。Ex.2 &&&&&&& AREA Init, CODE, READONLYê&&&&&&& PRESERVE8&&&&&&& AREA Init, CODE, READONLY&&&&& 2.3.2&&& 使用--apcs /adsabi编译选项&&&&& 当用户没有该ADS遗留工程的全部源码,只拥有库文件或者目标文件时,可以通过--apcs/adsabi编译选项强制RVMDK的编译器产生复合ADS ABI要求的目标文件,以达到与遗留的ADS库文件、目标文件兼容的目的。注&&&&& ARM新工具将不会继续支持--apcs/adsabi选项。建议用户及时更新工具到最新版本。&&&&& 2.4 分散加载文件&&&&& RVMDK同样支持ADS的分散加载文件,但是当分散加载文件中涉及到必须被放置ROOT Region中的C库函数时,有时用户需要作少量修改。ROOT Region的load address与execution address相同,所以这部分代码在系统初始化时无需进行搬移操作,很多库函数,如__scatter*.o或者__dc*.o,必须被放置在Root Region中。Ex.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)&&& }}ê; RVMDK中的分散加载文件1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; RVMDK中的分散加载文件2ROM_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中。而RVMDK为了支持新的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的位置。&&&&& 2.5 C库函数的差异&&&&& 为了与新的ABI一致,RVMDK中的库函数名称与ADS可能会有不同。ADS中的__rt_*库函数被替换为__aeabi_*。如果用户的ADS工程中曾经修改(retarget)过这些库函数,那么在移植到RVMDK时,需要重新实现这些函数,以满足新ABI的要求。表2列出了部分函数的对应关系。表2 部分库函数对比ADS库函数 RVMDK库函数 __rt_memcpy_w __aeabi_memcpy4 __rt_div0 __aeabi_idiv0 __rt_sdiv __aeabi_idiv __rt_udiv __aeabi_uidiv __rt_fp_status_addr __aeabi_fp_status_addr __rt_errno_addr __aeabi_errno_addr
&&&&& 3. 移植实例&&&&& 结合以上对RVMDK与ADS差异的描述,本小节将以实例的形式叙述如何将ADS1.2上的遗留代码移植到RVMDK上。&&&&&& 以Philip的LPC2294(ARM7TDMI)为处理器,将一个在ADS1.2上开发的由LPC2294控制LED闪烁的工程移植到RVMDK上来。由图1可以看出,该工程(Legacy_ADS.mcp)共有4个源文件(Startup.s、tartget.c、IRQ.s、main.c),以及一个分散加载文件(Scatterload)。
&&&&&& 图1 ADS遗留工程使用ADS1.2编译器,编译选项为:-O1 –g+链接选项为:-info totals -entry 0x -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新工具RVMDK的一系列特性,我们需要把ADS中的遗留工程移植到RVMDK上来。其具体步骤如下:&&&&& 1) 在RVMDK中新建工程&&&&& 打开RVMDK,在主菜单中选择ProjectàNew…àuVision Project,并给新工程命名为New_MDK.uv2,单击“保存”,见图2。图2 在RVMDK中新建工程在RVMDK自动弹出的器件选择窗口(Select Device for Target)中选择该工程所对应的处理器型号,“LPC2294”,并单击“确定”,见图3。当RVMDK提示用户是否自动添加启动代码时,选择“否”。图3 在RVMDK中选择合适的处理器&&&&& 2) 添加源文件,并设置工程属性将Legacy_ADS.mcp工程中所有的源文件都添加到新的New_MDK.uv2工程中来,见图4。图4 将ADS工程的遗留源代码全部添加到新工程中&&&&&& 单击工程属性快捷键 ,打开工程属性设置窗口,并选择C/C++标签页,设置编译器属性。用户可以根据以前ADS工程的编译属性设置,也可以根据当前具体需求重新设置编译属性。在本例中,我们将ADS遗留工程的编译属性,“-O1 -g+”修改为“-O1 -g -W”后,拷贝到“Misc Controls”栏中来,见图5。这是因为由于编译器版本的变化,其对应的编译选项也有所变化的缘故。注&&&&& -W选项可以抑止所有的warning。图5 编译选项的设置图6 链接选项的设置&&&&&& 对ADS工程中的链接选项作适当修改如下,使其复合POSIX格式。--info totals --entry 0x --scatter .\src\Scatterload.scf --info sizes选择Linker标签,将修改过的链接选项拷贝至RVMDK工程属性的Linker属性中,并单击“确定”,见图6。&&&&& 3)Build工程并适当修改代码&&&&& 当所有的工程属性都设置好之后,单击“Build all target file”快捷键 ,对整个工程进行编译链接。在RVMDK窗口的build输出一栏中,我们会发现系统出现了一个链接错误L6238E,见图7,这是由于RVMDK中新版本编译链接工具与ADS的老版本build工具采用不同的ABI造成的(详见本文2.3小节)。图7 链接错误L6238E&&&&&& 为此我们打开该工程中的汇编文件startup.s,在该程序第55行添加PRESERVE8指令,如下所示:&&& CODE32&&& PRESERVE8&&& AREA&&& vectors,CODE,READONLY
&&&&& 4) 重新编译链接该工程代码修改完毕之后,单击“Build all target file”快捷键 ,对该工程进行二次编译连接。RVMDK将成功生成New_MDK.axf文件,并显示其代码尺寸信息为:Program Size: Code=1576& RO-data=64 RW-data=0 ZI-data=1128&&&&& 5) 工程调试与其它ARM开发工具相比较,RVMDK拥有非常出色的仿真功能,可以帮助用户在纯软件的平台上进行较为精确的调试。用户可以在工程属性设置窗口选择simulator调试(见图8)或者通过硬件调试工具(uLink)进行调试。图8 选择uVision Simulator作为调试平台&&&&&& 当选择simulator调试时,单击debug快捷键 ,打开simulator调试窗口,见图9。为了验证该程序在LPC2294硬件平台上是否能够正确执行,通过GPIO口驱动LED进行循环闪烁,用户可以单击Peripherals-&GPIO-&Port2,将GPIO端口2的仿真界面打开,见图9。图9 RVDMK调试环境&&&&&& 单击运行快捷键 ,可以看到在GPIO端口2的仿真调试窗口中,IO口的输出在不停的循环变化。
M微控制器的开发工具RVMDK,它将ARM编译器RVCT与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM微控制器开发工具。2007年5月,ARM正式授权中国深圳英蓓特公司代理中文版RVMDK的出售事务。很多嵌入式系统开发工程师对ARM的老版本开发工具ADS1.2非常熟悉,而RVMDK与ADS相比较,从外观、仿真流程以及内部二进制编译链接工具上都有了不少改进,用法稍有不同。本主的主旨是介绍通用的流程,以及一些注意事项,帮助ADS1.2用户将老的,遗留的ADS1.2工程转化成在RVMDK上进行开发调试的工程。&&&&& 2 工具结构的改进&&&&& ARM新推出的微控制器开发工具RVMDK与ADS1.2在工具架构组成上有一些不同,这些区别包括:不同版本的ARM编译器(compiler),不同的调试器(debugger),不同的仿真器(simulator),以及不同的硬件调试单元。作为ARM的新一代微控制器开发工具,RVMDK不但包含ARM的最新版本编译链接工具,即RVDS3.0的编译链接工具,而且根据微控制器调试开发的特点采用了与ADS,RVDS完全不同的调试、仿真环境,uVision debugger 与simulator。&&&&&& RVMDK集成了RVDS3.0的编译工具RVCT3.0,与ADS1.2相比,除去编译、连接工具的可执行二进制文件不同之外,RVCT3.0的很多编译连接选项与ADS编译器也有不同。&&&&& 2.1 POSIX格式&&&&& RVCT3.0采用了POSIX格式的编译连接选项,所有的多字符选项前必须使用双下划线。例如:ADS的编译选项-cpu,在RVMDK中需要改写成--cpu,否则用户在RVMDK中直接使用ADS的makefile时,工具会产生一个如下警告:&&&&& Warning: L3910W: Old syntax, please use ‘--xxx’&&&&& 2.2 编译器例化形式&&&&& 在ADS中,当用户需要将高级语言代码编译成目标文件时,需要根据目标机器码的不同(16位的Thumb代码或者32位的ARM代码),以及高级语言的不同(C代码或者C++代码)选择不同的编译器可执行文件;RVCT3.0编译器则将它们全部统一为armcc,仅仅通过不同的编译选项进行区分。表1较为详细的罗列了其中的差别。
表1 RVMDK与ADS编译器的例化形式对比ADS1.2 RVMDK3.0 默认的编译选项 armcc armcc --c90 –arm Tcc armcc –thumb --c90 armcpp armcc --cpp --arm Tcpp armcc --thumb --cpp&
注&&&&& 表1中“默认的编译选项”是指在没有其它编译选项时指编译器的缺省选项。&&&&& 2.3 连接器的使用&&&&& 对目标文件进行链接之前,ARM工具的连接器会严格检查各个文件(objects),判断它们是否复合ARM体系结构的ABI表准。由于RVCT与ADS编译链接工具所遵循的ARM ABI不同,所以将ADS的遗留工程直接移植到RVMDK并进行连接时,用户可能会遇到如下的错误或者警告:
Error: L6238E: foo.o(.text) contains invalid call from '~PRES8' function to 'REQ8' functionWarning: 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中编译连接成功的工程代码移植到RVMDK上,或者将老的、ADS遗留的目标文件、库文件在新工具RVMDK中进行连接时,RVMDK的连接器就会报出以上的错误。&&&&&& 对于以上情况,用户可以通过简单修改代码并重新编译链接,或者使用特殊的编译选项来解决。&&&&& 2.3.1&& 重新编译所有代码&&&&& 当用户拥有该ADS遗留工程的所有源代码时,使用RVMDK重新编译链接全部代码是最好的解决方法。RVMDK中的新版本编译工具会重新生成满足堆栈8byte对齐要求的目标文件,避免由于堆栈不对齐引起的连接错误。当工程中包含汇编代码时,用户可能还需要做少量的代码修改。这些修改包括:1)&&&&&&& 检查汇编源码中的指令,确保堆栈操作指令是8byte对其的。如Ex1中,ADS的遗留代码一次性将5个寄存器压栈,由于ARM的指令寄存器宽度为32位,即4byte,显然5个寄存器入栈之后,堆栈指针不能够满足64位,8byte对齐。为了解决这种情况,我们可以将另外一个并不需要压栈的寄存器,R12,同时压栈,这样当6个32位寄存器进栈之后,堆栈就能满足64位对齐了。Ex.1&&&&&& STMFD sp!, {r0-r3, lr}&&&&&&&&&&&&& ; 将R0,R1,R2,R3,LR(奇数)寄存器入栈êSTMFD sp!, {r0-r3, r12, lr}&&&&&& ; 将偶数个寄存器入栈2)&&&&&&& 在每个汇编文件的开头,添加“PRESERVE8”指令。见Ex2。Ex.2 &&&&&&& AREA Init, CODE, READONLYê&&&&&&& PRESERVE8&&&&&&& AREA Init, CODE, READONLY&&&&& 2.3.2&&& 使用--apcs /adsabi编译选项&&&&& 当用户没有该ADS遗留工程的全部源码,只拥有库文件或者目标文件时,可以通过--apcs/adsabi编译选项强制RVMDK的编译器产生复合ADS ABI要求的目标文件,以达到与遗留的ADS库文件、目标文件兼容的目的。注&&&&& ARM新工具将不会继续支持--apcs/adsabi选项。建议用户及时更新工具到最新版本。&&&&& 2.4 分散加载文件&&&&& RVMDK同样支持ADS的分散加载文件,但是当分散加载文件中涉及到必须被放置ROOT Region中的C库函数时,有时用户需要作少量修改。ROOT Region的load address与execution address相同,所以这部分代码在系统初始化时无需进行搬移操作,很多库函数,如__scatter*.o或者__dc*.o,必须被放置在Root Region中。Ex.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)&&& }}ê; RVMDK中的分散加载文件1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; RVMDK中的分散加载文件2ROM_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中。而RVMDK为了支持新的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的位置。&&&&& 2.5 C库函数的差异&&&&& 为了与新的ABI一致,RVMDK中的库函数名称与ADS可能会有不同。ADS中的__rt_*库函数被替换为__aeabi_*。如果用户的ADS工程中曾经修改(retarget)过这些库函数,那么在移植到RVMDK时,需要重新实现这些函数,以满足新ABI的要求。表2列出了部分函数的对应关系。表2 部分库函数对比ADS库函数 RVMDK库函数 __rt_memcpy_w __aeabi_memcpy4 __rt_div0 __aeabi_idiv0 __rt_sdiv __aeabi_idiv __rt_udiv __aeabi_uidiv __rt_fp_status_addr __aeabi_fp_status_addr __rt_errno_addr __aeabi_errno_addr
&&&&& 3. 移植实例&&&&& 结合以上对RVMDK与ADS差异的描述,本小节将以实例的形式叙述如何将ADS1.2上的遗留代码移植到RVMDK上。&&&&&& 以Philip的LPC2294(ARM7TDMI)为处理器,将一个在ADS1.2上开发的由LPC2294控制LED闪烁的工程移植到RVMDK上来。由图1可以看出,该工程(Legacy_ADS.mcp)共有4个源文件(Startup.s、tartget.c、IRQ.s、main.c),以及一个分散加载文件(Scatterload)。
&&&&&& 图1 ADS遗留工程使用ADS1.2编译器,编译选项为:-O1 –g+链接选项为:-info totals -entry 0x -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新工具RVMDK的一系列特性,我们需要把ADS中的遗留工程移植到RVMDK上来。其具体步骤如下:&&&&& 1) 在RVMDK中新建工程&&&&& 打开RVMDK,在主菜单中选择ProjectàNew…àuVision Project,并给新工程命名为New_MDK.uv2,单击“保存”,见图2。图2 在RVMDK中新建工程在RVMDK自动弹出的器件选择窗口(Select Device for Target)中选择该工程所对应的处理器型号,“LPC2294”,并单击“确定”,见图3。当RVMDK提示用户是否自动添加启动代码时,选择“否”。图3 在RVMDK中选择合适的处理器&&&&& 2) 添加源文件,并设置工程属性将Legacy_ADS.mcp工程中所有的源文件都添加到新的New_MDK.uv2工程中来,见图4。图4 将ADS工程的遗留源代码全部添加到新工程中&&&&&& 单击工程属性快捷键 ,打开工程属性设置窗口,并选择C/C++标签页,设置编译器属性。用户可以根据以前ADS工程的编译属性设置,也可以根据当前具体需求重新设置编译属性。在本例中,我们将ADS遗留工程的编译属性,“-O1 -g+”修改为“-O1 -g -W”后,拷贝到“Misc Controls”栏中来,见图5。这是因为由于编译器版本的变化,其对应的编译选项也有所变化的缘故。注&&&&& -W选项可以抑止所有的warning。图5 编译选项的设置图6 链接选项的设置&&&&&& 对ADS工程中的链接选项作适当修改如下,使其复合POSIX格式。--info totals --entry 0x --scatter .\src\Scatterload.scf --info sizes选择Linker标签,将修改过的链接选项拷贝至RVMDK工程属性的Linker属性中,并单击“确定”,见图6。&&&&& 3)Build工程并适当修改代码&&&&& 当所有的工程属性都设置好之后,单击“Build all target file”快捷键 ,对整个工程进行编译链接。在RVMDK窗口的build输出一栏中,我们会发现系统出现了一个链接错误L6238E,见图7,这是由于RVMDK中新版本编译链接工具与ADS的老版本build工具采用不同的ABI造成的(详见本文2.3小节)。图7 链接错误L6238E&&&&&& 为此我们打开该工程中的汇编文件startup.s,在该程序第55行添加PRESERVE8指令,如下所示:&&& CODE32&&& PRESERVE8&&& AREA&&& vectors,CODE,READONLY
&&&&& 4) 重新编译链接该工程代码修改完毕之后,单击“Build all target file”快捷键 ,对该工程进行二次编译连接。RVMDK将成功生成New_MDK.axf文件,并显示其代码尺寸信息为:Program Size: Code=1576& RO-data=64 RW-data=0 ZI-data=1128&&&&& 5) 工程调试与其它ARM开发工具相比较,RVMDK拥有非常出色的仿真功能,可以帮助用户在纯软件的平台上进行较为精确的调试。用户可以在工程属性设置窗口选择simulator调试(见图8)或者通过硬件调试工具(uLink)进行调试。图8 选择uVision Simulator作为调试平台&&&&&& 当选择simulator调试时,单击debug快捷键 ,打开simulator调试窗口,见图9。为了验证该程序在LPC2294硬件平台上是否能够正确执行,通过GPIO口驱动LED进行循环闪烁,用户可以单击Peripherals-&GPIO-&Port2,将GPIO端口2的仿真界面打开,见图9。图9 RVDMK调试环境&&&&&& 单击运行快捷键 ,可以看到在GPIO端口2的仿真调试窗口中,IO口的输出在不停的循环变化。
| (C) 2015 Myir
深圳总部: 5 | 北京办事处: 010- | 上海办事处: 021-
粤ICP备号-1

我要回帖

更多关于 求生之路2安装包下载 的文章

 

随机推荐