试图搞懂MDK程序下载到flash(三)--MDK配置选项Linker、Target、Debug的理解分析
在写这一节时,我还是想再重复一下自己写这文章的目的,我的目的就是为了实现将MDK编写的裸机程序可不可以脱机运行,也就是不用调试的方法,因为调试的话程序默认是在SRAM中运行的,掉电丢失。而要脱机运行,就得将程序编译后的文件下载到flash中,最好能是nand flash。如果要下载到nand flash,那么就要编译生成一个bin文件,而不是用axf文件。那么剩下的问题就是,怎么生成一个完整、正确的bin文件?所以我现在就需要看能否通过编写一个分散加载文件,解决bin文件的地址问题。生成了bin文件,那么我就可以利用韦东山的方法,利用supervivi的v选项,配合DNW将程序下载到nand flash中并运行!
现在咱们就分析一下MDK配置选项,首先解释一下MDK中三种linker之间的区别: 1、采用Target对话框中的RAM和ROM地址。
采用此方式,需在Linker选项卡中勾选Use Memory Layout from Target Dialog选项(选中这一项实际上是默认在Target中对Flash和RAM的地址配置,编译链接时会产生一个默认的脚本文件),并且在Target中设置好RAM、ROM地址,图2所示。MDK会根据Target选项中设定的RAM和ROM地址自动加载生成一个加载文件。最后链接器会根据此文件中的信息对目标文件进行链接,生成axf镜像文件。
至于ROM和RAM是片内还是片外、容量(Size)多大,就需要根据芯片和开发板来决定了。
2、直接通过Linker选项卡中的R/O Base和R/W Base来设定链接信息。
链接器最后可根据此处指定的地址信息进行链接,链接的文件应该是顺序存放了,最多RO和RW分开。此时需要注意的是应将Use Memory Layout from Target Diaglog前的勾去掉,且保证Scatter File一栏中未包含分散加载文件,并且要在Misc controls中设定镜像文件的入口点,如: --first 2440init.o(Init) 对于这个括号内的填写依据,我暂时还不懂。
图3中的R/W Base空着没填,意思就是说紧跟着R/O Base地址。
3、最后一种为直接采用分散加载文件。
在设置Linker的时候可以注意下Linker control string的信息,看看Linker的输入信息是否符合自己的要求。
此处应该是只要选择使用scatter file文件,那么其他链接方式的设置自动失效。可以从Linker control string的信息可以看出来。 现在试图着对mini2440开发板进行设置
直接通过Linker选项卡中的R/O Base和R/W Base来设定链接信息
①由于mini2440开发板采用的是片外的ram和片外的flash,所以我这里直接采用前面说到的第2种方法,就是通过手动设置RO的地址,其中0x30000000就是片外ram的地址,也就是咱们的SDRAM。RW未指定,则说明RW数据顺序存放到RO段之后。如下图。