реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Странное поведение Меги2560, после сброса от watchdog
no_d@t@
сообщение May 22 2008, 14:59
Сообщение #1


Участник
*

Группа: Validating
Сообщений: 24
Регистрация: 4-02-08
Пользователь №: 34 736



Мега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 и зачем?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 22 2008, 22:17
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

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

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

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

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

PS: Я не знаю и ничего не утверждаю. Просто обращаю внимание.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение May 23 2008, 05:20
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(SasaVitebsk @ May 23 2008, 02:17) *
Есть птица, в настройках которая говорит, что стартовать надо с 0 адреса.

+1, и тогда у вас будет возможность отследить не только выполнение стартапа, но и вызовы конструкторов объектов, если они у вас до вызова main, что скрыто без установки упомянутой SasaVitebsk птицы. Это, кстати, и в дебагере бывает нелишним.
Go to the top of the page
 
+Quote Post
no_d@t@
сообщение May 23 2008, 07:26
Сообщение #4


Участник
*

Группа: Validating
Сообщений: 24
Регистрация: 4-02-08
Пользователь №: 34 736



>> Есть птица, в настройках которая говорит, что стартовать надо с 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?
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 23 2008, 09:39
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(no_d@t@ @ May 23 2008, 10:26) *
Если нажать Run, контроллер будет продолжать непрерывно ресетиться, видимо из за того, что watchdog не выключен.
Такой вопрос (может быть и не совсем корректный): где в стартапном коде можно прописать остановку watchdog?
ИМХО, контроллер ресетится, потому, что в программе включается watchdog. По reset watchdog должен отключиться, если он не включен постоянно fuses.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 23 2008, 09:41
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



1) Почитайте описание на компилятор. Например на процедуру char __low_level_init(void), которую можно в текст воткнуть. По моему есть и c_startup или что-то подобное.
2) Перечитайте мой пост ещё раз. Я вам подсказку даю. А вы в упор не замечаете.
Go to the top of the page
 
+Quote Post
no_d@t@
сообщение May 23 2008, 10:31
Сообщение #7


Участник
*

Группа: Validating
Сообщений: 24
Регистрация: 4-02-08
Пользователь №: 34 736



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, я очень ценю ваше внимание к моему посту. Поделитесь еще опытом, потыкайте - как копать?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 23 2008, 10:42
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
superbizzon
сообщение May 23 2008, 11:00
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 32
Регистрация: 28-04-05
Пользователь №: 4 592



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


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

Сообщение отредактировал superbizzon - May 23 2008, 11:19
Go to the top of the page
 
+Quote Post
no_d@t@
сообщение May 23 2008, 12:16
Сообщение #10


Участник
*

Группа: Validating
Сообщений: 24
Регистрация: 4-02-08
Пользователь №: 34 736



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

СПАСИБО. Вроде помогло. Тестирую.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 23 2008, 13:26
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(no_d@t@ @ May 23 2008, 13:31) *
TO SasaVitebsk:
>> Посмотрите для любопытства в даташите, как вектор 0х18 обзывается?
понятно как он обзывается, не совсем понятно куда вы клоните (ну вот такой недогоняющий я, просто начинающий), прерывание от WDT я не использую.

biggrin.gif

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

Так посмотрите как его можно использовать. Напишите обработчик данного события. В одном из изделий я написал такой обработчик, что в 90% случаев виса, пользователь практически не замечал данного факта. Иными словами полного пересброса не происходило. Хотя, естественно это важно только в slave контроллерах и возможно только в малых проектах. В больших это слишком затратно.
Go to the top of the page
 
+Quote Post
no_d@t@
сообщение May 23 2008, 13:42
Сообщение #12


Участник
*

Группа: Validating
Сообщений: 24
Регистрация: 4-02-08
Пользователь №: 34 736



>> Так посмотрите как его можно использовать
понятно, как его можно использовать для отслеживания причин/защиты от зависаний, но в конкретной программе я использовал watchdog просто для перезапуска программы с новыми настройками - так мне удобнее.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016