KEIL编译器【C语言编译选项优化等级说明】【支持C99(变量声明在执行语句之后)】【反汇编设置】【C语言联合汇编】【use microlib选项】
SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:http://www.sydtek.com/
KEIL编译器C语言编译选项优化等级说明
摘录于:http://blog.csdn.net/conquerwave/article/details/10450721
原文
0
Minimum optimization. Turns off most optimizations.It gives the best possible debug view and the lowest level of optimization. 近乎不优化,用于调试代码。出现代码行不能设置断点可如此设置试试。
1
Restrictedoptimization. Removes unused inline functions and unused static functions.Turns off optimizations that seriously degrade the debug view. Ifused with --debug
, this option gives a satisfactorydebug view with good code density.部分优化。移除未调用的内联函数和静态函数,关闭debug窗口优化,此状态也能用于调试
2
Highoptimization. If used with--debug
, the debug viewmight be less satisfactory because the mapping of object code tosource code is not always clear.
This is the default optimization level.
默认优化等级。如果处于debug状态,部分代码行将不能被调试,具体做了什么优化好像没说
3
Maximumoptimization.-O3
performs the same optimizationsas-O2
however the balance between space and timeoptimizations in the generated code is more heavily weighted towardsspace or time compared with-O2
. That is:
-O3 -Otime
aims to produce fastercode than-O2 -Otime
, at the risk of increasingyour image size-O3 -Ospace
aims to produce smallercode than-O2 -Ospace
, but performance might bedegraded.
In addition, -O3
performs extra optimizationsthat are more aggressive, such as:
High-levelscalar optimizations, including loop unrolling, for
-O3
-Otime
. Thiscan give significant performance benefits at a small code size cost,but at the risk of a longer build time.More aggressive inlining and automatic inliningfor
-O3 -Otime
.
KEIL编译器C语言编译选项优化等级设置不一样造成代码运行的效果完全不一样,下面是SYD8801上运行的实例!
主函数如下:
int main()
{
uint8_tkey_num=0;
gpio_config();
led_close();
timer_0_enable(0x20,timer0_callback); // 32 * 31.25 us = 1ms
__enable_irq();
while(1)
{
*(uint32_t*)GPO_CTRL &=0xffffff00;
*(uint32_t*)GPO_CTRL |=0x000000ff;
}
}
现在的编译器C环境设置如下:
编译、下载、复位后现象如下:
如果编译设置这样改:
编译、下载、复位现象是这样的:
所以一定要注意C编译器的优化选项,还有一点就是C编译器的设置选项也要关注的,虽然这里并没有出错,也就是如下图:
支持C99(变量声明在执行语句之后)
C语言目前已经支持变量声明在执行语句之后的操作了,不过这是C99的内容,KELL默认是不支持C99的,也就是说下面的写法KELL将会报错:
KELL要支持C99可以按照如下操作:
在低版本的KELL中也可以按照如下操作:
KEIL反汇编设置
摘录于:http://www.stmcu.org/module/forum/thread-602450-1-1.html
这里只是学习之用
KEIL反汇编设置
这里输入的命令是:fromelf -c .\output\uart2.axf -o .\output\uart2.txt
摘录于:http://www.stmcu.org/module/forum/thread-602450-1-1.html
这里只是学习之用
KEIL反汇编设置
这里输入的命令是:fromelf -c .\output\uart2.axf -o .\output\uart2.txt
这里输入的命令是:fromelf -c .\output\uart2.axf -o .\output\uart2.txt
摘录于:http://www.stmcu.org/module/forum/thread-602450-1-1.html
这里只是学习之用
KEIL反汇编设置
这里输入的命令是:fromelf -c .\output\uart2.axf -o .\output\uart2.txt
摘录于:http://www.stmcu.org/module/forum/thread-602450-1-1.html
这里只是学习之用
KEIL反汇编设置
这里输入的命令是:fromelf -c .\output\uart2.axf -o .\output\uart2.txt
C语言联合汇编
C语言联合汇编有两种形式,如下(不注释的和注释的这两种形式):
从宏观来看这两种格式好像是一样的,从执行效果而言都能够达到想要的调用,但是这两种格式是有本质性的区别的,第一种是把整个都作为汇编语言处理,这样在最后的汇编上整个函数就是一句话:swi 1,以为这调用这样的函数是不会有返回的,汇编代码如下:
而第二种写法是C语言的编译规则,这时候进入svc_call函数后编译器会自动的压栈并且结束后出栈,这时候就能够有正确的返回,汇编代码如下:
所以在C语言中嵌入汇编最好还是在函数里嵌入,而不是把整个函数变成汇编!
use microlib选项
本博客摘录于:https://blog.csdn.net/kelsey11/article/details/51246636
1.选上”Use MicroLIB”这是KEIL自带的一个简易的库,例如你用printf函数的时候,就会从串口1 输出字符串,直接默认定向到串口1
2.microlib 是缺省 C 库的备选库。 它用于必须在极少量内存环境下运行的深层嵌入式应用程序。 这些应用程序不在操作系统中运行。microlib 不会尝试成为符合标准的 ISO C 库。
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。某些库函数的运行速度也比较慢,例如,memcpy()。
3.
microlib 与缺省 C 库之间的主要差异是:
microlib 不符合 ISO C 库标准。 不支持某些 ISO 特性,并且其他特性具有的功能也较少。
microlib 不符合 IEEE 754 二进制浮点算法标准。
microlib 进行了高度优化以使代码变得很小。
无法对区域设置进行配置。 缺省 C 区域设置是唯一可用的区域设置。
不能将 main() 声明为使用参数,并且不能返回内容。
不支持 stdio,但未缓冲的 stdin、stdout 和 stderr 除外。
microlib 对 C99 函数提供有限的支持。
microlib 不支持操作系统函数。
microlib 不支持与位置无关的代码。
microlib 不提供互斥锁来防止非线程安全的代码。
microlib 不支持宽字符或多字节字符串。
与 stdlib 不同,microlib 不支持可选择的单或双区内存模型。 microlib 只提供双区内存模型,即单独的堆栈和堆区。
可以合理地将 microlib 与 --fpmode=std 或 --fpmode=fast 配合使用。
microlib 中的函数负责:
创建一个可在其中执行 C 程序的环境。 这包括:
创建一个堆栈
创建一个堆(如果需要)
初始化程序所用的库的部分组成内容。
调用 main() 以开始执行程序。
要使用 microlib 构建程序,必须使用命令行选项 ??library_type=microlib。 根据需要,编译器、汇编程序或链接器可使用此选项处理不同的文件。 将此选项与链接器配合使用时,将覆盖所有其他选项。
4.
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
#ifdef COM_EX
com_snd(COM2, 1, (unsigned char*)&ch);
#else
com_snd(COM1, 1, (unsigned char*)&ch);
#endif
return ch;
}
#endif
/*使用microLib的方法,在keil里面要勾选“Use MicroLIB”*/
// 以便使用 printf 函数
// #define UTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
// UTCHAR_PROTOTYPE
// {
// #ifdef COM_EX
// com_snd(COM2, 1, (unsigned char*)&ch);
// #else
// com_snd(COM1, 1, (unsigned char*)&ch);
// #endif
//
// return ch;
// }
我试了试确实是可以,不知道,如果不用Use MicroLIB,prinft 和sprintf 其他影响不,我去验证一下
KEIL编译器【C语言编译选项优化等级说明】【支持C99(变量声明在执行语句之后)】【反汇编设置】【C语言联合汇编】【use microlib选项】相关推荐
- KEIL编译器【C语言编译选项优化等级说明】
参考:https://blog.csdn.net/chengdong1314/article/details/53463183 KEIL编译器C语言编译选项优化等级说明 摘录于:http://blog ...
- c语言 判断一个图是否全连通_【连载】(判断执行语句)乐创DIY C语言讲义——3.8节(2)...
2 判断执行语句 判断执行语句,执行时候会有一个条件判断,一旦当条件判断为真,即True的时候,就执行相应的语句,满足条件被执行的语句用大括号"{}"括起来.由于在C语言中没有用于 ...
- c语言中的括号什么意思,C变量声明中的括号是什么意思?
括号是什么? 在C括号[]中的优先级高于星号* 从维基百科良好的解释: To declare a variable as being a pointer to an array, we must ma ...
- 【gcc】gcc优化等级 -O1 -O2 -O3 -Os -Ofast -Og
目录 优化等级 -O1 -O2 -O3 -Os -Ofast -Og cmake 生成 debug和 release 版|Cmake设置优化等级 优化等级 -O1 -O2 -O3 -Os -Ofast ...
- keil优化等级设置
优化级别说明(仅供参考): 则其中的 Code Optimization 栏就是用来设置C51的优化级别.共有9个优化级别(书上这么写的),高优化级别中包含了前面所有的优化级别.现将各个级别说明 ...
- keil优化等级影响STM32 GPIO速度变化
keil优化等级设置为Level 0时,增加或删除部分GPIO翻转的指令,发现GPIO翻转的脉宽会变化. 如l优化等级设置为Level 0时,以下高电平时间为80ns, LL_GPIO_ResetOu ...
- 单片机编程软件很简单(22),keil单片机编程软件优化等级+概念解析
单片机编程软件是单片机使用过程中不可缺少的一环,因此对于单片机编程软件,相关人员应当具备一定了解.往期文章中,小编对单片机编程软件有过诸多介绍.本文对于单片机编程软件的介绍基于两点:1.keil单片机 ...
- keil编译器的优化问题 关键字volatile的使用
void main(void) {unsigned int y=0x1314; unsigned char yh=0,yl=0;initcpu();yl=y%256;//取余数得低8位yh=y/256 ...
- 干货:嵌入式C语言源代码优化方案(非编译器优化)
点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中 ...
最新文章
- 【JS基础】Array数组的创建与操作方法
- 别忘了在使用MES系统之前,还有关键一步!
- C#中一行代码实现18位数字时间戳转换为DateTime
- Avalonia跨平台入门第九篇之控件置顶和置底
- POJ 计算几何(3)
- 第三周博客作业西北师范大学|李晓婷
- kafka partition分配_logstash消费kafka数据,partition分配不均衡
- 修改个人信息 python_python函数练习——个人信息修改
- Hadoop切换namenode为active
- sql 训练及总结
- Ubuntu Software Center has closed unexpectly解决方案
- Java后端防止获取短信验证码接口被恶意调用的代码实现
- web前端期末大作业 基于HTML+CSS家乡主题毕业设计源码
- PHP加密扩展库Mcrypt
- (3)odroid xu4/3 SD卡的ubuntu系统烧入
- html背景自动适应,css背景图片如何自适应?
- win10提示“你当前无权访问该文件夹“的解决方法
- 鸿蒙窍做何解释,终朝睡在鸿蒙窍 一任时人牛马呼
- Intellij IDEA社区版下载与安装教程
- dubbo 服务注册成功后出现 Failed to invoke the method * in the *
热门文章
- 当用户流失比较明显后,如何提升活跃度?
- 前端学习从入门到高级全程记录之23(webapi)
- uniapp无法唤起相机的避坑之旅(安卓10以上,以及鸿蒙手机)
- 计算机维修基础知识pdf,电脑主板维修基础知识.pdf
- access exex控制pc_access database engine32位-64位版
- CTO俱乐部系列之四:3G和移动互联网的CTO俱乐部活动
- 数据科学走向“去技术化”?投资银行家的转型新方向是数据科学
- Adobe Audition 2020 Mac 中文直装版下载教程
- 【VIS】Classifying,Segmenting,and Tracking Object Instances in Video with Mask Propagation
- 全球最有意思的传感器公司都有哪些?