查看原文
其他

Keil系列教程13_创建多目标工程

strongerHuang 嵌入式专栏 2021-01-31

置顶/星标公众,不错过每一条消息!


    本教程由原创作者strongerHuang于2018年12月更新发布。

标签:Keil、 MDK-ARM、 µVision

版权所有:禁止商用

申明:该文档仅供个人学习使用,转载请公众号联系作者授权。


1写在前面

相信大家都看到过带有Debug和Release两个不同目标的工程。


比如:大家熟知的VC、IAR创建工程时,默认会有这么两个Debug和Release“目标”


还比如:我们使用Keil打开STM32的IAP例程,会看见类似如下图(多目标)的工程:


你想过为什么会有Debug和Release,及IAP这样的多目标工程吗? 请继续往下看。


2

什么是多目标工程?

简单的说:就是有多个目标的工程。


在Keil中,需要理解几个名词:工作空间、工程、目标


该教程《Keil系列教程05_工程目标选项配置(一)》有讲述这三个名词的含义和区别。简单的说就是一个包含关系,如下图:


3

为什么要创建多目标的工程

我们只有带着问题去学习,才会更加容易学会知识。创建多目标工程在实际应用中比较常见,且有着重大意义。下面举两个大家熟悉的例子(文末提供下载链接)。


3.1 Debug和Release

开篇说了,在我们熟悉的VC和IAR开发环境中默认就有Debug和Release两个工程目标。但很多人却不知道他们的区别。


两个目标的区别:

Debug(调试):主要用于调试使用,包含调试信息。

Release(释放):主要用于生成(正式)程序文件(如:Hex,Bin等),不包含调试信息。


当我们平时调试的时候就用Debug目标。调试好之后,生成程序文件,使用Release目标。使用Release目标的好处在于没有调试信息,编译速度也比较快


3.2 不同版本产品

假如我们开发一款产品,有两个版本:低级版(Low)和高级版(High)


这两个版本在功能上大体相同,但在硬件或软件上有略微差异。此时,就需要建立多目标工程。


比如:低级版我们使用STM32F103R8,高级版使用STM32F103ZE,且高级版多了一些显示的功能。


多目标工程的应用在不同场景下要求不同,所以,还有很多种可能。


3.3 多目标工程主要意义

假如上面Debug和Release使用两个独立的工程,我们每修改Debug一个地方,那么Release也会进行相应修改。


如果我们都在一个工程里面进行编辑代码、管理工程,那么就不会出现上面重复的问题。


因此,多目标工程主要意义在于方便管理工程


提示:这些不同的目标,区别在于目标选项配置不同


4

如何创建多目标工程

上面让大家大概了解了一下多目标相关的知识,多目标存在的差异主要在于“Target目标”选项配置上有一定差异。


这里需要大家对工程目标选项配置有一定的了解,可以参看该教程文章:

Keil系列教程05_工程目标选项配置(一)

Keil系列教程06_工程目标选项配置(二)


下面结合上一章节Debug和Release、不同版本产品例子来讲述创建多目标需要修改那些配置。


4.1 新建目标

在该教程《Keil系列教程02_新建基础软件工程》中新建的基础工程,其实就是只有一个目标的工程。


接下来就在该工程基础上新建一个目标,首先进入工程管理界面:Project -> Manage -> Project Items,或点击工程管理快捷图标,如下图:

假如我们的基础工程为Debug,点击新建目标(如图虚线方框)按钮,就新增一个目标,我们将新建的目标命名为Release(输入Release)。


新建之后,就会出现上面截图中Debug和Release两个目标。此时,Release目标只是Debug的一个拷贝,也就说Debug和Release两个目标的各项配置一样。只是名称不一样而已。


这里只是新增了一个Release目标,还需要进一步修改其中的配置。大体分为:工程管理、文件选项配置、(Group)组选项配置、目标选项配置


提示:以上四项内容不一定全都修改,不同需求,修改地方不同,一般需要修改的地方不多。


