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

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

一、写在前面

本文接着上一篇文章《Keil系列教程05_工程目标选项配置(一)》讲述的工程目标选项的后五项配置:C/C++编译、 Asm汇编、 Linker链接、 Debug调试、 Utilities公共



二、C/C++编译



这里“C/C++选项”和“Asm选项”类似,主要是与编译相关的一些配置。

第1处:预处理(Preprocessor Symbols)
这里主要就是预定义功能,相当于在程序中的#define xxxx。我上面预定义STM32F10X_HD,在stm32f10x.h文件中就不用定义了。

第2处:语言/代码生成(Language / Code Generation)
Language/code Generation语言/代码生成。可以理解成编译、链接到最后生成代码。这部分功能对于代码优化比较重要,初学者可以不用过多理解,对代码大小、运行速度等性能要求较高的人就需要深入理解。

Execute only Code:只生成执行代码
【设置编译器命令行:–execute_only】
只生成执行代码防止编译器生成任何数据访问代码部分。

Optimize:优化选择项,有Level0 - Level3四个选项
【设置编译器命令行:-Onum】
初学者、在线调试建议使用Level0,也就是不优化,这样执行的效果才和代码一样。如果配置成Level3,在线调试可能有些地方优化而不能打断点。

Optimize for Time:优化时间,即优化代码中费时的地方
【设置编译器命令行:-Otime】
比如有些算法,本身代码量就比较大,运行需要很长时间(假如需要2秒),这个时候勾选上该功能,会发现运行时间有比较明显的减少(或许不到1秒时间)。

Split Load and Store Multiple:加载和存储多个分裂
【设置编译器命令行:–split_ldm】
非对齐数据采用多次访问方式。当 LMD/STM 指令有 4 个以上产生时,列分裂LMD 和 STM 指令,以减不中断延迟。

One ELF Section per Function:优化每一个函数 ELF 段
【设置编译器命令行:–split_sections】
每个函数都会产生一个 ELF 段,勾选上,允许优化每一个 ELF 段。这个选项可以减少潜在的共享地址、数据和函数之间的字符串。

直白的意思:可以减少代码量ROM的大小(内存RAM不会减小)。

举一个例子,勾选之前和勾选之后,编译后存储大小对比:
勾选之前:
Program Size: Code=2540 RO-data=336 RW-data=40 ZI-data=1024

勾选之后:
Program Size: Code=908 RO-data=320 RW-data=40 ZI-data=1024

Strict ANSI C:标准(严格)的ANSC
【设置编译器命令行:–strict】
也就是说:编译时严格按照标准的ANSI C进行检查。

Enum Container always int:枚举总是int型
【设置编译器命令行:–enum_is_int】
很容易理解,我们枚举时成员变量类型为int型。

Plain Char is Signed:纯字符标记为字符
【设置编译器命令行:–signed_chars】
代码举例:char a[] = “abcd”; 也就是说将“abcd”标记为字符型。

Read-Only Position Independent:为常量生成独立的代码空间
【设置编译器命令行:–apcs=/ropi】
比如:我们定义字库变量为常量,勾选该选项,会将这些字库变量放在独立的代码空间。

Read-Write Position Independent:为可读写代码生成独立的代码空间
【设置编译器命令行:–apcs=/rwpi】

Warnings:警告
【No Warnings设置编译器命令行:-W】
No Warnings:不会有警告提示和输出;
All Warnings:所有警告提示和输出。

Thumb Mode:Thumb模式
指定设置文件或文件夹(组)为Thumb模式。
【注意:在工程中该模式为默认,也就是不能选择】

No Auto Includes:不自动添加头文件
不勾选该选项,编译器就会在Keil安装路径寻找你工程中.h文件。
举例:我们定义uint8_t是定义在stdint.h文件里面的,但是我们工程目录下一般是没有stdint.h文件。这时候,编译器就会在Keil路径下去寻找stdint.h文件。

C99 Mode:C99标准模式
【设置编译器命令行:–c99】
C语音有标准有多个版本,如C89、C90、C99等。

GNU extensions:支持GUN扩展
GUN ARM C编译器是这后面新增支持的功能。

第3处:包含路径(Include Paths)
包含路径是使用Keil(及类似)软件必须掌握的一项。包含路径就是指定我们工程中使用文件所在的位置,让编译器找到相应的文件。

可以参看我之前分享的文章《Keil系列教程02_新建基础软件工程》里面添加路径的方法。


添加路径动画效果:

第4处:多功能控件(Misc Controls)
例如:用日本语言来显示消息:–message_locale=ja_JP.

第5处:编译器控制字符串(Compiler control string)
这里是针对编译器执行的命令,显示当前在编译器命令行指令。

