编译器优化导致的问题排故

编译器优化导致的问题排故

Q:编译器优化导致的问题排查方法
当 release 版本功能异常,而 debug 版本功能正常,很可能是编译器优化导致的问题。
1、首先根据代码功能大致缩小问题范围,然后可以借助 #pragma GCC optimize("O0") 这个宏来逐步注释缩小范围。
当然也可通过反汇编直接根据分析。
2、也可以通过 __attribute__((optimize("O0"))) 来禁止编译器对函数优化,如 static void rdGmacReg() __attribute__((optimize("O0")));
3、常见编译器优化的情况有:
使用 for 循环来延时,可改用延时函数来延时;
寄存器优化, 如果防止优化,可以在在地址定义前加 volatile。

    • Related Articles

    • Qt5 套件编译器配置异常

      Q:Qt5 套件中无编译器且无法导入工程该如何解决? 如出现 Kits 中的 Qt Versions 界面显示红标及编译器界面无对应的 C/C++ 编译器: 当出现这两种状况及无法导入工程时,可以先关闭 Qt5 应用,再通过删除C盘 -> 用户 -> 主机名 -> AppData -> Roaming 目录下 的 QtProject 文件夹后重启 Qt5 应用即可。 原因分析: QtProject 文件夹中存储的是 Qt 的配置文件,Qt ...
    • SylixOS 的 GCC 编译工具链介绍

      问:翼辉的 gcc 编译工具链是基于 GNU 编译器套件的哪个版本进行优化的? RealEvo-IDE 编译工具链说明 翼辉的 gcc 工具链是 基于 GNU 编译器套件 gcc version 4.9.3 针对不同 CPU 兼容指令集进行优化。不同架构工具链版本差异请查看具体工具链内部。 注:RealEvo-IDE(4.0.0)以前,所使用的编译器版本主要为4.9.3,是2014 年开 发的版本,随着cpu 的推陈出新和gcc 的发展,需要升级编译器方能支持新的 cpu 和体验进年来gcc ...
    • 如何屏蔽 Unusedvariable

       Q:如何消除定义后未使用的变量引起的编译警告 例1:可以使用 “__unused” 关键字,对于定义后未使用的变量,在编译后也不会引起警告,如下图所示。 例2:__attribute__((unused)) 对于定义后的静态函数static void a(void)  ,在编译后也不会引起警告__attribute__((unused)) static void a(void); 或者添加编译参数去掉警告。 更多扩展知识见: 参考文章:编译器优化导致的问题排故
    • SylixOS 的编译工具链优化等级是怎样的?

      Q:SylixOS 的 IDE 开发环境中,配置工具链中的 release 和 debug 选项优化等级是怎样的? 在 SylixOS 的 IDE 中编译工具链 release 是 O2 优化等级,debug 是 O0 优化等级。
    • 在 SylixOS INT8 类型是否带有符号

      Q:在 SylixOS INT8 类型是否带有符号 INT8 类型在 BSP 中定义, SylixOS 要求 INT8 型为有符号 8 位整形, 有些编译器默认 char 为无符号数, 所以在 BSP 中定要将 INT8 定义为 signed char 型.  (int8_t 类型由 INT8 定义, C99 中要求 int8_t 为有符号数)INT8 类型在 BSP 中定义, SylixOS 要求 INT8 型为有符号 8 位整形, 有些编译器默认 char 为无符号数, 所以在 ...