Программирование ARM IAR: почему нельзя поставить breakpoint Wed, April 24 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

IAR: почему нельзя поставить breakpoint Печать
Добавил(а) microsin   

Может не получиться задать точку останова в исходном коде в следующих случаях:

1. Код скомпилирован в режиме оптимизации.
2. В скомпилированный код не попала отладочная информация.

Если оба этих условия выполняются, то можно без проблем использовать точки останова как в исходном коде проекта, так и в двоичных, предварительно скомпилированных библиотеках (файлы с расширением *.a).

[Точки останова и компиляция с оптимизацией]

Чтобы можно было отлаживать код с точками останова, необходимо для него отключить оптимизацию. В противном случае исходный код не будет точно отражать программные операции микроконтроллера, тогда пошаговая отладка и точки останова не будут работать, как ожидалось. Обычно в проекте для отладки по исходному коду существует отдельная конфигурация Debug. В этой конфигурации оптимизация кода отключена, что позволит отладку по исходному коду:

IAR Project Options Optimizations None

В конфигурации Release оптимизация кода должна быть включена.

Примечание: некоторые недопрограммисты всегда компилируют свои проекты с отключенной оптимизацией, им так удобнее. Их не беспокоит, что ресурсы процессора и памяти могут расходоваться впустую. Кроме того, переключение между конфигурациями Debug и Release очень полезно, поскольку позволяет найти грубые ошибки в коде.

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

#pragma optimize=z none
static void commontask(void const * argument)
{
   OBInit();
   OBAttachClick(BtnShortPress);
   GPS_DataLast.Latitude = GPS_DataLast.Longitude = 0.0;
   RTC_Init();
   TDA8551init();
   SetDownStatusText((char*)strCheckMessageBase);
   UpdateAtScreen(SCR_UPDATE_DOWN_STATUS);
   osDelay(100);
   ...

Директива #pragma optimize=z none будет действовать только на код этой функции. Все остальные функции в проекте получат опции оптимизации, унаследованные от настроек проекта. Подробнее см. [1].

[Добавление в результаты компиляции отладочной информации]

Чтобы можно было ставить точки останова в исходном коде, для него должна быть активирована опция генерации отладочной информации. Эта опция находится в настройках проекта, раздел C/C++ Compiler -> закладка Output -> галочка Generate debug information:

IAR Project Options Output Generate debug info

[Ссылки]

1. Управление оптимизацией в IAR.

 

Комментарии  

 
0 #1 Дмитрий 04.03.2023 23:31
Спасибо! Помогло. А то ставлю точки, запускаю отладку - а IAR мои точки деактивирует. Теперь - нормально, отладка с остановами.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page