Перейти к содержанию
    

Breakpoint'ы срабатывают только один раз :(

Добрый день!

После долгих мучений, удалось настроить Eclipse+Yagarto и скомпилировать код с использованием FreeRTOS под stm32l.

Всё запускается, работает, но: точки останова, установленные в теле подпрограмм, почему-то срабатывают только один раз, хотя сам код выполняется правильно (на пинах PA.8 и PB.14 наблюдаю устойчивую генерацию), если шагать в single step, шагает по программе корректно.

Проблема проявляется как при отладке с помощью J-Link (J_Link GDB Server), так и st-link (ST-Link_gdbserver).

Код:

void Task1(void *pvParameters)
{
 GPIO_InitTypeDef toggle = { (1 << 8),  GPIO_Mode_OUT, GPIO_Speed_40MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL};

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
 GPIO_Init(GPIOA, &toggle);

 while(1)
 {
GPIO_ToggleBits(GPIOA, (1 << 8));
vTaskDelay(10);
__asm("NOP"); // здесь установлен breakpoint
 }
}

void Task2(void *pvParameters)
{
 GPIO_InitTypeDef toggle = { (1 << 14),  GPIO_Mode_OUT, GPIO_Speed_40MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL};

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
 GPIO_Init(GPIOB, &toggle);

 while(1)
 {
GPIO_ToggleBits(GPIOB, (1 << 14));
vTaskDelay(5);
__asm("NOP"); // здесь установлен breakpoint
 }
}

int main(void)
{
 xTaskCreate( Task1, ( signed char * ) "Task1",
configMINIMAL_STACK_SIZE, NULL, (tskIDLE_PRIORITY + 1UL),
( xTaskHandle * ) NULL );

 xTaskCreate( Task2, ( signed char * ) "Task2",
configMINIMAL_STACK_SIZE, NULL, (tskIDLE_PRIORITY + 1UL),
( xTaskHandle * ) NULL );

 vTaskStartScheduler();

 return 0;
}

 

Initialization Commands отладчика (J-Link):

monitor speed auto
monitor endian little
monitor flash device = STM32L151CB
monitor flash download = 1
monitor flash breakpoints = 1
monitor reset 0

 

Вообще очень нестабильная работа с breakpoint'ами - то срабатывают, то не срабатывают, то срабатывают один раз. В чём может быть дело?

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для того, чтобы тема не была бесполезной, выкладываю свой шаблон проекта Eclipse + Yagarto + FreeRTOS + std_periph_lib для stm32l. С минимальными изменениями должно подойти для любого stm32. Мне, в своё время, такого шаблона очень не хватало. Пути к FreeRTOS и StdPeriphLib нужно исправить на ваши.

stm32l_freertos_yagarto_template.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В эклипсе для андроида и ксалинкса тоже иногда с брек поинтами траблы, вроде его нет, а программа останавливается... Видать какой то не выловленный еще баг...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я, наверное, создал тему не в том разделе. Надо было в "GNU/OpenSource средства разработки для avr/arm/mips". Если модераторов это не затруднит, было бы очень здорово перенести её туда.

Указанный сабж сьел мне весь мозг :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это проблема эклипса или нет ? gdb из консоли нормально работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это проблема эклипса или нет ? gdb из консоли нормально работает?

Даже не знаю, к своему стыду, GDB из консоли пользоваться не умею.

Пытаюсь ввести в консоль, например, команду

b *0x8002042

но никакой реакции нет на эту команду.

 

Ещё раз уточняю проблему: когда ставлю breakpoint в теле какого-нибудь Task, он (breakpoint) срабатывает только один раз за сеанс отладки, а после этого система как-будто "забывает" про него.

И ещё интересный момент: когда пишу в коде инструкцию

__asm("BKPT #0");

