没有优化(-O0)会导致嵌入式MCU

时间:2016-09-02 10:44:50

标签: c gcc embedded compiler-optimization atmel

我的代码在-O1优化时效果很好,但如果我不优化代码就会崩溃。正在执行的最后几行如下:

    OSCCTRL_CRITICAL_SECTION_ENTER();
    ((Oscctrl *)hw)->DFLLCTRL.reg = data;

如果我在最后一行放置一个断点,然后转到下一条指令,则调试器将失去对执行指针的跟踪。

此代码作为芯片初始化的一部分被调用,这是以下一系列功能:

void _init_chip(void)
{
    hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, CONF_NVM_WAIT_STATE);
    _set_performance_level(2);
    OSC32KCTRL->RTCCTRL.bit.RTCSEL = 0x4;
    _osc32kctrl_init_sources();
    _oscctrl_init_sources();
    _mclk_init();
    _gclk_init_generators();
    _oscctrl_init_referenced_generators();
}

错误的行由_oscctrl_init_referenced_generators();行调用。

我想知道优化和非优化代码之间的区别,如果你们有任何已知的非优化嵌入式代码问题。 我正在开发SAML21J18B MCU,嵌入了Cortex-M0 + CPU。

3 个答案:

答案 0 :(得分:3)

我的方向不同于其他答案和评论。查看您的代码,看起来您正在使用振荡器控制,因此我认为您没有使用正确的过程来配置或调整振荡器。

根据您的尝试,您可能需要在调整振荡器参数之前切换到不同的时钟,通过断开和踩踏,您可能会丢失时钟。如果不进行优化,可能会有一些额外的指令导致相同的结果。

参考该部分的参考手册,确保您正确地完成所有操作。但是,对于这种思路,您的问题需要该领域的更多代码和微控制器的模型(而不仅仅是核心类型)。

答案 1 :(得分:0)

最明显的优化效果将是调试器显示执行状态的能力。调试行为可能会干扰程序执行。特别是对于该芯片,某些振荡器配置可能会引起问题。

但是,调试器可能不是您的问题。如果您进入_oscctrl_init_referenced_generators();您可能会发现您配置的振荡器之一没有启动,并且代码正在等待DFLL或FDPLL获得稳定的频率锁定。可能有多种原因。检查上游振荡器是否已配置并正在运行。

答案 2 :(得分:-1)

简而言之,不同之处在于优化取决于其类型可能会简化一些代码构造,以及更改内存中数据的位置。因此,在大多数情况下,关于代码设计的这种行为信号不能很好地完成。最典型的原因是使用非初始化变量,悬挂指针,超出边界访问或具有类似问题。因此,您应该避免依赖于由于优化而可能会出错的假设的代码构造。根据编译器和优化级别,在某些情况下使用volatile也可能有所帮助。

此外,如果您至少执行严格的代码审查+静态代码分析,并确保没有编译器警告,则行为应与优化无关。