1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > KEIL编译器【C语言编译选项优化等级说明】【支持C99(变量声明在执行语句之后)】【反汇

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

时间:2019-01-31 13:00:22

相关推荐

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

SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:/

KEIL编译器C语言编译选项优化等级说明

摘录于:/conquerwave/article/details/10450721

原文

0Minimum optimization. Turns off most optimizations.It gives the best possible debug view and the lowest level of optimization. 近乎不优化,用于调试代码。出现代码行不能设置断点可如此设置试试。

1Restrictedoptimization. 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窗口优化,此状态也能用于调试

2Highoptimization. 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状态,部分代码行将不能被调试,具体做了什么优化好像没说

3Maximumoptimization.-O3performs the same optimizationsas-O2however the balance between space and timeoptimizations in the generated code is more heavily weighted towardsspace or time compared with-O2. That is:

-O3 -Otimeaims to produce fastercode than-O2 -Otime, at the risk of increasingyour image size

-O3 -Ospaceaims to produce smallercode than-O2 -Ospace, but performance might bedegraded.

In addition,-O3performs 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反汇编设置

摘录于:/module/forum/thread-602450-1-1.html

这里只是学习之用

KEIL反汇编设置

这里输入的命令是:fromelf -c .\output\uart2.axf -o .\output\uart2.txt

摘录于:/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

摘录于:/module/forum/thread-602450-1-1.html

这里只是学习之用

KEIL反汇编设置

这里输入的命令是:fromelf -c .\output\uart2.axf -o .\output\uart2.txt

摘录于:/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选项

本博客摘录于:/kelsey11/article/details/51246636

1.选上”UseMicroLIB”这是KEIL自带的一个简易的库,例如你用printf函数的时候,就会从串口1输出字符串,直接默认定向到串口1

2.microlib是缺省C库的备选库。它用于必须在极少量内存环境下运行的深层嵌入式应用程序。这些应用程序不在操作系统中运行。microlib不会尝试成为符合标准的ISOC库。

microlib进行了高度优化以使代码变得很小。它的功能比缺省C库少,并且根本不具备某些ISOC特性。某些库函数的运行速度也比较慢,例如,memcpy()。

3.

microlib与缺省C库之间的主要差异是:

microlib不符合ISOC库标准。不支持某些ISO特性,并且其他特性具有的功能也较少。

microlib不符合IEEE754二进制浮点算法标准。

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函数,而不需要选择useMicroLIB

#if1

#pragmaimport(__use_no_semihosting)

//标准库需要的支持函数

struct__FILE

{

inthandle;

};

FILE__stdout;

//定义_sys_exit()以避免使用半主机模式

_sys_exit(intx)

{

x=x;

}

//重定义fputc函数

intfputc(intch,FILE*f)

{

#ifdefCOM_EX

com_snd(COM2,1,(unsignedchar*)&ch);

#else

com_snd(COM1,1,(unsignedchar*)&ch);

#endif

returnch;

}

#endif

/*使用microLib的方法,在keil里面要勾选“UseMicroLIB”*/

//以便使用printf函数

//#defineUTCHAR_PROTOTYPEintfputc(intch,FILE*f)

//UTCHAR_PROTOTYPE

//{

//#ifdefCOM_EX

// com_snd(COM2,1,(unsignedchar*)&ch);

//#else

// com_snd(COM1,1,(unsignedchar*)&ch);

//#endif

//

// returnch;

//}

我试了试确实是可以,不知道,如果不用UseMicroLIB,prinft和sprintf其他影响不,我去验证一下

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。