RealView MDK在中国推出已经有一段时间了,而且作为未来发展的趋势必将取代ADS1.2,成为工程师广泛应用的开发平台。
但是,以前的S3C2440的项目都是由ADS开发,而且我在网上搜索并没有发现有ADS1.2工程移植的例子,只能自己摸索。而且刚刚接触嵌入式的这个部分,希望把这个成果与大家分享,让其他的人少走弯路。
移植思路:
不兼容问题主要在于启动的汇编代码中加入了很多的与编译器相关的调用,只需修改原有的2440init.s部分代码就可以实现。而修改Realview自身引入的s3c2440a.s启动代码修要修改的内容过多。因而,采用第一种方案。
编译中出现的问题以及解决:
1, .\output\LJD2440TEST.axf: Error: L6218E: Undefined symbol Main (referred from 2440init.o).
Main -> main,新的Realview MDK中大小写认为名称不同
2,.\output\LJD2440TEST.axf: Error: L6915E: Library reports error: scatter-load file declares no heap or stack regions and __user_initial_stackheap is not defined
加入部分代码
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + USR_Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
3,
.\output\LJD2440TEST.axf: Error: L6218E: Undefined symbol Image$$RW$$Limit (referred from 2440lib.o).
.\output\LJD2440TEST.axf: Error: L6218E: Undefined symbol Image$$RO$$Base (referred from main.o).
.\output\LJD2440TEST.axf: Error: L6218E: Undefined symbol Image$$RO$$Limit (referred from main.o).
.\output\LJD2440TEST.axf: Error: L6218E: Undefined symbol Image$$RW$$Base (referred from main.o).
.\output\LJD2440TEST.axf: Error: L6218E: Undefined symbol Image$$ZI$$Base (referred from main.o).
.\output\LJD2440TEST.axf: Error: L6218E: Undefined symbol Image$$ZI$$Limit (referred from main.o).
办法:
重新编写.sct加载文件
4, 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
办法:在每个汇编文件的开头,添加“PRESERVE8”指令