乐趣区

关于嵌入式:那些和优化相关的事儿

前言

优化是一个神奇的事件,可化腐朽为神奇,此点金手为编译器,我常认为她是很好的人工智能,可把人类语言化为机器语言。

什么时候会用到优化?

发行的版本 release 个别都是二级优化的,因为优化能使可执行文件更小,执行效率更高。

什么时候不会用优化?

调试的版本 debug,因为为了保障源代码和二进制代码一一对应。

优化是否会出问题?

会的,有时候不加优化,程序能够失常运行。加了优化当前,程序不能够失常运行。

出了问题怎么办?

局部代码勾销优化

这种状况可最小范畴的勾销局部优化。咱们晓得,优化是通过编译参数 -O0/-O1/-O2/-O3/-Os 这种形式退出的。

  • 所以咱们能够对某一个代码文件应用编译参数 -O0,而其余代码文件依然应用 -O num 的形式。但这种形式并不不便,因为它波及到了批改编译参数,而编译参数往往是对立批改,而不是仅仅只批改某一个代码文件的编译参数。因而,有上面一种形式。
  • 应用预处理命令#pragma,在源码外面进行批改编译参数。而在源码中的编译参数会比 makefile 中的更高,而因而失效。

如果是 gcc 编译器,能够如下:

#pragma GCC push_options
#pragma GCC optimize("O0")
void func1()
{int a=2;}
#pragma GCC pop_options

如果是 armcc 编译器,能够如下:

#pragma O0
void func1()
{int a=2;}

volatile 关键字

遇到这个关键字申明的变量,编译器对拜访该变量的代码就不再进行优化,从而能够提供对非凡地址的稳固拜访。

简略来说就是,被 volatile 这个关键字申明的变量,是不会被优化,不论该文件的优化参数是 -O2 或者其它优化等级,队医这个变量来说,它就是-O0。这样来说,也是最小粒度的优化范畴了。

void func1()
{volatile int a=2;}

关注 && 分割

开源轻量操作系统:https://gitee.com/cmcc-oneos/OneOS-Lite

docs 文档核心:https://oneos-lite.com/

退出移动版