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

  • 分享一个朋友的人工智能教程,零基础!通俗易懂!希望你也加入到人工智能的队伍中来! www.captainbed.net

一、写在前面

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

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

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



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

二、什么是多目标工程?

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

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

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



提示:
在Keil中叫Target(目标),而在IAR中叫Node(节点)。其实这两者意思一样,都是隶属于工程的下一级。

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

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

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也会进行相应修改。

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

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

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

四、如何创建多目标工程

上面让大家大概了解了一下多目标相关的知识,多目标存在的差异主要在于“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中写过,上面也引导大家查看相关内容。

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

五、下载

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

百度网盘下载地址:https://pan.baidu.com/s/1iQiawcpVd8bvgyy0nQhLEQ
密码:34hg

GitHub下载地址:https://github.com/EmbeddedDevelop/Keil-MDK-ARM_Multi-Target.git

(提示:下载链接后期可能会失效, 请关注微信公众号获取最新消息)

六、说明

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

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

3.为了方便大家平时公交、地铁、外出办事也能用手机随时随地查看该教程,该教程同步更新于微信公众号【EmbeddedDevelop】,关注微信公众号回复【Keil系列教程】即可查看全系列教程。

七、最后

我的博客:http://www.strongerhuang.com
我的GitHub:https://github.com/EmbeddedDevelop

  我的微信公众号(ID:strongerHuang)还在分享STM8、STM32、Keil、IAR、FreeRTOS、UCOS、RT-Thread、CANOpen、Modbus…等更多精彩内容,如果想查看更多内容,可以关注我的微信公众号。

strongerHuang wechat
关注微信公众号,查看更多精彩内容!
本文对你有帮助吗?