我有一段代码,通过 -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/