c - 无优化 (-O0) 会导致嵌入式 MCU 崩溃

标签 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。

最佳答案

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

根据您想要执行的操作,您可能需要在调整振荡器参数之前切换到不同的时钟,并且通过中断和步进,您可能会丢失时钟。当您不进行优化时,可能有一些额外的指令会导致相同的结果。

查阅该部件的引用手册并确保您所做的一切都是正确的。不过,对于这种思路,您的问题需要更多该领域的代码和微 Controller 的模型(而不仅仅是核心类型)。

关于c - 无优化 (-O0) 会导致嵌入式 MCU 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39290488/

相关文章:

无法将内核的原型(prototype)放在 header 中

使用 Lauterbach (Trace32) 进行调试

c - 如何初始化一个 wchar_t 变量?

c++ - 传递 &arr(整个 block 的地址)或仅传递数组名称(第一个元素的地址)有什么区别吗?

c++ - 将 unsigned long long int 转换为 signed long long int 可能吗?

php - 词典搜索

c - OpenCL:将指向全局内存的指针存储在本地内存中?

C语言,我的函数没有返回值,无法修复它

gcc - '-Olimit 2000' 对于 cc 意味着什么

c - 了解程序中变量的多重声明和 GCC 编译器行为