MDK 使用手册设计手册V1.0
设计:陈吏弘
时间:2012.06.01
目录
一、序 (3)
二、MDK支持平台 (3)
三、MDK工程创建介绍 (3)
3.1、创建一个工程Test (5)
3.2、工程配置 (11)
四、MDK加Ulink2调试 (25)
五、MDK实现RAM调试 (31)
一、序
给予ARM的开发会越来越多,这个过程也会有越来越多的工程师需要学习相关的技术知识,这里主要是列出MDK使用的一些实践操作,为新用户认识和使用MDK提供一个参考手册,其实在MDK 自带的帮助文档里也是有相当多的介绍资料,建议用户在使用过程遇到问题是可以考虑阅读MDK自带的帮助文档。
二、MDK支持平台
MDK是Keil For ARM的软件集成开发环境,对于习惯使用集成开发环境的工程师,MDK的集成开发环境还是挺友好的,不过本人建议软件开发如果条件合适还是使用gmake更为灵活。
MDK主要是针对ARM7、ARM9、Cortex-M系列的处理器,如果你选择的是更为高端的处理器,那么请使用其它编译器,例如ARM 公司提供的专业编译器,当然还有很多第三方的工具。
三、MDK工程创建介绍
下面以一个实际操作的例子,来创建一个工程,如下图是打开的MDK软件截图。
如果你是初次打开MDK,那么通常工程中会打开一个示例工程,这个你可以把它关闭,关闭的方法是菜单Project->Close Project就可以了。
工程管理
编辑窗口
编译输出
工程管理窗口,如果你打开的环境中没有,那么可以在菜单View->Project Windows打开,这里还可以打开Books、functions、Templates窗口。这几个窗口共用一个视窗,所以如果要查看不同的内容可以在下面点选切换,如图中红圈部分。
编辑窗口,这个窗口当你双击你的源代码文件时,就会打开显示,并且可以再这里编辑你的源代码,当然如果你有其它更好的编辑工具也可以不在这里编辑。
编译输出窗口,这个窗口可以显示编译过程的信息,例如编译当前状态、警告信息、错误信息、代码量、数据量等等。如果你的环境没有输出窗口,那么仍然可以在菜单View->Build Out Windows打开。
MDK工具打开的工作环境大概是这样子。
这里补充说一点关于Templates的使用问题,实际上可能很多的工程师都没有去关注或者真真去使用Templates,那么这是一个什么
东西呢?其实这是一个非常好的工具,虽然它还不是很强大,当确实还是挺有用的,它可以让你轻松的实现设计代码复用,而且是快速的复用,你可以把一些设计代码作为一个Templates,在你新的工程中需要使用的时候就可以快速的调入,这个调入是把你的代码完成的拷贝到你的代码文件中,而不是一种引用。不过我没有发现这些Templates是存放在那些位置的,这样对管理来说还不是很好,但是对于个人来说已经很不错了。(不适用版本管理、所以在公司适用,版本变动可能就会有版本不同意的问题,管理版本统一比较麻烦)。
3.1、创建一个工程Test
创建工程,在菜单Project->New uVersion Project…然后弹出的对话框需要你输入工程的名称,如下图:
工程名称我们就输入Test,然后保存,如果你的当前路径下已经存在一个这样的工程,那么它会提示你是否替换原有的工程。保存完之后会弹出一个新的设备选择对话框,如下图:
这里需要你选择你这个工程使用的是那一款芯片,在MDK中基本上所有的芯片都已经列出,你可以直接根据公司进行选择你需要的芯片型号。如果你使用的芯片型号非常新,那么有可能在列表中,没有,如果是这样你还可以通过选择类似的型号或者直接选择ARM公司下的ARM、Cortex-M内核型号,这样也是可以的。
这里示例选择STM32F103C4型号,选择之后,接着会提示你是否需要拷贝启动代码,如下图:
建议拷贝,这样你就不需要自己去设计这部分启动代码了,当然这里的启动代码可能不是你需要的,但是你还是可以自行根据实际使用情况进行修改。如果在你当前路径下,这个文件已经存在,那么还会提示你是否覆盖。之后工程就创建完成了,如下所示。
创建工程的一级目录是Target 1,二级目录是Source Group 1,这两个目录都是自动创建的,名称的修改,选择按F2就可以修改了,另外还可以添加新的二级目录,但是在MDK中仅仅支持二级目录,所以如果你的目录树比较深建议你使用gmake工具,或者调整目录级别。
下面我们就这个创建的工程进行编译,看看结果是什么,这里我
们可什么都没有修改。
编译方法
1.通过菜单Project->Bulid target 或者Rebuild all target files来实
现
2.选择工程,右键,在弹出的菜单中选择Rebuild all target files
或者Build target实现
对刚创建的工程编译后,输出信息如下:
图中编译时有一个警告和错误,警告可以先不管,我们先看错误,错误内容如下:
Test.axf: Error: L6411E: No compatible library exists with a definition of startup symbol __main.
这个错误中有一个__main符号,所以,不用想多,这个错误就是在你的工程中没有main函数。因为C程序的入口是main函数,没有main函数显然就不是一个完成的程序,所以接下来在工程中添加一个c文件,完善main函数,新建文件在菜单File->New…,这个时候右边的编辑框就可以正常编辑了,输入如下代码:
#include “stdio.h”
Int main()
{
Printf(“你好!\n”);
Return 0;
}
然后把文件保存为Test.c。
选中工程中的二级目录,右键,弹出的菜单中选中添加文件到目录中,如下图:
添加完Test.c到工程后,我们再次编译工程,这是输出信息如下:
提示中还有一个错误,这个错误是说在startup_stm32f10x_ld.o文件中用到SystemInit符号,但是这个符号没有定义。所以打开startup_stm32f10x_ld.s文件,找到使用这个符号的代码,如下:Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
这里确实有使用到SystemInit符号,怎么办,简单的办法就是把这两条指令删除,或者你指定在C文件中定义一个符号(函数)。
这里我们就在Test.c中建一个空函数
V oid SystemInit(void)
{
}
然后再次编译,这是输出内容如下:
终于看到:
Program Size: Code=3196 Ro-data=280 RW-data=12 ZI-data=1876 “Test.axf” - 0 Error(s), 0 Waring(s).
到这里我们的工程创建、编译整个就已经完成了,接下来C代码的设计问题就是工程师们仁者见仁,智者见智的事情了。
3.2、工程配置
前一节完成了整个工程的创建以及编译,但是我们都是采用默认的配置,这样肯定不能够满足我们自主的愿望,所以对于工程的配置摆上了我们的桌面,下面一起看看如何对我们创建的工程进行配置。
打开配置菜单,有两种方法:
1.在菜单project->Option for Target ‘Target 1’…
2.选择工程,右键,快捷菜单中选择Option for target ‘Target 1’…
弹出配置向导如下图所示:
在这个配置向导中,有很多子选项,列举如下:
Device、Target、Output、listing、User、C\C++、Asm、Linker、Debug、Utilities。Q其中Device在我们创建工程时选择芯片型号的时候已经设定过,所以弹出这个向导时默认选择的是Target。当然这里你也是可以重新选择Device即芯片型号。
Target选项卡
在Target选项卡里可以配置以下内容,分别是:
设定晶体时钟
设定是否使用操作系统如MDK自带的RTX
设定系统显示内容存放文件路径及名称,这个不太清楚用法,默认的存放文件可以在安装路径下找到,但是不是文本文件没有详细研究,我们可以使用默认配置。
设定使用交叉优化模式
设定使用微库,默认是标准库,标准库与微库是有区别的,用户可以自行选择。
最后就是定义片内与片外的ROM和RAM,选择型号的时候,片内的ROM与RAM都已经定义好,通常并不需要用户再次定义配置。
Output选项卡
Output选项卡可以配置以下内容,分别是
设定目标存放路径
指定生成可执行文件名
指定是否生成调试信息
指定是否生成hex文件
指定是否产生browse信息,这个在debug的时候,打开source browse windows需要这项选择
指定是否创建批处理文件
指定是否生成lib文件
Listing 选项卡
Listing选项卡可以配置以下内容,分别是:
设定存放路径
指定输出页宽度、长度
指定生成汇编.lst信息,同时指定是否包含交叉参考信息
可以指定是否生成C预处理信息
指定是否生成链接信息,同时可以选择是否包含存储映射、符号、调用层次关系、交叉参考信息、Size信息、总体信息、未使用Sections
信息、Veneers信息
User选项卡
用户选项卡,主要是用来实现用户在编译器工作前后做的一些事情,这里都是指定运行一些程序,这样可以实现一些代码设计传递时的保护机制,这里不做太多介绍。
C\C++选项卡
C|C++选项卡可以配置以下内容,分别是:
预处理符号定义(建议不要在工程中使用这些定义)语言及代码编译参数定义
优化级别
优化时间与空间的选择
指定非对齐数据采用多次访问
指定为每个函数生成一个独立的section
指定使用标准ANSI C语法
指定枚举类型总是整形
指定字符型默认是带符号的
指定只读部分是位置无关
指定读写部分时位置无关
指定警告输出,可以使不输出也可以全部输出,或者采用默认设置
指定包含的路径
其它编译参数输出栏
此外,所有的配置,都在最下面框框中显示出来,这样你可以看到实际在编译时使用的参数情况。
Asm选项卡
汇编选项卡与C\C++选项卡类似,不过汇编选项卡会简单很多,可以配置内容如下:
条件汇编符号定义
语言及代码编译参数定义
只读部分位置无关
读写部分位置无关
指定为Thumb指令
指定没有警告输出
指定非对齐数据采用多次访问
指定包含路径
指定其它编译参数
此外,这里所有实际执行时使用的参数会在最下面的框框中显示。
Linker选项卡
该选项卡可以配置的以下内容,分别是:
存储使用配置
生成读写部分位置无关
生成只读部分位置无关
禁止使用标准库
报告可能的条件错误
在使用连续存储块是,还需要指定只读基地址和读写基地址,不过这两个基地址在芯片选型就一定定义好了,如果你的平台没有不同的地方就不用修改了。
指定禁止某类型的警告
指定使用分散描述文件
指定其它链接参数
同样,所有在执行会使用的参数都会在最下面的框框中显示出来,方便用户校验。
Debug选项卡
该选项卡是用来配置调试的,调试有两种,一种是基于软件的模拟调试,另一种是通过仿真器在线调试。如下图:
A、软件模拟调试配置
使用软件模拟调试通常可以实现下面的配置,分别是:
指定速度限制在实际的运行时钟
启动时加载应用程序
启动时运行到main函数入口
指定初始化脚本
调试操作相关设置
支持断点设置
支持Toolbox工能
支持Watch窗口和性能分析
支持内存显示
其它的PC端的动态库配置就可以不用关注了。
B、仿真器调试配置
如果要使用仿真器在线调试,那么要先选择使用仿真器,MDK 工具可以支持的仿真器非常的多,示例中如图支持集成支持的仿真器,还有一些第三方的工具。