主题 : ADS 移植到 MDK 出现的问题总结 复制链接 | 浏览器收藏 | 打印
开启ARM之旅
级别: 新手上路
UID: 63151
精华: 0
发帖: 25
金钱: 125 两
威望: 25 点
贡献值: 0 点
综合积分: 50 分
注册时间: 2012-02-15
最后登录: 2012-04-26
楼主  发表于: 2012-03-11 14:04

 ADS 移植到 MDK 出现的问题总结

  将ADS1.2的工程移植的RVMDK中出现了2个错误。
1,error: A1355U: A Label was found which was in no AREA
其原因:将分散加载文件添加到了RVMDK工程目录中了。
解决方法:将scf文件从工程目录中移除,然后在工程选项的Link项里制定scf文件的地址即可。
2,Error: L6238E: startup.o(vectors) contains invalid call from '~PRES8' function to 'REQ8' function FIQ_Exception.
     Error: L6238E: startup.o(vectors) contains invalid call from '~PRES8' function to 'REQ8' function TargetResetInit.
其原因: 对目标文件进行链接之前,MDK工具的链接器会严格检查各个目标文件(objects),判断它们是否复合ARM体系结构的ABI标准。而MDK与ADS编译链接工具所遵循的ARM ABI是不同版本的,所以将ADS的遗留工程直接移植到MDK并进行链接时,用户可能会遇到如上的错误或者警告。
因为新工具的ABI要求在函数调用时,系统必须保证堆栈指针8byte对齐,即每次进栈或者出栈的寄存器数目必须为偶数。这是为了能够更加高效的使用STM与LDR指令对“double”或者“long long”类型的数据进行访问。而老的ARM开发工具ADS并没有考虑到新的ARM内核架构,其ABI对于堆栈的操作仅仅要求4byte对齐。所以当用户将在ADS中编译链接成功的工程代码移植到MDK上,或者将老的、ADS遗留的目标文件、库文件在新工具MDK中进行链接时,MDK的链接器就会报出以上的错误。
解决方法:在每个汇编文件的文件头加入PRESERVE8
例如:
在startup.s文件中加入PRESERVE8
    CODE32
    PRESERVE8
    AREA  vectors,CODE,READONLY  
3 语法关键字要修改过来。特别是中断向量,一定要加__irq,否则会取指错误,跑到程序异常中断,然后.s文件默认为重启


级别: 新手上路
UID: 73065
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2012-07-03
最后登录: 2017-08-18
1楼  发表于: 2012-07-03 16:32
受教了