2016-09-02 7 views
2

У меня есть код, который отлично работает с оптимизацией -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 +.

+4

Очень вероятно, что ваш код демонстрирует ** неопределенное поведение ** (например, недопустимый указатель), который просто имеет разные побочные эффекты в зависимости от уровня компиляции. –

+0

Если я оптимизирую и сломаю этот точный фрагмент кода, он тоже сработает. Однако, если я не нарушу эту позицию кода, он будет работать нормально. – user1943797

+2

Если он «теряет трек», это обычно означает, что ваш критический раздел не может быть введен и код блокируется. Ошибки синхронизации очень часто чувствительны к времени, поэтому вопрос о том, действительно ли оптимизирован код, имеет значение. Не ожидайте получить что-нибудь на следующей неделе :) –

ответ

-1

Короче говоря, разница в том, что оптимизация в зависимости от ее типа может упростить некоторые конструкции кода, а также изменить местоположение данных в памяти. Таким образом, в большинстве случаев такие сигналы поведения о дизайне кода не улучшаются. Наиболее типичными причинами являются использование неинициализированных переменных, зависающих указателей, выход из граничного доступа или имеющих похожие проблемы. Таким образом, вы должны избегать конструкций кода, которые зависят от допущений, которые могут стать неправильными из-за оптимизации. В зависимости от уровня компилятора и оптимизации использование волатильности также может помочь в некоторых случаях.

Кроме того, если вы выполняете хотя бы тщательный анализ кода + статический анализ кода и убедитесь, что нет компиляторных предупреждений, поведение должно оставаться неизменным независимо от оптимизации.

+0

Это можно охарактеризовать как «У вашего кода есть ошибка»;) –

+0

Это обычные места. Это не отвечает на вопрос. – Olaf

3

Я иду в другом направлении, чем другой ответ и комментарии. Глядя на ваш код, похоже, вы играете с контроллером осциллятора, и поэтому я думаю, что вы не используете правильный процесс для настройки или настройки осциллятора.

В зависимости от того, что вы пытаетесь сделать, вам может потребоваться переключиться на разные часы перед настройкой параметров осциллятора, и, разбившись и ступив, вы можете потерять часы. Когда вы не оптимизируете, есть, вероятно, некоторые дополнительные инструкции, которые вызывают один и тот же результат.

Обратитесь к справочному руководству по части и убедитесь, что вы все делаете правильно. Однако для этой линии мышления ваш вопрос требует больше кода в этой области и модели микроконтроллера (а не только основного типа).