这里说明一下,这里说的 “编译 MDK4项目”是指在SlickEdit项目中加入与MDK4项目相同的源文件进行编译。在调试的时候还是需要用MDK再编译一遍,然后再进行调试的。
相对于SlickEdit来说,MDK的编辑环境实在是不够自动化,为了提高工作效率,我希望能用SlickEdit来完成代码的编辑,编译工作。在AVR上我就是这么干的。由于AVR支持使用Makefile来管理工程,因此可以通过让SlickEdit使用MakeFile的方式来编译AVR的工程文件。但是到了MDK这边,由于MDK不支持Makefile,因此这条路变得非常难走。
参考了http://blog.csdn.net/xuzhenglim/article/details/7232157 的博客,可以尝试完成了编译工作。感谢 博主。
由于VS在链接的时候输入的文件名只能使用%f,也就是说是 Debug/x.o 的形式,应此为了能满足这个要求,就要求MDK的输出文件目录一定是 ./Debug. 可以在Output页面中进行设置。这点非常重要。如果不这样设置的话,会导致VS在链接的时候找不到目标文件。
在这里先记录一下VS的内置变量。
%rp工程路径
%rn 工程名
%rw 当前工作目录
%n文件名(不带文件路径和类型后缀)
%f文件名(类型后缀)
%bd 配置文件夹(比如debug\release)
%(环境变量名)这个很重要,很多环境都是这样掉用的
%i 工程包含的所有路径,会自动扩展成 -I path1 -I path2
%defd 工程的所有宏定义变量
%libs 所有工程定义的库
之后就是需要准备vsbuild 所需要的一些参数了。
在VS中,Build命令实际上就是执行它的 Command line 里头的参数。默认情况下的参数是
"%(VSLICKBIN1)vsbuild" build "%w" "%r"。 如果是在AVR项目里头,就执行 Make clean --F Makefile; make --F Makefile
在Rebuild 命令下则 是
"%(VSLICKBIN1)vsbuild" rebuild "%w" "%r"
在vsbuid执行build命令的时候,他会依次为项目中的每个文件执行compile命令,当compile命令都执行完成后,再执行一次link命令。
因此,我们需要设置这个项目的Build Target和 Link Targe就可以完成所需要的功能了。
用文本编辑器打开项目的.vpj文件,可以发现这是一个xml格式的文件。在Project节点下有两个Config 子节点。从名字上很容易看出来一个是Debug用的,另外一个是Release用的。对于我们只求编译和编辑的使用目标来说,我们可以删掉Release这个节点,这样就只需要设置一个编译配置就行了。
在 Menu节点下面,都有几个Target节点,这些Target就是Build菜单下的那些菜单项。其中的 EXEC 节点就是这个菜单项对应的动作。
首先需要指定编译器的路径和库文件的路径。在Config节点下加上设置变量的代码
<Set
Name="MDKARM"
Value="C:\Keil\ARM\ARMCC\bin\"/>
<Set
Name="MDKARM_LIB_PATH"
Value="C:\Keil\ARM\ARMCC\lib"/>
在下面的命令中就可以用 %MDKARM和%MDKARM_LIB_PATH来指明编译器和库文件的路径了。当然,更高级一点的做法是把cc定义成一个变量。在后续的版本中再改吧。今天的目标就是编译,链接。
如果在编译时发现设置的环境变量不管用,那就直接把环境变量插入到命令行中吧。我尝试了两个文件,一个管用,另外一个不管用,也不知道是什么原因。反正就插入一次,丑陋就丑陋一点把。
对于默认的VS项目来说,Comiple 命令就是 <Exec CmdLine='cc -c -g %i %defd -o "%bd%n.o" "%f"'/>,也就是调用系统的cc编译器,进行编译。为了达到我们所希望的使用MDK的arm编译器来编译源文件的目标,我们需要修改这里头的命令行。首先需要指定编译器的路径(其实不指定也没有关系,在命令行中加路径也是可以的),然后需要根据编译的目标配置需要的编译参数。这需要查阅 armcc的参数。目前可以使用如下参数进行编译。
<Exec CmdLine='%(MDKARM)\armcc -c --cpu Cortex-M3 -g -O2 --apcs=interwork %i %defd -o "%bd%n.o" --omf_browse "%bd%n.crf" --depend "%bd%n.d" %f'/>
<Includes>
<Include Dir="%rpCMSIS/INC"/>
<Include Dir="%rpStm32Lib/INC"/>
<Include Dir="%rpUsr/INC"/>
</Includes>
其实armcc的命令选项完全可以参考MDK给出的命令选项。如果想偷懒的话,直接把 Options for Target 'xxxx' 对话框中的C/C++页面下的Compile control string 复制过来,把命令选项填在 armcc 后面作为命令参数即可。
在替换时要注意:
1. 要保留原来的命令行后面的 %f, 这是输入的文件名称
2. 要把命令行中的 -o --omf_browse --depend 中的 * 替换为 %n,这样VS在编译时会自动把源文件名插入到*的位置。
3. 把命令行中的 -o后面的参数改为 %bd\%n
替换后的命令行如下:(红色字体为替换后的部分)
C:\Keil\ARM\ARMCC\bin\\armcc -c --cpu Cortex-M3 -D__MICROLIB -g -O3 --apcs=interwork --split_sections -I..\..\inc\AN3964-Temperature_sensor -I..\..\source\Plf\STM32L1xx\Inc -I C:\Keil\ARM\RV31\INC -I C:\Keil\ARM\CMSIS\Include -I C:\Keil\ARM\Inc\ST\STM32L1xx -DUSE_STDPERIPH_DRIVER -DSTM32L1XX_MDP -o "%bd\%n.o" --omf_browse "%n.crf" --depend "%n.d" %f
对于默认的Link命令,所执行的命令行参数就是 <Exec CmdLine='cc -g -o "%o" %f %libs'/>
MDK的目标Link命令就是
<Exec CmdLine='%(MDKARM)\armlink --cpu Cortex-M3 --libpath=%(MDKARM_LIB_PATH) --strict --scatter "%rpStartUp\%rn.sct" --summary_stderr --info summarysizes --map --xref --callgraph --symbols --info sizes --info totals --info unused --info veneers --list "%bd%rn.map" -o "%bd%rn.axf" %f %libs '/>
Link的命令行参数也可以从 MDK中复制过来,需要修改的地方如下:
1. 删除其中的 *.o, 用 %f 替换掉。
替换完成后的命令行如下:(红色字体为替换后的部分)
<Exec CmdLine='C:\Keil\ARM\ARMCC\bin\\armlink --cpu Cortex-M3 %f --library_type=microlib --strict --scatter "Debug.sct" --summary_stderr --info summarysizes --map --xref --callgraph --symbols --info sizes --info totals --info unused --info veneers --list ".\STM32L-Discovery\Debug.map" -o Debug.axf %libs '/>
VS中只能使用 %f作为输入的文件名,不能使用%n,这就导致了输出目录必须是 Debug,否则就找不到链接文件。由于这个原因,在设置MDK时,需要约定输出目录只能是 ./Debug。
compile中只指定了c和cpp文件的编译规则。在Arm的项目中会有汇编文件,这需要指定新的规则。在VS的项目中,可以使用Rule节点来规定某种后缀名文件所需要的编译规则。
<Rules Name="Compile">
<Rule
InputExts="*.s"
OutputExts="*.o"
LinkObject="1">
<Exec CmdLine='%(MDKARM)\armasm --cpu Cortex-M3 -g --apcs=interwork %i --list "%bd%rn.lst" --xref -o "%bd%n.o" --depend "%bd%n.d" %f'/>
</Rule>
</Rules>
和 Compile命令一样,可以直接从MDK的命令行参数中把参数复制过来,需要替换的地方也是一样的。
替换完成后的命令行如下:
<Exec CmdLine='C:\Keil\ARM\ARMCC\bin\\armasm --cpu Cortex-M3 -g --apcs=interwork --pd "__MICROLIB SETA 1" -I C:\Keil\ARM\RV31\INC -I C:\Keil\ARM\CMSIS\Include -I C:\Keil\ARM\Inc\ST\STM32L1xx --list ".\STM32L-Discovery\%n.lst" --xref -o "%bd\%n.o" --depend "%n.d" "%f"'/>
最后把MDK项目中的文件加入到 VS项目中。可以用Build命令编译。