c51优化等级keil_Keil系列教程06_⼯程⽬标选项配置(⼆)
说明:
strongerHuang』
本⽂原创作者『strongerHuang
嵌⼊式专栏』,同时也更新在我的个⼈⽹站:EmbeddedDevelop
⾸发于『嵌⼊式专栏
标签:Keil、 MDK-ARM、 µVision
标签:
该教程基于MDK-ARM,⼤部分内容也适⽤于Keil其它3款(C51、 C251、 C166)产品。
⼀、写在前⾯
C/C++编译、 Asm汇编、
本⽂接着上⼀篇⽂章《Keil系列教程05_⼯程⽬标选项配置(⼀)》讲述的⼯程⽬标选项的后五项配置:C/C++编译、 Asm汇编、Linker链接、 Debug调试、 Utilities公共。
Linker链接、 Debug调试、 Utilities公共
⼆、C/C++编译
这⾥“C/C++选项”和“Asm选项”类似,主要是与编译相关的⼀些配置。
第1处:预处理(Preprocessor Symbols)
这⾥主要就是预定义功能,相当于在程序中的#define xxxx。我上⾯预定义STM32F10X_HD,在stm32f10x.h⽂件中就不⽤定义了。第2处:语⾔/代码⽣成(Language / Code Generation)
Language/code Generation语⾔/代码⽣成。可以理解成编译、链接到最后⽣成代码。这部分功能对于代码优化⽐较重要,初学者可Language/code Generation语⾔/代码⽣成
以不⽤过多理解,对代码⼤⼩、运⾏速度等性能要求较⾼的⼈就需要深⼊理解。
Execute only Code:只⽣成执⾏代码
Execute only Code:只⽣成执⾏代码 【设置编译器命令⾏:--execute_only】 只⽣成执⾏代码防⽌编译器⽣成任何数据访问代码部分。
Optimize:优化选择项,有Level0 - Level3四个选项 【设置编译器命令⾏:-Onum】 初学者、在线调试建议使⽤Level0,也就是不Optimize:优化选择项,有Level0 - Level3四个选项
优化,这样执⾏的效果才和代码⼀样。如果配置成Level3,在线调试可能有些地⽅优化⽽不能打断点。
Optimize for Time:优化时间,即优化代码中费时的地⽅ 【设置编译器命令⾏:-Otime】 ⽐如有些算法,本⾝代码量就⽐较⼤,运Optimize for Time:优化时间,即优化代码中费时的地⽅
⾏需要很长时间(假如需要2秒),这个时候勾选上该功能,会发现运⾏时间有⽐较明显的减少(或许不到1秒时间)。
Split Load and Store Multiple:加载和存储多个分裂 【设置编译器命令⾏:--split_ldm】 ⾮对齐数据采⽤多次访问⽅式。当代码转换
Split Load and Store Multiple:加载和存储多个分裂
LMD/STM 指令有 4 个以上产⽣时,列分裂LMD 和 STM 指令,以减不中断延迟。
One ELF Section per Function:优化每⼀个函数 ELF 段 【设置编译器命令⾏:--split_sections】 每个函数都会产⽣⼀个 ELF One ELF Section per Function:优化每⼀个函数 ELF 段
段,勾选上,允许优化每⼀个 ELF 段。这个选项可以减少潜在的共享地址、数据和函数之间的字符串。
直⽩的意思:可以减少代码量ROM的⼤⼩(内存RAM不会减⼩)。
Code=2540 RO-data=336 RW-data=40
勾选之前: Program Size: Code=2540 RO-data=336
举⼀个例⼦,勾选之前和勾选之后,编译后存储⼤⼩对⽐: 勾选之前:
ZI-data=1024
Code=908 RO-data=320 RW-data=40 ZI-data=1024
勾选之后: Program Size: Code=908 RO-data=320
勾选之后:
Strict ANSI C:标准(严格)的ANSC 【设置编译器命令⾏:--strict】 也就是说:编译时严格按照标准的ANSI C进⾏检查。
Strict ANSI C:标准(严格)的ANSC
Enum Container always int:枚举总是int型 【设置编译器命令⾏:--enum_is_int】 很容易理解,我们枚举时成员变量类型为int Enum Container always int:枚举总是int型
型。
Plain Char is Signed:纯字符标记为字符 【设置编译器命令⾏:--signed_chars】 代码举例:char a[] = “abcd”; 也就是说
Plain Char is Signed:纯字符标记为字符
将“abcd”标记为字符型。
Read-Only Position Independent:为常量⽣成独⽴的代码空间 【设置编译器命令⾏:--apcs=/ropi】 ⽐如:我们定义字库变量Read-Only Position Independent:为常量⽣成独⽴的代码空间
为常量,勾选该选项,会将这些字库变量放在独⽴的代码空间。
Read-Write Position Independent:为可读写代码⽣成独⽴的代码空间 【设置编译器命令⾏:--apcs=/rwpi】
Read-Write Position Independent:为可读写代码⽣成独⽴的代码空间
Warnings:警告 【No Warnings设置编译器命令⾏:-W】 No Warnings:不会有警告提⽰和输出; All Warnings:所有警告提⽰和Warnings:警告
输出。
Thumb Mode:Thumb模式 指定设置⽂件或⽂件夹(组)为Thumb模式。 【注意:在⼯程中该模式为默认,也就是不能选择】Thumb Mode:Thumb模式
No Auto Includes:不⾃动添加头⽂件 不勾选该选项,编译器就会在Keil安装路径寻你⼯程中.h⽂件。 举例:我们定义uint8_t是定No Auto Includes:不⾃动添加头⽂件
义在stdint.h⽂件⾥⾯的,但是我们⼯程⽬录下⼀般是没有stdint.h⽂件。这时候,编译器就会在Keil路径下去寻stdint.h⽂件。
C99 Mode:C99标准模式 【设置编译器命令⾏:--c99】 C语⾳有标准有多个版本,如C89、C90、C99等。
C99 Mode:C99标准模式
GNU extensions:⽀持GUN扩展 GUN ARM C编译器是这后⾯新增⽀持的功能。
GNU extensions:⽀持GUN扩展
第3处:包含路径(Include Paths)
包含路径是使⽤Keil(及类似)软件必须掌握的⼀项。包含路径就是指定我们⼯程中使⽤⽂件所在的位置,让编译器到相应的⽂件。
可以参看我之前分享的⽂章《Keil系列教程02_新建基础软件⼯程》⾥⾯添加路径的⽅法。
添加路径动画效果:
第4处:多功能控件(Misc Controls)
例如:⽤⽇本语⾔来显⽰消息:--message_locale=ja_JP.
第5处:编译器控制字符串(Compiler control string)
这⾥是针对编译器执⾏的命令,显⽰当前在编译器命令⾏指令。
“第2处:语⾔代码⽣成”中有⼀个中括号【设置编译器命令⾏:】 ⾥⾯的命令就显⽰在这⾥。
在上⾯“第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)具Make RW Sections Position Independent:使RW段独⽴
有独⽴地址。 禁⽤时:变量区域(包含RW和ZI)位于绝对的内存地址。
Make RO Sections Position Independent:使RO段独⽴
Make RO Sections Position Independent:使RO段独⽴ 【设置编译器命令⾏:--ropi】 启⽤时:常量和代码区域(RO)具有独⽴地址。 禁⽤时:常量和代码区域(RO)位于绝对的内存地址。
Don't Search Standard Libraries:不搜索标准库 【设置编译器命令⾏:--noscanlib】 禁⽤默认编译器运⾏时库的扫描。
Don't Search Standard Libraries:不搜索标准库
Report 'might fail' Conditions as Errors:报告'might fail'条件认为是错误 【设置编译器命令⾏:--strict】 报告的条件可能导Report 'might fail' Conditions as Errors:报告'might fail'条件认为是错误
致失败的错误,⽽不是警告。
X/O Base:X/O基地址 【设置编译器命令⾏:--xo_base=address】
X/O Base:X/O基地址
R/O Base:R/O基地址 【设置编译器命令⾏:--ro_base=address】
R/O Base:R/O基地址
R/W Base:R/W基地址 【设置编译器命令⾏:--rw_base=address】
R/W Base:R/W基地址
disable Warnings:警⽤警告 【设置编译器命令⾏:--diag_suppress】
disable Warnings:警⽤警告
第2处:分散⽂件(Scatter File)
这⾥可以加载、查看和编辑分散⽂件。点击后⾯就的三点“...”可以加载⽂件;点击“”查看和编辑对应的⽂件。
五、Debug调试
这个选项⽐较重要,主要⽤于(软件仿真、硬件在线)调试使⽤。由于软件仿真和硬件在线调试配置类似,这⾥只讲述硬件在线调试(右边部分)。
第1处:选择硬件在线调试
选择下载调试器,以及对应的设置“Setting”。 很多⼈常⽤J-Link下载调试器,⽽调试STM32时,可以
使⽤四线SWD模式。如果使⽤J-Link进⾏SWD调试。这个时候就需要在“Setting”⾥⾯选择“SW”模式,如下如:
第2处:选择硬件在线调试
Load Application at Startup:启动时加载应⽤程序。
Load Application at Startup:
Run to main():程序执⾏到main()函数。 进⼊调试模式时,程序⾃动运⾏到main函数处。
Run to main():
Initialization File:加载、编辑初始化⽂件。 这⾥在某些情况下可以使⽤,⽐如:在RAM中调试代码。可以参看我的⽂章《STM32内Initialization File:
部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处:管理组件描述⽂件
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论