У меня есть код, который отлично работает с оптимизацией -O1
, но это сбой, если я не оптимизирую код. Последние строки, которые выполняются, являются следующие:Отсутствие оптимизации (-O0) вызывает сбой во встроенном MCU
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();
линии.
Я хотел бы знать разницу между оптимизированным и неоптимизированным кодом, и если вы, ребята, какие-либо известные проблемы с неоптимизированным встроенным кодом. Я разрабатываю MCU SAML21J18B, внедряя процессор Cortex-M0 +.
Очень вероятно, что ваш код демонстрирует ** неопределенное поведение ** (например, недопустимый указатель), который просто имеет разные побочные эффекты в зависимости от уровня компиляции. –
Если я оптимизирую и сломаю этот точный фрагмент кода, он тоже сработает. Однако, если я не нарушу эту позицию кода, он будет работать нормально. – user1943797
Если он «теряет трек», это обычно означает, что ваш критический раздел не может быть введен и код блокируется. Ошибки синхронизации очень часто чувствительны к времени, поэтому вопрос о том, действительно ли оптимизирован код, имеет значение. Не ожидайте получить что-нибудь на следующей неделе :) –