在上面“第2处:语言代码生成”中有一个中括号【设置编译器命令行:】
里面的命令就显示在这里。

三、Asm汇编



Asm选项和“C/C++”类似,只是这里针对的是Asm汇编。因此,这一章节只简述,不会重点强调,可以参看上一章节进行对比,第3、4、5处和C/C++选项一样,这里不讲述。

第1处:条件控制符号(Conditional Assembly Control Symbols)
指定汇编条件,这里类似上一章节C/C++选项中的预处理。

第2处:语言代码生成(Language / Code Generation)
Read-Only Position Independent:为常量生成独立的代码空间。

Read-Write Position Independent:为可读写代码生成独立的代码空间。

Thumb Mode:Thumb模式。

Split Load and Store Multiple:加载和存储多个分裂。

Execute only Code:只生成执行代码;

No Auto Includes:不自动添加头文件(一般不勾选)。

四、Linker链接



Linker链接器配置选项。可以修改、编辑和查看链接的文件。第1、2处是重点,第3、4处和C/C++选项一样,这里不讲述。

第1处:内存配置对话框(Use Memory Layout from Target Dialog)
Make RW Sections Position Independent:使RW段独立
【设置编译器命令行:–rwpi】
启用时:变量区域(包含RW和ZI)具有独立地址。
禁用时:变量区域(包含RW和ZI)位于绝对的内存地址。

Make RO Sections Position Independent:使RO段独立
【设置编译器命令行:–ropi】
启用时:常量和代码区域(RO)具有独立地址。
禁用时:常量和代码区域(RO)位于绝对的内存地址。

Don’t Search Standard Libraries:不搜索标准库
【设置编译器命令行:–noscanlib】
禁用默认编译器运行时库的扫描。

Report ‘might fail’ Conditions as Errors:报告’might fail’条件认为是错误
【设置编译器命令行:–strict】
报告的条件可能导致失败的错误,而不是警告。

X/O Base:X/O基地址
【设置编译器命令行:–xo_base=address】

R/O Base:R/O基地址
【设置编译器命令行:–ro_base=address】

R/W Base:R/W基地址
【设置编译器命令行:–rw_base=address】

disable Warnings:警用警告
【设置编译器命令行:–diag_suppress】

第2处:分散文件(Scatter File)
这里可以加载、查看和编辑分散文件。点击后面就的三点“…”可以加载文件;点击“Edit…”查看和编辑对应的文件。



五、Debug调试



这个选项比较重要,主要用于(软件仿真、硬件在线)调试使用。由于软件仿真和硬件在线调试配置类似,这里只讲述硬件在线调试(右边部分)。

第1处:选择硬件在线调试
选择下载调试器,以及对应的设置“Setting”。
很多人常用J-Link下载调试器,而调试STM32时,可以使用四线SWD模式。如果使用J-Link进行SWD调试。这个时候就需要在“Setting”里面选择“SW”模式,如下如:



第2处:选择硬件在线调试
Load Application at Startup:启动时加载应用程序。

Run to main():程序执行到main()函数。
进入调试模式时,程序自动运行到main函数处。

Initialization File:加载、编辑初始化文件。
这里在某些情况下可以使用,比如:在RAM中调试代码。可以参看我的文章《STM32内部RAM在线调试配置方法》

第3处:复位调试会话设置(Restore Debug Session Settings)
这里复位设置就是恢复设置的意思,如果勾选上,点击一下“复位”就会恢复到之前的状态。

包括:断点Breakpoints、窗口Watch Windows、性能分析器 Performance Analyzer、内存窗口Memory Window、工具箱Toolbox、系统查阅器System Viewer等。

第4处:DLL文件
这里的配置属于Keil自身的配置,最好不要修改。
CPU/Driver DLL - Parameter:CPU驱动文件和参数。
Dialog DLL - Parameter:会话框DLL文件和参数。

第5处:管理组件描述文件
Manage Component Viewer Description Files
这里一般不用去管理。

六、Utilities公共



第1处:配置FLASH菜单命名(Configure Flash Menu Command)
这里是二选一选项,一般我们使用上面的“Update Target Driver for Flash Programming”。

Use Debug Driver:使用调试驱动

Update Target Before Debugging:调试之前更新目标
一般都勾选上,因为我们下载程序之前检测到代码修改了,就会重新编译程序(也就是更新目标)

Setting:设置
很多人下载程序之后,需要复位一下程序才运行,原因在于没有勾选“Reset and Run”,如下图:



Init File:加载/编辑初始化文件

第2处:配置镜像文件(Configure Image File Processing)
通过在编译过程中调用FCARM,输入配置映像文件处理(FCARM)的选项。这将把镜像文件转换成c源代码。

七、说明

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
关注微信公众号,查看更多精彩内容!
本文对你有帮助吗?