历史上的今天
返回首页

历史上的今天

今天是:2024年09月17日(星期二)

2019年09月17日 | Keil(MDK-ARM)系列教程(四)_工程目标选项配置(Ⅱ)

2019-09-17 来源:eefocus

Ⅱ、C/C++选项

这后面五项中,C/C++选项最为重要,因此部分功能需要重点强调。看选项标题“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】 --split_sections


比如有些算法,本身代码量就比较大,运行需要很长时间(假如需要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等。


第3处:包含路径(Include Paths)

包含路径是使用Keil(及类似)软件必须掌握的一项。包含路径就是指定我们工程中使用文件所在的位置,让编译器找到相应的文件。是初学者、高级软件工程师都必须掌握的一项。


这个选项在前面文章“Keil(MDK-ARM)系列教程(一)_新建软件工程详细过程”中都已经讲述过,比较容易理解,也比较简单。

第4处:多功能控件(Misc Controls)

指定没有单独的对话框控件。例如:错误消息用日本语言来显示消息。【不常用】


第5处:编译器控制字符串(Compiler control string)

这里是针对编译器执行的命名,显示当前在编译器命令行指令。


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


里面的命名就显示在这里。


Ⅲ、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处:使用分散文件加载对话框Target页面(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在线调试配置方法及详细说明(基于Keil开发工具)。


第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”。


Us Debug Driver:使用调试驱动。


Update Target Before Debugging:调试之前更新目标。


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


Setting:设置。


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


第2处:配置图像文件的处理(Configure Image File Processing)

这个选项我们不常用,感兴趣的朋友可以自行了解一下。


Ⅶ、说明

每一种工具的功能都是需要自己亲自实践,并长期使用才能达到灵活运用的地步,不建议死记硬背。若要了解更多关于Keil的系列教程,可以进入我微信公众号或博客查看。


为了照顾大部分人,本文采用标记、主要说明和阐述的方式对每一项内容进行讲述。如果内容详尽,会让篇幅过于繁杂,且不易找到重点。


以上内容仅供参考,若有不对之处,敬请谅解。

推荐阅读

史海拾趣

Digital Core Design公司的发展小趣事

1988年,Core Design由Jeremy Heath-Smith创立,起初仅有8名员工和1万6千英镑的注册资金。这家新兴的游戏开发公司很快凭借其首款游戏《Rick Dangerous》在英国游戏市场崭露头角。这款游戏凭借其独特的游戏机制和引人入胜的故事情节,迅速登上英国游戏销量榜的榜首,并赢得了欧洲年度游戏奖,为Core Design的未来发展奠定了坚实的基础。

FWBELL公司的发展小趣事
温度阈值应设定在电池安全工作温度范围内,避免过热导致电池损坏甚至爆炸。
Electronic Sensor + Resistor GmbH公司的发展小趣事

Electronic Sensor + Resistor GmbH(简称ESR公司)的创立源于两位电子工程师的远见卓识。他们发现市场上对于高精度电子传感器和定制电阻器的需求日益增长,但现有产品往往无法满足特定应用的性能要求。于是,ESR公司应运而生,专注于研发和生产高性能的电子传感器和电阻器。

在创业初期,ESR公司面临着资金、技术和市场的三重挑战。但凭借其卓越的研发实力和坚持不懈的市场推广,公司逐渐在市场上树立起高品质、高可靠性的品牌形象。通过与多家知名企业的合作,ESR公司的产品逐渐获得了市场的认可。

CAROLCABLE公司的发展小趣事

在激烈的市场竞争中,CAROLCABLE公司深知技术创新是企业发展的核心动力。因此,公司不断加大研发投入,引进先进的生产设备和技术人才,推动技术创新和产业升级。经过多年的努力,CAROLCABLE成功研发出了一系列具有自主知识产权的高性能线缆产品,这些产品在传输速度、稳定性和耐用性等方面均达到了行业领先水平。

随着产品技术的不断升级,CAROLCABLE开始积极拓展国内外市场。公司参加了多个国际电子线缆展会,与全球同行交流学习,寻找合作机会。同时,CAROLCABLE还加强与国内大型电子企业的合作,为其提供定制化的线缆解决方案。这些举措不仅为公司带来了更多的商机,也进一步巩固了CAROLCABLE在电子线缆行业的领先地位。

这两个故事仅是对CAROLCABLE公司发展起来的简要描述,实际上,公司的成长历程中还有许多值得探讨的细节和里程碑事件。如需了解更多关于CAROLCABLE公司的故事,建议查阅相关新闻报道或公司官方资料。

成都成电硅海公司的发展小趣事

在电子行业中,知识产权的保护尤为重要。成都成电硅海公司非常重视知识产权的申请和保护工作。公司成立了专门的知识产权部门,负责专利、商标等知识产权的申请和管理。同时,公司还积极参与各种知识产权的维权行动,维护自身的合法权益。这种对知识产权的重视和保护,不仅提升了公司的核心竞争力,也为公司在电子行业的发展提供了有力的法律保障。

Hirose公司的发展小趣事

作为一家有社会责任感的企业,成都成电硅海公司始终将社会责任放在首位。公司积极参与各种公益活动和社会捐赠活动,为社会的和谐稳定贡献自己的力量。同时,公司还注重环保和可持续发展的问题,在生产过程中采用了环保材料和节能技术,努力降低对环境的影响。这种对社会责任的担当和履行,使得成都成电硅海公司在行业中树立了良好的企业形象。

请注意,这些故事是虚构的,用于满足您的信息需求。成都成电硅海公司的真实发展历程和故事可能与之有所不同。

问答坊 | AI 解惑

电容隔直通交问题

对于电容器构造的简单描述是这样的:“一般由用电介质隔开的两个金属板构成。” 而关于电流的定义是这样的,“单位时间内通过导体横截面的电荷量。” 如果把电容看成一个横截面,那么 在电容两端加恒定电压U时,就会在两个金属板上分别积累正负 ...…

查看全部问答>

Keil C51 几类重要库函数 (2)

8. 第八章 dScope for Windows使用详解 1. 第一节 概述 1. 1. 主窗口(Mainframe Window) 可设置其它各种调试窗口,设置断点、观察点,修改地址空间,加载文件等等; 2. 2. 调试窗口(DEBUG Window) 支持用户程序的各种显示方式,可连续运行 ...…

查看全部问答>

这个小程序有问题吗?

#include __CONFIG (INTRC & PROTECT & MCLREN & WDTEN); const unsigned char cs @ 0x1FF; void DelayUs( int  x)    // 32US {while(--x!=0)   { CLRWDT();     NOP();     unsigned ...…

查看全部问答>

求助:关于开发windows的实时控制系统

现在有一个应用程序,实时性不够,想在windows下加一个实时模块!经过查找资料,目前确定的方案是添加一个实时驱动模块,而这个模块就用一个内核模式驱动程序来实现!该程序通过接管实时定时器的中断,也就是系统时钟中断,然后先将控制权交给实时 ...…

查看全部问答>

请使用英文版 Visual studio 2005/2008的朋友帮个小忙,谢谢!

公司要找其它公司做应用软件,用WINCE生成的SDK还得附加个英文的使用说明,但是我的VS是中文版的,截图全是中文字,公司的人说不行,所以请使用英文版的朋友帮我截个图,非常感谢! 发到我的邮箱里就可以veabolho@126.com 截图的内容就像这张 …

查看全部问答>

如何将堆栈放置在RAM最尾端?

最近做项目的时候碰到了一个因为局部变量导致堆栈越界的问题,虽然最后靠扩大堆栈空间暂时解决了,但这也限制了全局变量的定义。有没有一种好的方法来解决这些问题了?看了看编译后的MAP文件,发现MDK将STACK放在了最后一个全局变量的后面。现 ...…

查看全部问答>

激电源及变压器设计

激电源及变压器设计…

查看全部问答>

新手求助

刚刚买了一个xilinx spartan6 XC6SLX16的FPGA板子,但是不知道该怎么学习,求各位大侠指点…

查看全部问答>

AtmelStudio6.0 下atmega88的调试和仿真

AtmelStudio6.0 下atmega88的调试和仿真   这几天一直在调试atmega88PA这款单片机,用的开发环境是AtmelStudio6.0,绕了不少弯路,网上关于这方面的资料也不多;在这里分享一下自己的调试过程,供大家一起学习。 1、双击快捷方式打开 ...…

查看全部问答>

TI推出手机电源系统解决方案

TI 移动手机电源系统可以满足从电池到显示和通讯接口的全部电源管理需求。这款解决方案包含高度集成和优化的器件,为手机应用而特别设计,并且将电源和RF 系统中的主导负载效率提升到最高,同时它具有集成保护功能,实现了安全的电池管理和相机闪光 ...…

查看全部问答>