Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: NIOS alt_exception_unknown
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
novartis
Добрый день.
Отлаживаю проект с Ниосом.
Иногда процессор тупо виснет. Причем может проработать полчаса и все нормально, а иногда через 5 минут виснет.
Запускаю дебаг режим, и если зависает, то попадаю в файл alt_exception_entry.S в следующий код в строку с break:
Код
.....
alt_exception_unknown:
#ifdef NIOS2_HAS_DEBUG_STUB
       /*
        *  Either tell the user now (if there is a debugger attached) or go into
        *  the debug monitor which will loop until a debugger is attached.
        */
        break
#else /* NIOS2_HAS_DEBUG_STUB disabled */
       /*
        *  If there is no debug stub, an infinite loop is more useful.
        */
        br   alt_exception_unknown
#endif /* NIOS2_HAS_DEBUG_STUB */
#endif /* ALT_INCLUDE_INSTRUCTION_RELATED_EXCEPTION_API */

        .section .exceptions.exit.label
.Lexception_exit:

        .section .exceptions.exit, "xa"

        /*
         * Restore the saved registers, so that all general purpose registers
         * have been restored to their state at the time the interrupt occured.
         */

        ldw   r5,  68(sp)
        ldw   ea,  72(sp)  /* This becomes the PC once eret is executed */
        ldw   ra,   0(sp)

        wrctl estatus, r5

        ldw   r1,   8(sp)
        ldw   r2,  12(sp)
        ldw   r3,  16(sp)
        ldw   r4,  20(sp)
        ldw   r5,  24(sp)
        ldw   r6,  28(sp)
        ldw   r7,  32(sp)
......


Чтобы это значило и как это победить?


Нажмите для просмотра прикрепленного файла



Timmy
Там написан источник исключения: rtp.cpp:435 и адрес инструкции, так что надо посмотреть в дизассембер и сделать выводы. Например, невыровненное обращение к памяти.
Stewart Little
Проверьте, не возникает ли у Вас программного исключения (деление на 0, обращение к несуществующей области памяти и т.п.) или аппаратного прерывания, для которого нет обработчика.
novartis
Вроде устранили проблему. При возникновении определенной ситуации производил сброс своих пользовательских модулей. И в одном из модулей в момент сброса могло выставиться прерывание (на один такт). Занулил сигнал прерывания на момент сброса, и все стало работать без эксепшинов. Физику процесса так и не постиг. Прерывание как прерывание, только длинною в один такт. То есть как написал Stewart Little аппаратное прерывание имеется, но обработчик то для него есть.
Stewart Little
Цитата(novartis @ Jun 8 2015, 15:56) *
Физику процесса так и не постиг. Прерывание как прерывание, только длинною в один такт.

Чтобы постичь физику процесса, читайте, как устроен "софтверный" контроллер исключений (который называется Internal).

Если коротко, то существует только один адрес перехода по исключению, откуда вызывается обработчик исключений. Этот обработчик определяет, что явилось источником исключения, и вызывает соответствующий ISR.
Скорее всего, у Вас длительности импульса хватает для определения факта прерывания, но к моменту "разбора полетов" Ваш импульс уже успевает закончиться. Вот обработчик и не может определить, что именно его вызвало.

P.S. ИМХО, стоит использовать VIC, если, конечно, у Вас NiosII не Economy.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.