|
|
  |
Самопроизвольный Reset AT91SAM7S256 |
|
|
|
Jun 4 2009, 10:35
|

Участник

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

|
Цитата Ситуация с индикацией software reset воспроизводится, или наблюдалась однократно? с внешним источником питания постоянно software reset воспроизводится
Сообщение отредактировал Vovanchik - Jun 4 2009, 10:37
|
|
|
|
|
Jun 5 2009, 11:56
|

Участник

Группа: Участник
Сообщений: 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 часов запущено устройство в режиме где были глюки - все ОК.
|
|
|
|
|
Jun 5 2009, 12:26
|

Участник

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

|
Цитата(aaarrr @ Jun 5 2009, 16:01)  Боюсь, что это не более чем совпадение. Возможно Вы правы - тестирование покажет. Но до исправления микроконтроллер перегружался через 2-3 минуты, а тут 4 часа работы. В режимах где используется memcpy с char массивами, а не short, все работает нормально.
|
|
|
|
|
Jun 5 2009, 12:56
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 8 2009, 07:08
|

Участник

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

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

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 12 2009, 07:32
|
Участник

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

|
Если активно используете прерывания, то не забыли ли поставить обработчик AIC_SPU (Spurious Interrupt Vector Register) в AIC ? При маскировании возможено его срабатывание.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|