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

news2024/11/26 23:19:20

图片

   

1写在前面

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

图片

2

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处:语言代码生成”中有一个中括号【设置编译器命令行:】里面的命令就显示在这里。

3

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:不自动添加头文件(一般不勾选)。

4

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...”查看和编辑对应的文件。

图片

5

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

这里一般不用去管理。

6

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源代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学建模-因子分析模型

导入数据的路径不能有英文 这边的框框自己放的

iOS-持久化

目的 1.快速展示,提升体验 已经加载过的数据,用户下次查看时,不需要再次从网络(磁盘)加载,直接展示给用户 2.节省用户流量(节省服务器资源) 对于较大的资源数据进行缓存&#xf…

探索容器镜像安全管理之道

邓宇星,Rancher 中国软件架构师,7 年云原生领域经验,参与 Rancher 1.x 到 Rancher 2.x 版本迭代变化,目前负责 Rancher for openEuler(RFO)项目开发。 最近 Rancher v2.7.4 发布了,作为一个安全更新版本,也…

(二)安装部署InfluxDB

以下内容来自 尚硅谷,写这一系列的文章,主要是为了方便后续自己的查看,不用带着个PDF找来找去的,太麻烦! 第 2 章 安装部署InfluxDB 1、linux 安装方式如下 通过包管理工具安装,比如apt 和yum直接下载可执…

PHP注册、登陆、6套主页-带Thinkphp目录解析-【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图主页注册,登陆 phpStudy 设置导数据库项目目录如图:代码部分:控制器前台的首页 其它配套页面展示直接给第二套方案的页面吧第三套…

不会编程也能做数据分析?奥威BI系统就这么任性

BI系统有强大的大数据计算分析能力,能在短时间内完成海量数据智能可视化分析,满足大数据时代企业精细化数据分析要求。早期BI系统要求使用者具备一定IT基础,导致业务无法自主分析,而随着零编程BI系统的出现,业务部门也…

vue中实现列表自由拖拽排序

元素的 dragable 属性设置 为 true &#xff08;文本 图片 链接 的draggable 属性默认为 true&#xff09;则元素可拖放 <template><transition-group class"list"><uldragstart"dragstart(index)"dragenter"dragenter($event, index)…

代码-【3 队列判断是否相同】

前提条件&#xff1a; int QueueEmpty(Queue Q); //判断队列空否&#xff0c;1为空&#xff0c;0为不空 int GetHead(Queue Q,ElemTypes &x); //通过x返回队头元素的值 void EnQueue(Queue &Q.ElemType x); //将新元…

网络—零拷贝

一、前言 磁盘可以说是计算机系统最慢的硬件之一&#xff0c;读写速度相差内存 10 倍以上。所以为了提高系统吞吐量&#xff0c;减少磁盘访问次数&#xff0c;有很多优化措施&#xff0c;比如直接IO、异步IO&#xff0c;但其实还有一种优化策略&#xff0c;那就是——零拷贝&am…

脉冲频率、转速计算(信捷PLC C语言FC编程应用)

转速、线速度、角速度转换和计算关系请查看下面文章链接: 转速/线速度/角速度计算FC_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,关于绕线机的绕线算法,大家可以参看…

Python学习笔记-Django框架基础,APP,数据模型,后台管理,路由

一、Django框架简介 Django框架是Python的常用web框架&#xff0c;遵循 MVC 设计模式的框架&#xff0c;采用了MTV的框架模式&#xff0c;即模型M&#xff0c;视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的&#xff0c;即是CMS&…

趋动科技携手星辰天合,推出针对人工智能领域的两款联合解决方案

近日&#xff0c;趋动科技与 XSKY星辰天合联合宣布&#xff0c;结合双方优势能力和产品&#xff0c;携手推出高性能数据湖一站式方案及全协议存算一体化方案&#xff0c;帮助客户简化 AI 工作的 IT 基础设施部署&#xff0c;实现 AI 相关工作更加灵活和便捷。 全协议存算一体化…

银河麒麟服务器安装wireshark

安装 yum install -y wireshark 界面展示 双击打开即可 上图为抓包工作界面

kubernetes持久化存储卷

kubernetes持久化存储卷 kubernetes持久化存储卷一、存储卷介绍二、存储卷的分类三、存储卷的选择四、本地存储卷之emptyDir五、本地存储卷之 hostPath六、网络存储卷之nfs七、PV(持久存储卷)与PVC(持久存储卷声明)7.1 认识pv与pvc7.2 pv与pvc之间的关系7.3 实现nfs类型pv与pvc…

通过cmake工程生成visual studio解决方案

1、前言 visual studio是一个很强大的开发工具&#xff0c;这个工具主要是通过解决方案对我们的源码进行编译等操作。但是我们很多时候拿到的可能并不是一个直接的解决方案&#xff0c;可能是是一个cmake工程&#xff0c;那么这个时候我们就需要通过cmake工程生成解决方案&…

力扣题库刷题笔记75--颜色分类

1、题目如下&#xff1a; 2、个人Pyhon代码实现如下&#xff1a; 第一种思路是取巧&#xff0c;通过计数0、1、2的个数&#xff0c;去替换nums 备注第10行代码在本地可以跑过&#xff0c;但是力扣跑不过&#xff0c;所以就用了第10-16行代码进行替换 第二种思路是通过冒泡排序去…

智慧导诊系统源码:基于springboot+redis+mybatis plus和mysql开发

智慧导诊系统源码 智慧导诊小程序源码&#xff0c;智慧导诊APP源码 人们经常去医院以不知道挂什么科而烦恼&#xff0c;有些病人不方便问又不好意思问。在互联网医院中挂号且又不知该挂什么科&#xff0c;找什么类型的医生&#xff0c;这些不足&#xff0c;给患者带来了极大的…

chrome macos编译

下载工具包 git clone https://chromium.googlesource.com/chromium/tools/depot_tools/gitpwd export PATH"$PATH:/Users/lichengjun/Downloads/chrome_build/depot_tools" mkdir chromium cd chromium 如果想快的话直接: fetch --nohooks --no-history chromium (…

深度学习(二)

目录 一、神经网络 整体架构: 架构细节: 神经元个数的影响: 神经网络过拟合解决: 卷积网络 整体架构: 卷积层 边缘填充 特征尺寸计算 池化层 特征图变化 递归神经网络 一、神经网络 整体架构: 图中分别为输入层、隐层1、隐层2、输出层 通过输入层输入某数值&#xf…

【Java基础教程】(四十四)IO篇 · 上:解析Java文件操作——File类、字节流与字符流,分析字节输出流、字节输入流、字符输出流和字符输入流的区别

Java基础教程之IO操作 上 &#x1f539;本节学习目标1️⃣ 文件操作类&#xff1a;File2️⃣ 字节流与字符流2.1 字节输出流&#xff1a;OutputStream2.2 字节输入流&#xff1a;InputStream2.3 字符输出流&#xff1a;Writer2.4 字符输入流&#xff1a;Reader2.5 字节流与字符…