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

Странное поведение Меги2560

Мега2560 + IAR + JTAGICE2.

Обратил внимание, что после сброса от watchdog Мега и IAR впадают в некую кому, причем в IARе вываливается сообщение, что target reset, т.е. reset проходит, но до breakpointа, поставленного в начале программы, дело не доходит, среда висит. если остановить выполнение программы, то IAR пишет странные вещи, типа: sleep mode или target busy, хотя sleep mode не включен. А вот Watchdog почему-то оказывается включен. В дизассемблере видно, что программа находится в теле функции __flashcpy, я так понимаю, что это что-то стартапное у IAR или нет?

Что делать? Как жить дальше? Где копать?

 

В IAR C/C++ Compiler Reference Guide упоминаний про __flashcpy не нашел. Саму __flashcpy нашел в src\lib\segment_init.c. Расскажите, что это за __flashcpy и зачем?

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


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

Это поведение IAR и AVR Studio стандартно при потере кристала. Это просто значит, что проц "вылетел" куда-то, где JTAG его не ждёт.

 

Есть птица, в настройках которая говорит, что стартовать надо с 0 адреса. В противном случае, стандартная иаровская инициализация процессора проскакивает незаметно для глаза пользователя.

 

То есть поведение у вас правильное, а вот вылет - нет.

 

Теперь по вылету. Возможно у вас по WDT не на 0 стартует?

 

Посмотрите для любопытства в даташите, как вектор 0х18 обзывается?

 

PS: Я не знаю и ничего не утверждаю. Просто обращаю внимание.

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


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

Есть птица, в настройках которая говорит, что стартовать надо с 0 адреса.

+1, и тогда у вас будет возможность отследить не только выполнение стартапа, но и вызовы конструкторов объектов, если они у вас до вызова main, что скрыто без установки упомянутой SasaVitebsk птицы. Это, кстати, и в дебагере бывает нелишним.

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


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

>> Есть птица, в настройках которая говорит, что стартовать надо с 0 адреса. В противном случае, стандартная иаровская инициализация процессора проскакивает незаметно для глаза пользователя.

 

Убрал в IAR разделе Debugger галку Run to main и поставил точку останова но RESET. Провел эксперимент: контроллер сбросился по watchdog, IAR остановился на breakpoint RESET, флаг WDE в watchdog был установлен, в Debug Log появилось сообщение:

Вreakpoint hit: Code @ CODE:0x000000

The stack pointer for stack 'RStack' (currently DATA:0x0021FF) is outside the stack range (DATA:0x001500 to DATA:0x0015D2). Не совсем понятно, причем здесь RStack, если контроллер сброшен в исходное состояние, произошел ресет, да и программу я сократил до нескольких строк - остановка watchdog, запуск watchdog? Если нажать Run, контроллер будет продолжать непрерывно ресетиться, видимо из за того, что watchdog не выключен.

 

Такой вопрос (может быть и не совсем корректный): где в стартапном коде можно прописать остановку watchdog?

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


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

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

Такой вопрос (может быть и не совсем корректный): где в стартапном коде можно прописать остановку watchdog?

ИМХО, контроллер ресетится, потому, что в программе включается watchdog. По reset watchdog должен отключиться, если он не включен постоянно fuses.

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


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

1) Почитайте описание на компилятор. Например на процедуру char __low_level_init(void), которую можно в текст воткнуть. По моему есть и c_startup или что-то подобное.

2) Перечитайте мой пост ещё раз. Я вам подсказку даю. А вы в упор не замечаете.

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


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

TO SasaVitebsk:

подробно перечитал ваш пост, отчитываюсь о прочитанном:

>> Есть птица, в настройках которая говорит, что стартовать надо с 0 адреса. В противном случае, стандартная иаровская инициализация процессора проскакивает незаметно для глаза пользователя.

 

с птицей разобрался

 

>> Теперь по вылету. Возможно у вас по WDT не на 0 стартует?

Да вроде с 0, а куда ей еще деваться? Я использую стандартный стастап файл и в программе ничего лишнего вроде не делаю.

 

>> Посмотрите для любопытства в даташите, как вектор 0х18 обзывается?

понятно как он обзывается, не совсем понятно куда вы клоните (ну вот такой недогоняющий я, просто начинающий), прерывание от WDT я не использую.

 

вообще я вспомнил, что когда только перешел с меги 128 на 2560, был удивлен, что после сброса по watchdog, флаг WDE в watchdog не сбрасывается, т.е. он продолжает работать и снова ресетит контроллер (естественно я проверил, что соответствующий fuse выключен), пришлось в main первой строкой прописать остановку watchdog (Для сравнения - в меге 128 после сброса по watchdog, флаг WDE в watchdog сбрасывается сам, да так и должно быть).

 

>> Почитайте описание на компилятор

Читаю, понял, что мне в стартап нужно добавить свой код по остановке watchdog. Только как это сделать? Пишут, что нужно редактировать __low_level_init. Но как? В cstartup есть вызов XCALL __low_level_init, в src\ есть файл low_level_init.c. Что с этим делать?

 

В опциях проекта в IAR нигде не нашел ни слова про стартап.

 

SasaVitebsk, я очень ценю ваше внимание к моему посту. Поделитесь еще опытом, потыкайте - как копать?

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


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

Такой вопрос (может быть и не совсем корректный): где в стартапном коде можно прописать остановку watchdog?
Читайте в описании про функцию __low_level_init(). Если используете С++, объявляйте ее как extern "C". Редактировать ничего не надо - просто добавьте в свой проект функцию с таким именем

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


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

сталкивался с такой штукой.

эта ботва бывает при наличии больших массивов переменных.... почемуто циклица при их инициализации второй раз... почему - хз, я так и не понял... решил проблему как страус - головой в песок :), отключив инициализацию массивов - перед их обьявлением надо поставить no_init

 

 

Поправочка - не no_init , а __no_init

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

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


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

>> Сергей Борщ: Читайте в описании про функцию __low_level_init(). Если используете С++, объявляйте ее как extern "C". Редактировать ничего не надо - просто добавьте в свой проект функцию с таким именем

 

СПАСИБО. Вроде помогло. Тестирую.

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


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

TO SasaVitebsk:

>> Посмотрите для любопытства в даташите, как вектор 0х18 обзывается?

понятно как он обзывается, не совсем понятно куда вы клоните (ну вот такой недогоняющий я, просто начинающий), прерывание от WDT я не использую.

:biggrin:

 

То есть это оно вас использует?

 

Так посмотрите как его можно использовать. Напишите обработчик данного события. В одном из изделий я написал такой обработчик, что в 90% случаев виса, пользователь практически не замечал данного факта. Иными словами полного пересброса не происходило. Хотя, естественно это важно только в slave контроллерах и возможно только в малых проектах. В больших это слишком затратно.

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


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

>> Так посмотрите как его можно использовать

понятно, как его можно использовать для отслеживания причин/защиты от зависаний, но в конкретной программе я использовал watchdog просто для перезапуска программы с новыми настройками - так мне удобнее.

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


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

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

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

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

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

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

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

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

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

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