MPLAB X + XC8 обрывается на неправильной строке

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

У меня есть проект в MPLAB X. Когда я использую точку прерывания строки, она вообще не прерывается на правильной строке при отладке моего проекта.

Я использую MPLAB X v4.15

Здесь у меня точка останова, я даже добавил операцию __nop(), но пробовал и без нее

Вот что на самом деле происходит: Отладчик останавливается в очень-очень неправильном месте. Это происходит каждый раз, независимо от того, где находится фактическая точка останова.

Независимо от того, где находится точка останова, отладчик никогда не прерывается в нужном месте.

  • если я где-то ставлю точку останова, она всегда ломается не в том месте
  • если я затем перезапущу отладку, она сломается в той же неправильной позиции
  • Если я изменю местоположение точки останова, позиция, в которой программа фактически прерывается, будет другой, но снова останется прежней, когда я перезапущу программу.

Еще немного информации:

информация о проекте

Почему это происходит?

Есть ли еще люди с этой проблемой?

Как мне это решить?

ИЗМЕНИТЬ

К сожалению, решение, предложенное K_Trenholm, мне не помогло. Я поставил 3 «NOP» в одну функцию, но это не сработало, как вы предложили. См. рисунок ниже:

3 NOP вставлены в функцию

но что я получил:

неправильная точка останова

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

Спасибо за ваш ответ, очень полезно даже иметь ЛЮБЫЕ идеи о том, как это решить. Если у вас есть другие идеи, буду очень благодарен, если поделитесь ими!


person Jesse Bax    schedule 28.03.2018    source источник


Ответы (2)


На ум приходят две вещи:

1) Оптимизация компилятора может вызвать проблемы с расположением/значением точек останова при отладке. При отладке отключите оптимизацию (если возможно, похоже, что в вашем примере вы натыкаетесь на потолок с точки зрения размера кода).

2) Точка останова "Занос". См. http://microchipdeveloper.com/tls0201:skid-effect#top-of-page

Один из способов обойти это из того, что я видел, — поместить пару инструкций NOP после строки, в которой вы планируете разместить точку останова. Это гарантирует, что любой «занос» не будет выполнять больше кода.

person K_Trenholm    schedule 28.03.2018
comment
Привет К. К сожалению, это не сработало для меня. Я поместил 3 NOP в одну функцию, но это не сработало, как вы предложили. Я пробовал разные точки останова на разных узлах, как и каждую комбинацию из этих трех. - person Jesse Bax; 29.03.2018
comment
Также хочу добавить, что у моего коллеги, у которого такая же версия ПО, такая же версия MPLAB X и версия XC8, такая же проблема. - person Jesse Bax; 29.03.2018

Инструкция, в которой происходит прерывание, всегда будет выполняться полностью, и все, что находится в конвейере, также будет выполняться. Для инструкций с одним циклом добавляется блок с одной инструкцией. Для инструкций и ветвей с несколькими циклами добавляется несколько циклов. Так что, если вы хотите избежать перехода отладчика в подпрограмму, вы должны были включить Nop за точкой останова.

пример:

void main (void)
{
    int x = 0;

    x++1;                  //put Breakpoint here
    Nop();
    Nop();
    Nop();                 //Debugger will stop here
    foo(x);                //so foo() is not called
}

В зависимости от используемого MCU отладчик будет вводить «эффект скольжения» при достижении точки останова. Сеанс отладки выполнит до двух дополнительных инструкций перед остановкой.

person Mike    schedule 07.06.2018
comment
добавьте описание, пожалуйста - person Vinay Prajapati; 07.06.2018