Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания в NIOS
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Zamir
Здравствуйте.
Пытаюсь разобраться с прерываниями в NIOSе.
Создал в SOPC ядро с поддержкой VIC. Написал маленький проект в NIOS. При компиляции студия выдает ошибки:

ERROR - Nios II system libraries in the IDE development flow do not support an external interrupt controller port on the Nios II.
Use the Nios II software build tools development flow instead.

14.12.2010 14:26:25 - (SEVERE) generate: java.lang.IllegalStateException: java.lang.IllegalStateException: com.altera.ingenuous.GTFElement.GTFElementErrorException: <error> element in GTF script

Буду рад любой помощи



Stewart Little
Цитата(Zamir @ Dec 14 2010, 11:28) *
ERROR - Nios II system libraries in the IDE development flow do not support an external interrupt controller port on the Nios II.
Use the Nios II software build tools development flow instead.

Ну так создавайте софтовый проект не в Legacy NiosII IDE, а в NiosII SBT.
Zamir
Спасибо за ответ Stewart Little.
А как организовывать прерывания если я использую внутренний контроллер прерывания (IIC)?
Допустим нужно организовать прерывание по приему данных по UART.
1) какие системные файлы необходимо подключить в проект
2) Как конкретно разрешается данное прерывание?
3) как конкретно "выглядит" вектор данного прерывания?

Скиньте ссылку где можно об этом прочитать, пожалуйста.
Если у кого нибудь есть пример организации обработки прерывания в NIOS, скиньте пожалуйста (zamir221(собака)yandex.ру)
vadimuzzz
по умолчанию там все через HAL разруливается и прерывания не видны. в настройках System Library или
в свойствах BSP устройства типа UART можно выбрать в качестве стандартного ввода/вывода и использовать
обычные функции библиотеки C fprintf, fscanf...
Zamir
Меня как раз вариант "через HAL" и интересует...
Stewart Little
Цитата(Zamir @ Dec 15 2010, 16:54) *
Меня как раз вариант "через HAL" и интересует...

RTFM, как говорят грубые люди sm.gif
Exception Handling
AN 595: Vectored Interrupt Controller Usage and Applications
Example Designs for AN595
Zamir
VIC мне не нужен. Я использую IIC. Меня интересует как конкретно реализовать прерывание по приему данных по УАРТ. (на примере, если возможно). А именно какая конкретно команда в ниосе разрешает прерывания, какая команда разрешает прерывание по приему данных по УАРТ и т д...
vadimuzzz
так вы конкретно скажите, вам реализация через стандартный драйвер HAL нужна или вы хотите делать
свой обработчик прерывания? (эти пункты взаимоисключающие)
если HAL - там работа идет через getchar, printf.
Код
/* A simple program that recognizes the characters 't' and 'v' */
#include <stdio.h>
#include <string.h>
int main ()
{
    char* msg = "Detected the character 't'.\n";
    FILE* fp;
    char prompt = 0;
    fp = fopen ("/dev/uart1", "r+"); //Open file for reading and writing
    if (fp)
    {
        while (prompt != 'v')
        { // Loop until we receive a 'v'.
            prompt = getc(fp); // Get a character from the UART.
            if (prompt == 't')
            { // Print a message if character is 't'.
                fwrite (msg, strlen (msg), 1, fp);
            }
        }
        fprintf(fp, "Closing the UART file.\n");
        fclose (fp);
    }
    return 0;
}

если надо свое прерывание, то смотрите в сторону alt_irq_register
Zamir
Цитата(vadimuzzz @ Dec 16 2010, 10:43) *
так вы конкретно скажите, вам реализация через стандартный драйвер HAL нужна или вы хотите делать
свой обработчик прерывания? (эти пункты взаимоисключающие)
если HAL - там работа идет через getchar, printf.
Код
/* A simple program that recognizes the characters 't' and 'v' */
#include <stdio.h>
#include <string.h>
int main ()
{
    char* msg = "Detected the character 't'.\n";
    FILE* fp;
    char prompt = 0;
    fp = fopen ("/dev/uart1", "r+"); //Open file for reading and writing
    if (fp)
    {
        while (prompt != 'v')
        { // Loop until we receive a 'v'.
            prompt = getc(fp); // Get a character from the UART.
            if (prompt == 't')
            { // Print a message if character is 't'.
                fwrite (msg, strlen (msg), 1, fp);
            }
        }
        fprintf(fp, "Closing the UART file.\n");
        fclose (fp);
    }
    return 0;
}

