SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:/
KEIL编译器C语言编译选项优化等级说明
摘录于:/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反汇编设置
摘录于:/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选项】