Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Самопроизвольный Reset AT91SAM7S256
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Vovanchik
Здравствуйте.

Использую 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 отключен.

Защел в тупик... Может у кого есть какие идеи?
aaarrr
ИМХО, это все-таки питание: в первом случае сработал внешний монитор, во втором - отработал собственный POR.
Ситуация с индикацией software reset воспроизводится, или наблюдалась однократно?
Vovanchik
Цитата
Ситуация с индикацией software reset воспроизводится, или наблюдалась однократно?

с внешним источником питания постоянно software reset воспроизводится
Vovanchik
Проблема оказалась в функции memcpy - при копировании массива типа short из 2000 элементов в другой соразмерный массив происходила ошибка. Заменив использование memcpy на цикл for проблема исчезла.
aaarrr
Иллюстрацию можно? В наличие глюка в memcpy Keil'а верится с трудом.
Vovanchik
Массивы объявлены глобально:
Код
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 часов запущено устройство в режиме где были глюки - все ОК.
aaarrr
Цитата(Vovanchik @ Jun 5 2009, 15:56) *
Уже более 4 часов запущено устройство в режиме где были глюки - все ОК.

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


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

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

Согласен.

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

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

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

Попробовал предложенный Вами вариант - при последовательном вызове функций наблюдается зависание прибора (проверил несколько раз).
При использовании только memcpy_short прибор пока работает...
KAlex
Цитата(Vovanchik @ Jun 5 2009, 15:56) *
Код
memcpy(Per_OSC_Temp, Per_OSC, sizeof(Per_OSC));

Посмотрите под отладчиком, какие параметры получаются.
По моему правильнее будет (short *)Per_OSC_Temp
codier
Если активно используете прерывания, то не забыли ли поставить обработчик AIC_SPU (Spurious Interrupt Vector Register) в AIC ? При маскировании возможено его срабатывание.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.