Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Breakpoint'ы срабатывают только один раз :(
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
InsolentS
Добрый день!
После долгих мучений, удалось настроить Eclipse+Yagarto и скомпилировать код с использованием FreeRTOS под stm32l.
Всё запускается, работает, но: точки останова, установленные в теле подпрограмм, почему-то срабатывают только один раз, хотя сам код выполняется правильно (на пинах PA.8 и PB.14 наблюдаю устойчивую генерацию), если шагать в single step, шагает по программе корректно.
Проблема проявляется как при отладке с помощью J-Link (J_Link GDB Server), так и st-link (ST-Link_gdbserver).
Код:
CODE
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'ами - то срабатывают, то не срабатывают, то срабатывают один раз. В чём может быть дело?
InsolentS
Для того, чтобы тема не была бесполезной, выкладываю свой шаблон проекта Eclipse + Yagarto + FreeRTOS + std_periph_lib для stm32l. С минимальными изменениями должно подойти для любого stm32. Мне, в своё время, такого шаблона очень не хватало. Пути к FreeRTOS и StdPeriphLib нужно исправить на ваши.
Golikov A.
В эклипсе для андроида и ксалинкса тоже иногда с брек поинтами траблы, вроде его нет, а программа останавливается... Видать какой то не выловленный еще баг...
InsolentS
Я, наверное, создал тему не в том разделе. Надо было в "GNU/OpenSource средства разработки для avr/arm/mips". Если модераторов это не затруднит, было бы очень здорово перенести её туда.
Указанный сабж сьел мне весь мозг sad.gif
DASM
Это проблема эклипса или нет ? gdb из консоли нормально работает?
InsolentS
Цитата(DASM @ May 17 2013, 11:10) *
Это проблема эклипса или нет ? gdb из консоли нормально работает?

Даже не знаю, к своему стыду, GDB из консоли пользоваться не умею.
Пытаюсь ввести в консоль, например, команду
Код
b *0x8002042

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

Ещё раз уточняю проблему: когда ставлю breakpoint в теле какого-нибудь Task, он (breakpoint) срабатывает только один раз за сеанс отладки, а после этого система как-будто "забывает" про него.
И ещё интересный момент: когда пишу в коде инструкцию
Код
__asm("BKPT #0");

такое чувство, что процессор на ней зацикливается sad.gif

Похоже, что проблема как-то связана с оптимизацией.
Когда ставлю Optimization level = None (-O0), брейкпоинты отрабатывают нормально.
Больше всего удивляет, почему брейкпоинт всё-таки срабатывает один раз. Уж тогда бы либо работал, либо совсем не работал.
Сергей Борщ
Было что-то похожее, но давно и с ARM7TDMI. Как борол - не помню. Какая версия эклипсы? какая версия CDT? Какая версия GDB Hardware debugiing support или как его там? Какой launcher используете в эклипсе для запуска GDB? Пробовали ли второй? Нормально ли работают точки останова в программе без FreeRTOS? Какая версия GDB в вашей сборке Yagarto? Пробовали ли вместо Yagarto использовать Linaro?
Уф. Кажется пока все вопросы...
P.S. а, да еще - покажите линкерный скрипт. Может быть такое, что вы ставите точки останова по реальным адресам (0x0800....), а программа работает по отраженным(0x0000....)?
IgorKossak
InsolentS, осталось выяснить версию OpenOCD, или что Вы там используете. Из Вашего шаблона выяснить это не удалось.
Хотя нет, увидел в первом посте. По поводу ST-Link_gdbserver могу сказать, что мне его так и не удалось нормально запустить.
Пользовался OpenOCD 0.6.1, всё пошло нормально.
InsolentS
Цитата(Сергей Борщ @ May 17 2013, 12:32) *
Было что-то похожее, но давно и с 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.

Цитата(IgorKossak @ May 17 2013, 12:51) *
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.
Сергей Борщ
QUOTE (InsolentS @ May 17 2013, 10:24) *
Linaro не пробовал, даже не слышал такого слова до этого момента.
Пора попробовать. У них сборки выходят чаще, есть сборки под линух.
QUOTE (InsolentS @ May 17 2013, 10:24) *
Launcher - GDB (DSF) Hardware Debugging Launcher
Попробовал второй лаунчер - работает на первый взгляд более стабильно, "одноразовых" брейкпоинтов пока не было при включеной оптимизации -Os.
Возможно, проблема была в этом, спасибо!
Я с первым вообще работать не смог - не нашел, где включить отображение регистров в шестнадцатиричном виде. Других претензий не припомню, но эта с этой смириться не смог. Их вообще там можно переключить? Если да - я попробую снова.
IgorKossak
Цитата(InsolentS @ May 17 2013, 10:24) *
Linaro не пробовал, даже не слышал такого слова до этого момента.

Linaro aka GNU Tools for ARM Embedded Processors
Golikov A.
Цитата(InsolentS @ May 17 2013, 11:24) *
Ещё есть очень надоедливый глюк: при очередном запуске отладки, eclipse как-будто не "подхватывает" сеанс, кнопки старт и стоп не становятся активными, на части отладочных панелей пропадает изображение, помогает только перезапуск eclipse.


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

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

Есть мнение что эклипс не совсем верно отрабатывает подвисший из за чего то проц, причем на уровне общения не с процом а с жетагом. Может есть какие то настройки последовательности рессета....
InsolentS
Цитата(Сергей Борщ @ May 17 2013, 13:47) *
Их вообще там можно переключить? Если да - я попробую снова.

Нет, я тоже не нашёл как переключить и на буржуйских форумах пишут что нельзя.
Но, у DSF, внизу, под списком регистров, отображается окошко, где значение регистра представлено во всех форматах, меня это спасало.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.