4.2 工程管理

工程管理里面Project Items下面的Groups组、Files文件都是公用的一套

比如:我工程中有两个目标,分别用STM32F103R8、103ZE,则需要包含startup_stm32f10x_md.s和10x_hd.s。如下图:


这里公用的的意思:只要工程(目标)用到的Groups或Files,都需要添加到进去,会在工程中呈现出来。


但是,不同的目标,用到的Groups或Files不一样。在该目标中不需要的Groups或Files需要配置成“不包含”(下面讲述)。


比如:STM32F103R8_Low目标,只用startup_stm32f10x_md.s,因此需要将startup_stm32f10x_hd.s排除(不包含)该目标


Folders/Extension文件/扩展、Books书籍一般不需要配置,选择默认即可。


4.3 文件选项配置

接下来的文件、组、目标选项配置都需要事先选择需要配置的目标


上面说的,我们选择STM32F103R8_Low目标,需要将startup_stm32f10x_hd.s排除(不包含)该目标。


选中文件startup_stm32f10x_hd.s -> 右键 -> Options for File进入文件选项配置:


目标文件选项配置:不包含startup_stm32f10x_hd.s


上面不包含文件只是最简答、最常见的一种文件选项配置,有些应用会要求代码存储在外部ROM,或RAM执行,就需要修改下面的Memory Assignment内存分配


同时针对汇编,或C/C++源文件还有更多选项需要配置:


这里汇编、C/C++源文件的选项配置请参看“Keil系列教程06”C/C++和Asm章节。


提示:这里面的选项配置是针对选中的单个File文件


4.4 组选项配置

这里组选项配置和上面文件选项配置原理类似,只是这里针对的是Group组。


比如:我们工程中一个目标用STM32F1,一个目标用STM32F4,则包含的库文件组就不同,需要“不包含”其中一组,或者把库文件组编译在外部ROM,再或者把该组编译优先级提高等


提示:这里面的选项配置是针对选中Group组


4.5 目标选项配置

Release目标相比Debug目标,一般会少输出一些调试信息,如上图,不输出Debug信息,浏览信息(Go to Definition)等。这样一来,编译速度至少快一倍。


同时,针对Debug,可能会在代码中添加一些自己的打印调试信息,通过预定义DEBUG来控制开启。


目标选项配置的内容,想必大家再熟悉不过了,我们之前的一些常规配置就是目标选项配置,请参看:

Keil系列教程05_工程目标选项配置(一)

Keil系列教程06_工程目标选项配置(二)


提示:这里面的选项配置是针对选中的目标


以上四项内容就是针对目标,及目标下面组和文件的选项配置。写的比较粗略,但大部分内容都已经该教程05和06中写过,上面也引导大家查看相关内容。


不同应用环境,其修改的内容不同,结合实际应用修改相关配置即可。


5

下载

为方便大家学习,我这里提供可直接编译运行的源代码工程供大家下载。包含两个工程:Debug-Release和Diff-Version,下面分别有两个不同的目标。


百度网盘下载地址:

https://pan.baidu.com/s/1iQiawcpVd8bvgyy0nQhLEQ

密码:34hg


GitHub下载地址:

https://github.com/EmbeddedDevelop/Keil-MDK-ARM_Multi-Target.git


提示:

1.下载链接后期可能会失效, 请关注微信公众号获取最新消息;

2.公号不支持外部链接,请复制链接到浏览器下载。


6

说明

1.该文档仅供个人学习使用,版权所有,禁止商用。


2.本文由我一个人编辑并整理,难免存在一些错误。


3.本文收录于公众号「嵌入式专栏」,关注微信公众号回复【Keil系列教程】即可查看全系列教程。  


7最后

若觉得文章对你有帮助,随手点赞、分享,也是对我莫大的支持和鼓励。


扫描下面二维码、关注公众号,在底部菜单中查看更多精彩内容!



长按识别图中二维码关注

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存