turnon 1 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба Подскажите пожалуйста как словить баг в коде задачи. IAR 8.30.2, нахожусь в отладке. Задача "зависла" - не останавливается на брейкпоинтах в начале и в конце while(1) в цикле задачи. Код задачи довольно разветвленный, брейкпоинты везде поставить невозможно. Есть ли возможность и как можно узнать где сейчас (на какой строке) выполняется задача? Может есть какой-то адрес текущей выполняемой инструкции задачи где-то можно посмотреть и потом по нему перейти к строке в исходнике? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 55 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба 2 minutes ago, turnon said: Есть ли возможность и как можно узнать где сейчас (на какой строке) printf? Или не совсем понятен ваш вопрос. 3 minutes ago, turnon said: Задача "зависла" - не останавливается на брейкпоинтах в начале и в конце while(1) в цикле задачи. Как это понять "зависла"? А что-нибудь вообще происходит с прибором? Что-то мигает, переключается? Вы можете остановить отладчик в любой момент времени, посмотреть, что вообще выполняется. И да, не выбросил ли оптимизатор тело задачи? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
turnon 1 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба 8 minutes ago, haker_fox said: printf? Или не совсем понятен ваш вопрос. Как это понять "зависла"? А что-нибудь вообще происходит с прибором? Что-то мигает, переключается? Вы можете остановить отладчик в любой момент времени, посмотреть, что вообще выполняется. И да, не выбросил ли оптимизатор тело задачи? Код задачи очень разветвленный, printf расставлять - это на неделю. Все остальные задачи работают, все ок, но одна задача зависла где то внутри while(1). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iamnot 0 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба Здесь, на мой взгляд, только тщательный анализ того, что написано в задаце. Или ставить брекпоинты и ждать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 53 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба 48 minutes ago, turnon said: Есть ли возможность и как можно узнать где сейчас (на какой строке) выполняется задача? Может есть какой-то адрес текущей выполняемой инструкции задачи где-то можно посмотреть и потом по нему перейти к строке в исходнике? Можно извлечь текущий адрес из стека задачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grigorij 0 7 февраля, 2020 Опубликовано 7 февраля, 2020 (изменено) · Жалоба У IAR-а есть плагин для FreeRTOS, который может показывать текущее состояние задачи (выполняется, заблокирована и т.д.). Плагин включается в настройках проекта Debugger->Plugins->"галочка напротив "FreeRTOS and OpenRTOS". Соответственно первым делом имеет смысл посмотреть, не является ли задача полностью заблокированной все время (или вообще она хотя бы создается). Следующим шагом, можно добавить задачу мониторинга, которая будет с заданным интервалом вызываться и выводить с помощью printf в отладку состояние всех задач (смотреть в сторону uxTaskGetSystemState или вот эту статью https://habr.com/ru/post/352782/) Если задача действительно запускается и выполняется (хотя судя по описанию - это маловероятно и она скорее всего полностью заблокирована), то ставить breakpoint или по шагам выяснить какой из while(1) висит. Изменено 7 февраля, 2020 пользователем Grigorij Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 55 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба 53 minutes ago, turnon said: все ок, но одна задача зависла где то внутри while(1). Гм. Если остальные задачи работают, то "зависшая" что-то выполняет или ждёт. Скорее всего, ждёт. Это моё интуитивное предположение на основе моего скромного опыта. Попробуйте поднять задачу консоли (она примером идёт), и выведите task list. В нём будут статусы задач, размеры стека. Можете исопльзовать плагин для вашей среды разработки. Но по мне консоль более удобна. З.Ы. Может быть вы вообще не создаёте эту задачу???) Посмотрите, есть ли для неё xCreateTask. З.Ы.Ы. Может быть эта задача не получает управления? Например, у неё приоритет ниже, чем у другой, готовой к исполнению. А та, готовая, молотит процессором без остановки и не отдаёт управление. Здесь вам следует сверится с механизмом планировщика оси. Он подробно описан на сайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба если тупо и универсально, то volatile int line_dbg = 0; #define DBG line_dbg=__LINE__ func1(); DBG; func2(); DBG; func3(); DBG; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
turnon 1 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба 2 hours ago, haker_fox said: З.Ы. Может быть вы вообще не создаёте эту задачу???) Посмотрите, есть ли для неё xCreateTask. Задача создается, работает долгое время. Ловлю зависание 1-2 раза в сутки. Приоритеты у всех задач одинаковые. Скорее всего где-то в бизнес-логике завис. 1 hour ago, megajohn said: если тупо и универсально, то volatile int line_dbg = 0; #define DBG line_dbg=__LINE__ func1(); DBG; func2(); DBG; func3(); DBG; Идея интересная. Попробую на все кодовую базу нацепить автозаменой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
turnon 1 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба 3 hours ago, aaarrr said: Можно извлечь текущий адрес из стека задачи. Скажите пожалуйста, как это сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 53 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба Вызываем vTaskGetInfo(), получаем указатель на стек задачи, разбираем его (формат смотрим в файлах порта). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться