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选项】相关推荐

  1. KEIL编译器【C语言编译选项优化等级说明】

    参考:https://blog.csdn.net/chengdong1314/article/details/53463183 KEIL编译器C语言编译选项优化等级说明 摘录于:http://blog ...

  2. c语言 判断一个图是否全连通_【连载】(判断执行语句)乐创DIY C语言讲义——3.8节(2)...

    2 判断执行语句 判断执行语句,执行时候会有一个条件判断,一旦当条件判断为真,即True的时候,就执行相应的语句,满足条件被执行的语句用大括号"{}"括起来.由于在C语言中没有用于 ...

  3. c语言中的括号什么意思,C变量声明中的括号是什么意思?

    括号是什么? 在C括号[]中的优先级高于星号* 从维基百科良好的解释: To declare a variable as being a pointer to an array, we must ma ...

  4. 【gcc】gcc优化等级 -O1 -O2 -O3 -Os -Ofast -Og

    目录 优化等级 -O1 -O2 -O3 -Os -Ofast -Og cmake 生成 debug和 release 版|Cmake设置优化等级 优化等级 -O1 -O2 -O3 -Os -Ofast ...

  5. keil优化等级设置

    优化级别说明(仅供参考): 则其中的 Code Optimization    栏就是用来设置C51的优化级别.共有9个优化级别(书上这么写的),高优化级别中包含了前面所有的优化级别.现将各个级别说明 ...

  6. keil优化等级影响STM32 GPIO速度变化

    keil优化等级设置为Level 0时,增加或删除部分GPIO翻转的指令,发现GPIO翻转的脉宽会变化. 如l优化等级设置为Level 0时,以下高电平时间为80ns, LL_GPIO_ResetOu ...

  7. 单片机编程软件很简单(22),keil单片机编程软件优化等级+概念解析

    单片机编程软件是单片机使用过程中不可缺少的一环,因此对于单片机编程软件,相关人员应当具备一定了解.往期文章中,小编对单片机编程软件有过诸多介绍.本文对于单片机编程软件的介绍基于两点:1.keil单片机 ...

  8. keil编译器的优化问题 关键字volatile的使用

    void main(void) {unsigned int y=0x1314; unsigned char yh=0,yl=0;initcpu();yl=y%256;//取余数得低8位yh=y/256 ...

  9. 干货:嵌入式C语言源代码优化方案(非编译器优化)

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中 ...

最新文章

  1. 【JS基础】Array数组的创建与操作方法
  2. 别忘了在使用MES系统之前,还有关键一步!
  3. C#中一行代码实现18位数字时间戳转换为DateTime
  4. Avalonia跨平台入门第九篇之控件置顶和置底
  5. POJ 计算几何(3)
  6. 第三周博客作业西北师范大学|李晓婷
  7. kafka partition分配_logstash消费kafka数据,partition分配不均衡
  8. 修改个人信息 python_python函数练习——个人信息修改
  9. Hadoop切换namenode为active
  10. sql 训练及总结
  11. Ubuntu Software Center has closed unexpectly解决方案
  12. Java后端防止获取短信验证码接口被恶意调用的代码实现
  13. web前端期末大作业 基于HTML+CSS家乡主题毕业设计源码
  14. PHP加密扩展库Mcrypt
  15. (3)odroid xu4/3 SD卡的ubuntu系统烧入
  16. html背景自动适应,css背景图片如何自适应?
  17. win10提示“你当前无权访问该文件夹“的解决方法
  18. 鸿蒙窍做何解释,终朝睡在鸿蒙窍 一任时人牛马呼
  19. Intellij IDEA社区版下载与安装教程
  20. dubbo 服务注册成功后出现 Failed to invoke the method * in the *

热门文章

  1. 当用户流失比较明显后,如何提升活跃度?
  2. 前端学习从入门到高级全程记录之23(webapi)
  3. uniapp无法唤起相机的避坑之旅(安卓10以上,以及鸿蒙手机)
  4. 计算机维修基础知识pdf,电脑主板维修基础知识.pdf
  5. access exex控制pc_access database engine32位-64位版
  6. CTO俱乐部系列之四:3G和移动互联网的CTO俱乐部活动
  7. 数据科学走向“去技术化”?投资银行家的转型新方向是数据科学
  8. Adobe Audition 2020 Mac 中文直装版下载教程
  9. 【VIS】Classifying,Segmenting,and Tracking Object Instances in Video with Mask Propagation
  10. 全球最有意思的传感器公司都有哪些?