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