Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmel Studio код неожиданно возвращается на main
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Мария Е
Всем привет!
Пишу в Atmel Studio (6.2.1153) проект для samd20. Вообще это мой первый опыт работы с 32 разрядными Мк, до этого были только 8-разрядные и не в atmel studio.
Использую ASF (3.19) код писался постепенно (точнее переписывался с кода для xmega под iar). На последнем этапе на определенной строчке при отладке перескакивает на начало main. По непонятным причинам. Если строку закоментировать, перескакивает на предыдущей. Если запускать без отладки, то просто код перестает выполнятся после определенного момента.
Ума не приложу, как с этим разбираться? Это глюк студии или моего кода? Как понять? Пробовала увеличивать размер стека, размер rstack - все равно вылетает. Игралась со степенью оптимизации - тоже не помогает.
Куда копать, подскажите. help.gif
Сергей Борщ
Проблемы со стеком, невыровненным доступом и т.п. приводили бы к попаданию в обработчик исключения HardFault. У вас же, полагаю, происходит переход на ResetHandler. Наиболее вероятной причиной мне кажется срабатывание собаки (Watchdog). Почитайте ее описание для вашего процессора - возможно она включена по умолчанию и ее надо принудительно выключить или перенастроить на нужное вашей программе время.
Мария Е
Цитата(Сергей Борщ @ Aug 22 2014, 13:06) *
Проблемы со стеком, невыровненным доступом и т.п. приводили бы к попаданию в обработчик исключения HardFault. У вас же, полагаю, происходит переход на ResetHandler. Наиболее вероятной причиной мне кажется срабатывание собаки (Watchdog). Почитайте ее описание для вашего процессора - возможно она включена по умолчанию и ее надо принудительно выключить или перенастроить на нужное вашей программе время.


Да, спасибо за совет. Сама думала проверить эту гипотезу, но забыла. Судя по описанию, фьюзам и значениям регистров в debug режиме watchdog выключен.

Еще дополнение. Оказывается, курсор прыгает на начало main в отладке, а следующим шагом на строку, следующую за той, после которой перепрыгнул на начало main. И вот в этой второй строке он вообще уходит непонятно куда. Просто дебаггер висит и все. Если нажать break в этот момент, все равно весит. Поставила точку останова в reset_handler, код там останавливается только в самом начале.
Сергей Борщ
Цитата(Мария Е @ Aug 22 2014, 13:26) *
в debug режиме watchdog выключен.
А вот это может означать, что он остановливается только когда ядро остановлено отладчиком и продолжает тикать, как только ядро начинает исполнять команды. Но раз вы попадаете в ResetHandler только один раз при запуске - версия с собакой отпадает.

Цитата(Мария Е @ Aug 22 2014, 13:26) *
курсор прыгает на начало main в отладке, а следующим шагом на строку,
Откройте окно дизассемблера и посмотрите, по каким ассемблерным командам ходит ваша программа. Не всем ассемблерным командам можно найти соответствующие места в исходнике на языке высокого уровня. Бывает, что одна команда ассемблера соответствует сразу нескольким строчкам в разных местах исходника (например, если в функции есть несколько выражений return 0 - компилятор может их реализовать его одном месте, а из остальных сделать перход на этот код, или вынести некий общий код в подпрограмму). В общем, вам дорога прямиком в дизассемблер.
Мария Е
Спасибо за комментарий. Только сегодня увидела, так как забыла что несмотря на соответствующую галку оповещения об ответах не приходят на почту.
Дизассемблер действительно помог. Выяснила, что все же уходит в hard fault из-за попытки записи за границы sram, что было вызвано неправильной установкой значения переменной, которая задавала номер элемента массива для записи.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.