если надо свое прерывание, то смотрите в сторону alt_irq_register


Скомпилил этот пример, предварительно установив в настройках систем либрари УАРТ как стандартное средство ввода/вывода. Выдает ошибку:
/FPGA_3.c:344: undefined reference to `fopen'
obj/FPGA_3.o(.text+0xbe4):../FPGA_3.c:349: undefined reference to `getc'
obj/FPGA_3.o(.text+0xc10):../FPGA_3.c:352: undefined reference to `fwrite'
obj/FPGA_3.o(.text+0xc2c):../FPGA_3.c:356: undefined reference to `fclose'
необходимые библиотечные файлы подключены, работаю в NIOS II IDE v9.1
В чем может быть ошибка?
vadimuzzz
какие еще настройки в System Library выставлены?
Zamir
Цитата(vadimuzzz @ Dec 16 2010, 13:08) *
какие еще настройки в System Library выставлены?


такие настройки


Нажмите для просмотра прикрепленного файла
Stewart Little
Цитата(Zamir @ Dec 16 2010, 13:40) *
такие настройки

Уберите галку Reduced device drivers.
И прочтите, наконец, мануал!
Zamir
Цитата(Stewart Little @ Dec 16 2010, 14:15) *
Уберите галку Reduced device drivers.
И прочтите, наконец, мануал!


Галочку Reduced device drivers убрал... эффекта никого. Ошибка та же самая вылазит. Мануал читал и делал все по нему. И пример взят оттуда же.
Stewart Little
Определитесь, что же Вы все-таки хотите - использовать прерывания, или просто работать с UART'ом. Это две большие разницы (pending или polling).
По поводу примера - все ли включаемые файлы Вы добавили в исходник? Я что-то там system.h не вижу.
Zamir
Все необходимые файлы включены, в том числе и system.h. Я понимаю разницу между прерываниями и просто работой с УАРТ. Хотелось бы разобраться с прерываниями (а именно с прерыванием по приему данных по УАРТу). Как сделать так, чтобы когда на УАРТ пришли данные с компьютера (с терминала) возникло прерывание? и уже в этом прерывании что-то делать....
Stewart Little
Цитата(Zamir @ Dec 16 2010, 14:58) *
Все необходимые файлы включены, в том числе и system.h. Я понимаю разницу между прерываниями и просто работой с УАРТ. Хотелось бы разобраться с прерываниями (а именно с прерыванием по приему данных по УАРТу). Как сделать так, чтобы когда на УАРТ пришли данные с компьютера (с терминала) возникло прерывание? и уже в этом прерывании что-то делать....

Ну, во-первых, нужно в SOPC Builder'е завести прерывание с UARTа в процессор. Заново сгенерировать систему, и обновить bsp (ну или SystemLibrary, если работаете в старом design flow).
При написании своего исходника Вы должны будете зарегистрировать обработчик прерывания от UART'а (не помню, какая функция для этого использовалась в старой версии, в новой это alt_ic_isr_register()). Ну и написать свой обработчик прерывания UART'а.
См. пример использования прерывания от таймера (по прерыванию выдается новое значение в параллельный порт и меняется скважность ШИМа).
Пример для SBT ("новый" design flow).
vadimuzzz
уберите галку в настройках системной библиотеки Small C library. или новый проект на базе Hello World, там она автоматом стоит, добавьте туда приведенный выше код.
Reanimator++
Кстати, помимо снятия этих двух галок, не нужно ли убирать назначение стандартных потоков ввода-вывода с Uart-a с которым хотим работать через fopen () ?
Конфликта случаем не будет (открытого файла и стандартного потока ввода-вывода)?
Zamir
Заработало! всем спасибо!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.