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

 
 
 
Reply to this topicStart new topic
> Самопроизвольный Reset AT91SAM7S256
Vovanchik
сообщение Jun 4 2009, 10:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 7-07-08
Из: Тульская область, г. Новомосковск
Пользователь №: 38 780



Здравствуйте.

Использую AT91SAM7S256, Keil uVision, RV.
Возникла следующая проблема. Микроконтроллер при выполнении программы сам перезапускается.
В начале main обработал флаг резета - получил срабатывание по AT91C_RSTC_RSTTYP_USER.
Поcмотрел осциллографом вывод NRST - есть переход на ноль. Стоит внешняя микросхема сброса.
Убрал микросхему и вывод NRST через 10 кОм подвязал на + питания.
Получил срабатывание по AT91C_RSTC_RSTTYP_POWERUP.
Получается вроде как проблемы с питанием.

Запитал процессор от внешнего источника питания - получил срабатывание по AT91C_RSTC_RSTTYP_SOFTWARE - хотя его вызова ни где в коде вообще нет.

Также обрабатываю Undef_Handler, PAbt_Handler и DAbt_Handler - ни разу не возникали.
WDT отключен.

Защел в тупик... Может у кого есть какие идеи?

Сообщение отредактировал Vovanchik - Jun 4 2009, 10:36
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 4 2009, 10:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



ИМХО, это все-таки питание: в первом случае сработал внешний монитор, во втором - отработал собственный POR.
Ситуация с индикацией software reset воспроизводится, или наблюдалась однократно?
Go to the top of the page
 
+Quote Post
Vovanchik
сообщение Jun 4 2009, 10:35
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 7-07-08
Из: Тульская область, г. Новомосковск
Пользователь №: 38 780



Цитата
Ситуация с индикацией software reset воспроизводится, или наблюдалась однократно?

с внешним источником питания постоянно software reset воспроизводится

Сообщение отредактировал Vovanchik - Jun 4 2009, 10:37
Go to the top of the page
 
+Quote Post
Vovanchik
сообщение Jun 5 2009, 08:39
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 7-07-08
Из: Тульская область, г. Новомосковск
Пользователь №: 38 780



Проблема оказалась в функции memcpy - при копировании массива типа short из 2000 элементов в другой соразмерный массив происходила ошибка. Заменив использование memcpy на цикл for проблема исчезла.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 5 2009, 10:02
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Иллюстрацию можно? В наличие глюка в memcpy Keil'а верится с трудом.
Go to the top of the page
 
+Quote Post
Vovanchik
сообщение Jun 5 2009, 11:56
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 7-07-08
Из: Тульская область, г. Новомосковск
Пользователь №: 38 780



Массивы объявлены глобально:
Код
short    Per_OSC[2000];
short    Per_OSC_Temp[2000];


Сначала было копирование в коде следующего вида:
Код
memcpy(Per_OSC_Temp, Per_OSC, sizeof(Per_OSC));


Написал функцию
Код
void     memcpy_short(short *dest, const short *src, unsigned int len)  
    {unsigned int i;
    for (i = 0; i < (len / 2); i++)
        {
        dest[i] = src[i];
        }
    }


Обращаюсь так
Код
memcpy_short(Per_OSC_Temp, Per_OSC, sizeof(Per_OSC));


Уже более 4 часов запущено устройство в режиме где были глюки - все ОК.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 5 2009, 12:01
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Vovanchik @ Jun 5 2009, 15:56) *
Уже более 4 часов запущено устройство в режиме где были глюки - все ОК.

Боюсь, что это не более чем совпадение.
Go to the top of the page
 
+Quote Post
Vovanchik
сообщение Jun 5 2009, 12:26
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 7-07-08
Из: Тульская область, г. Новомосковск
Пользователь №: 38 780



Цитата(aaarrr @ Jun 5 2009, 16:01) *
Боюсь, что это не более чем совпадение.


Возможно Вы правы - тестирование покажет.
Но до исправления микроконтроллер перегружался через 2-3 минуты, а тут 4 часа работы.

В режимах где используется memcpy с char массивами, а не short, все работает нормально.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 5 2009, 12:36
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Массив у Вас довольно здоровый - 4 килобайта почти - разница во времени работы memcpy и memcpy_short получится довольно значительная.
Могу предложить простой эксперимент: оставьте оба варианта, т.е. просто последовательно вызовите memcpy и memcpy_short с одинаковами параметрами, и посмотрите, как себя поведет программа.
Go to the top of the page
 
+Quote Post
Vovanchik
сообщение Jun 5 2009, 12:56
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 7-07-08
Из: Тульская область, г. Новомосковск
Пользователь №: 38 780



Цитата(aaarrr @ Jun 5 2009, 16:36) *
Массив у Вас довольно здоровый - 4 килобайта почти - разница во времени работы memcpy и memcpy_short получится довольно значительная.

Согласен.

В программе реализован бесконечнй цикл while(). Все необходимые действия выполняются в прерываниях. Причем в прерываниях где вызывается memcpy все остальные прерывания выключаются вначале и включаются по завершении. Поэтому теоретически программа должна работать одинаково с разным временем выполнения функций.

Но все равно попробую:
Цитата(aaarrr @ Jun 5 2009, 16:36) *
Могу предложить простой эксперимент: оставьте оба варианта, т.е. просто последовательно вызовите memcpy и memcpy_short с одинаковами параметрами, и посмотрите, как себя поведет программа.

но только в понедельник...

Сообщение отредактировал Vovanchik - Jun 5 2009, 12:56
Go to the top of the page
 
+Quote Post
Vovanchik
сообщение Jun 8 2009, 07:08
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 7-07-08
Из: Тульская область, г. Новомосковск
Пользователь №: 38 780



Цитата(aaarrr @ Jun 5 2009, 16:36) *
Массив у Вас довольно здоровый - 4 килобайта почти - разница во времени работы memcpy и memcpy_short получится довольно значительная.
Могу предложить простой эксперимент: оставьте оба варианта, т.е. просто последовательно вызовите memcpy и memcpy_short с одинаковами параметрами, и посмотрите, как себя поведет программа.

Попробовал предложенный Вами вариант - при последовательном вызове функций наблюдается зависание прибора (проверил несколько раз).
При использовании только memcpy_short прибор пока работает...
Go to the top of the page
 
+Quote Post
KAlex
сообщение Jun 8 2009, 08:35
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(Vovanchik @ Jun 5 2009, 15:56) *
Код
memcpy(Per_OSC_Temp, Per_OSC, sizeof(Per_OSC));

Посмотрите под отладчиком, какие параметры получаются.
По моему правильнее будет (short *)Per_OSC_Temp
Go to the top of the page
 
+Quote Post
codier
сообщение Aug 12 2009, 07:32
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 21-01-05
Пользователь №: 2 113



Если активно используете прерывания, то не забыли ли поставить обработчик AIC_SPU (Spurious Interrupt Vector Register) в AIC ? При маскировании возможено его срабатывание.
Go to the top of the page
 
+Quote Post

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

 


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


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