такое чувство, что процессор на ней зацикливается :(

 

Похоже, что проблема как-то связана с оптимизацией.

Когда ставлю Optimization level = None (-O0), брейкпоинты отрабатывают нормально.

Больше всего удивляет, почему брейкпоинт всё-таки срабатывает один раз. Уж тогда бы либо работал, либо совсем не работал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Было что-то похожее, но давно и с ARM7TDMI. Как борол - не помню. Какая версия эклипсы? какая версия CDT? Какая версия GDB Hardware debugiing support или как его там? Какой launcher используете в эклипсе для запуска GDB? Пробовали ли второй? Нормально ли работают точки останова в программе без FreeRTOS? Какая версия GDB в вашей сборке Yagarto? Пробовали ли вместо Yagarto использовать Linaro?

Уф. Кажется пока все вопросы...

P.S. а, да еще - покажите линкерный скрипт. Может быть такое, что вы ставите точки останова по реальным адресам (0x0800....), а программа работает по отраженным(0x0000....)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

InsolentS, осталось выяснить версию OpenOCD, или что Вы там используете. Из Вашего шаблона выяснить это не удалось.

Хотя нет, увидел в первом посте. По поводу ST-Link_gdbserver могу сказать, что мне его так и не удалось нормально запустить.

Пользовался OpenOCD 0.6.1, всё пошло нормально.

Изменено пользователем IgorKossak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Было что-то похожее, но давно и с ARM7TDMI. Как борол - не помню. Какая версия эклипсы? какая версия CDT? Какая версия GDB Hardware debugiing support или как его там? Какой launcher используете в эклипсе для запуска GDB? Пробовали ли второй? Нормально ли работают точки останова в программе без FreeRTOS? Какая версия GDB в вашей сборке Yagarto? Пробовали ли вместо Yagarto использовать Linaro?

Уф. Кажется пока все вопросы...

P.S. а, да еще - покажите линкерный скрипт. Может быть такое, что вы ставите точки останова по реальным адресам (0x0800....), а программа работает по отраженным(0x0000....)?

Eclipse Juno 4.2 SR2

CDT - не разобрался какая версия, но самая свежая

Launcher - GDB (DSF) Hardware Debugging Launcher

Попробовал второй лаунчер - работает на первый взгляд более стабильно, "одноразовых" брейкпоинтов пока не было при включеной оптимизации -Os.

Возможно, проблема была в этом, спасибо!

Версия arm-none-eabi-gdb.exe - 7.5.1

Linaro не пробовал, даже не слышал такого слова до этого момента.

Скрипт линкера прилагаю.

Ещё есть очень надоедливый глюк: при очередном запуске отладки, eclipse как-будто не "подхватывает" сеанс, кнопки старт и стоп не становятся активными, на части отладочных панелей пропадает изображение, помогает только перезапуск eclipse.

 

InsolentS, осталось выяснить версию OpenOCD, или что Вы там используете. Из Вашего шаблона выяснить это не удалось.

Хотя нет, увидел в первом посте. По поводу ST-Link_gdbserver могу сказать, что мне его так и не удалось нормально запустить.

Пользовался OpenOCD 0.6.1, всё пошло нормально.

Не думаю, что проблема в gdb-сервере, т.к. поведение абсолютно одинаковое с ST-Link и J-Link, у последнего GDB сервер от SEGGER.

У ST-Link_gdbserver есть особенность - нужна версия не выше 1.5.6, после неё attolic добавили защиту от использования их gdb сервера с "инородной" IDE.

STM32_flash.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Linaro не пробовал, даже не слышал такого слова до этого момента.
Пора попробовать. У них сборки выходят чаще, есть сборки под линух.

Launcher - GDB (DSF) Hardware Debugging Launcher

Попробовал второй лаунчер - работает на первый взгляд более стабильно, "одноразовых" брейкпоинтов пока не было при включеной оптимизации -Os.

Возможно, проблема была в этом, спасибо!

Я с первым вообще работать не смог - не нашел, где включить отображение регистров в шестнадцатиричном виде. Других претензий не припомню, но эта с этой смириться не смог. Их вообще там можно переключить? Если да - я попробую снова.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Linaro не пробовал, даже не слышал такого слова до этого момента.

Linaro aka GNU Tools for ARM Embedded Processors

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё есть очень надоедливый глюк: при очередном запуске отладки, eclipse как-будто не "подхватывает" сеанс, кнопки старт и стоп не становятся активными, на части отладочных панелей пропадает изображение, помогает только перезапуск eclipse.

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Их вообще там можно переключить? Если да - я попробую снова.

Нет, я тоже не нашёл как переключить и на буржуйских форумах пишут что нельзя.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...