KEIL MDK 的优化

用KEIL MDK uVision4,如下程序,GPS_flg 是一个全局变量,当有GPS数据时就会中断被置1,结果我在while(1)外面判断GPS_flg就始终为0,进入死循环出不来,在while(1)里面就可以判断到GPS_flg为1,最后找不到问题,把优化level1改成level0就好了。折腾了半天时间,难道优化这么恐怖?

main()
{...
  while(GPS_flg == 0)
  {;}
  while(1)
  {
    if(GPS_flg == 0)
      i++;
    if(GPS_flg == 1)
    {
      xprintf("i = %d/r/n", i++);
      i=0;
    }
  ...
  }
}
下面是论坛大哥们的发言:

Keil不优化的时候,所有变量用到时必然会从内存读。开了优化就可能寄存器。
中断要设置的变量 最好 volatile

虽然我已经试过了volatile,不行,但从今以后一定会加上volatile这点 

 

Keil RMDK 默认优化是LEVEL 2

 

 

<think>嗯,用户想了解如何在Keil MDK中进行编译优化,特别是关于OSBalance参数的设置。首先,我需要回忆一下Keil MDK的编译优化选项。记得在Keil中,优化设置位于“Options for Target” -> “C/C++”选项卡下的“Optimization”部分。这里有不同优化等级,比如-O0到-O3,以及-Oz。OSBalance可能是一个特定的优化选项,可能和代码大小与执行速度的平衡有关。 接下来,用户提到的引用内容中,引用[3]提到Keil的编译优化设置方法,说明优化选项可以调整代码速度和尺寸。这可能涉及到如何选择不同的优化等级,以及每个等级的具体影响。比如,-O0是不优化,适合调试;-O3是最高优化,可能增加代码速度但影响调试。而OSBalance可能是在某个优化等级下的子选项,需要具体查看。 然后,OSBalance参数可能需要更深入的了解。在ARM编译器中,可能有特定的编译选项或参数来控制优化策略,比如平衡代码大小和速度。例如,--opt_level=4 --split_sections,这样的参数可能帮助减少代码尺寸。OSBalance可能是在这里设置的某个参数,或者需要特定的编译指令。 还需要考虑用户是否在使用RT-Thread或其他实时操作系统,因为引用[2]提到了RT-Thread Studio和Keil MDK的不同编译环境。在OSBalance的上下文中,可能需要调整优化设置以适应操作系统的需求,比如任务调度或中断响应时间。 另外,用户可能遇到编译速度慢的问题,引用[1]提到编译速度慢的解决方法,这可能与优化选项有关,因为更高的优化等级可能导致更长的编译时间。因此,在配置OSBalance时,需要权衡优化效果和编译时间。 现在需要将这些信息整理成步骤,首先介绍优化等级,然后具体说明OSBalance相关设置,可能涉及编译器控制指令或特定选项。还要提到注意事项,比如调试与优化的平衡,以及如何验证优化效果。 最后,生成相关问题,可能涉及其他优化技巧、常见问题或与特定操作系统的结合使用。确保回答结构清晰,分步骤说明,并引用提供的参考资料。</think>### Keil MDK 编译优化及 OSBalance 参数配置指南 #### 一、编译优化基础设置 1. **优化等级选择** 在 Keil MDK 中,优化等级通过 `Options for Target` -> `C/C++` -> `Optimization` 设置。常用等级包括: - `-O0`:关闭优化,保留完整调试信息,适合开发阶段调试[^3]。 - `-O1`:基础优化,平衡代码尺寸和速度。 - `-O2`:较高优化,提升执行效率,可能增加代码体积。 - `-O3`:最高优化,侧重性能,但可能影响调试。 - `-Oz`:极致代码尺寸优化,适用于存储受限场景[^3]。 2. **优化目标控制** 通过 `Optimization` 栏的 `Focus on` 选项选择优化侧重: - `Balanced`:平衡代码尺寸与速度。 - `Favor speed`:优先执行效率。 - `Favor size`:优先减少代码体积。 #### 二、OSBalance 相关配置 **OSBalance** 是 RT-Thread 实时操作系统中用于任务负载均衡的模块,需结合编译优化确保其稳定性: 1. **代码优化与任务调度兼容性** - 避免使用 `-O3` 等激进优化,可能破坏任务切换的临界区保护(如关中断操作)。 - 推荐使用 `-O1` 或 `-O2` 并开启 `Optimize for Time`,兼顾效率与可靠性。 2. **关键函数优化豁免** 对 OSBalance 的核心函数(如任务调度器)添加 `__attribute__((optimize("O0")))`,强制关闭优化以保持逻辑正确性: ```c __attribute__((optimize("O0"))) void os_balance_scheduler(void) { // 任务调度逻辑 } ``` 3. **链接阶段优化(LTO)** 在 `Options for Target` -> `C/C++` 中勾选 `Link-Time Optimization`,全局优化跨文件代码,减少冗余指令,提升 OSBalance 调度效率[^3]。 #### 三、验证与调试 1. **反汇编检查** 通过 `Debug` 模式查看生成的汇编代码,确认关键函数(如中断服务例程)未被过度优化。 2. **性能监控** 使用 Keil MDK 的 `Event Viewer` 分析任务切换耗时,验证优化后 OSBalance 的响应效率。 #### 四、编译加速技巧 1. 关闭 `Browse Information` 生成功能。 2. 启用多核并行编译(`Options for Target` -> `Output` -> `Multi-threaded`)[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值