从ADS到RealView MDK(MDK ARM)
很多嵌入式系统开发工程师对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,同时压栈,
ADSRealViewMDKAR 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)