我有一个代码在-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();
}
buggy行由
_oscctrl_init_referenced_generators();
行调用。我想知道优化代码和非优化代码之间的区别,如果你们知道非优化嵌入式代码的任何问题。
我正在开发一个SAML21J18B单片机,嵌入一个Cortex-M0+CPU。
最佳答案
我的回答和评论不同看你的代码,它看起来像你在玩振荡器控制,所以我认为你没有使用正确的过程来配置或调整振荡器。
取决于你正在尝试做什么,你可能需要在调整振荡器参数之前切换到不同的时钟,通过断开和步进,你可能会丢失你的时钟如果不进行优化,可能会有一些额外的指令导致相同的结果。
参考零件的参考手册,并确保所有操作都正确不过,对于这种思路,您的问题需要更多的代码和微控制器模型(而不仅仅是核心类型)。