当前位置:   article > 正文

KEIL编译器【C语言编译选项优化等级说明】【支持C99(变量声明在执行语句之后)】【反汇编设置】【C语言联合汇编】【use microlib选项】_keil use microlib

keil 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  其他影响不,我去验证一下

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/194798
推荐阅读
相关标签
  

闽ICP备14008679号