Перейти к содержанию
    

Здравствуйте, пишу программу на Си в ниос2 эклипс. Проект был собран в qsys, там имеется ниос2, DDR2, PIO, on-chip memory2 и т.д. Возник вопрос: как на языке Си обратиться например именно к выводу PIO или к шине адреса DDR2? Вставил несколько строк, но не знаю правильно ли сделал

ALT_MODULE_CLASS_pio_in (PIO_IN_BASE, data_inp);

ALT_MODULE_CLASS_pio_out_on (PIO_OUT_ON_BASE, data_out_on);

ALT_MODULE_CLASS_pio_out (PIO_OUT_BASE, data_out);

ALT_MODULE_CLASS_onchip_memory2_0 (ONCHIP_MEMORY2_0_BASE, on_chip);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте, пишу программу на Си в ниос2 эклипс. Проект был собран в qsys, там имеется ниос2, DDR2, PIO, on-chip memory2 и т.д. Возник вопрос: как на языке Си обратиться например именно к выводу PIO или к шине адреса DDR2? Вставил несколько строк, но не знаю правильно ли сделал

ALT_MODULE_CLASS_pio_in (PIO_IN_BASE, data_inp);

ALT_MODULE_CLASS_pio_out_on (PIO_OUT_ON_BASE, data_out_on);

ALT_MODULE_CLASS_pio_out (PIO_OUT_BASE, data_out);

ALT_MODULE_CLASS_onchip_memory2_0 (ONCHIP_MEMORY2_0_BASE, on_chip);

Смотрите в BSP папку drivers, там есть всё необходимое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрите в BSP папку drivers, там есть всё необходимое.

 

Все что есть в папке. Где взять DDR2 и on-chip memory2 ?

post-57122-1421742208_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все что есть в папке. Где взять DDR2 и on-chip memory2 ?

Bsp перегенерили после добавления DDR2? Должны драйвера под контроллер DDR2 появиться, для On-Chip memory и не требуются, ну а для GPIO - altera_avalon_gpio_regs.h.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DDR2 - это не просто статичная память, даже когда вы ее не трогаете там много всего происходит. Потому олопачиванием ее занимается специальный контроллер. Который дергает адреса, производит рефреши, выдбирает столбики и колонки.

 

Из этого следует что в целом вам не зачем и нельзя обращаться к шине что идет на память, иначе вы этот процесс собьете.

 

Чтобы просто пошевелить ножками проца - для этого существует модули которые подключаются к шине проца и данные переводят в пины GPIO. Если же есть острая необходимость шевелить ногами памяти (что скорее всего не выйдет), надо писать свой модуль между контроллером и памятью и с шиной к процу. Но скорее всего после внедрения этого модуля ваша память перестанет работать...

 

Применение контроллера DDR должно встроить память в адресное пространство вашего процессора, во всяком случае это логично и у ксалинкс сделано именно так, потому обращение в память подключенную к процу через контроллер происходит просто по адресам (чтение, запись по указателю в С)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обманул Вас, для DDR2 как и для On-Chip Memory не будет драйверов в BSP. При условии правильных настроек в Qsys для DDR2-контроллера и соблюдения всех таймингов будет работать как обычная память - создаём указатель на адреса DDR, по нему обращаемся к памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

получается, что я могу работать только с адресами ОЗУ? Адресное пространство вроде задал верно, qsys не ругался.

 

Bsp перегенерили после добавления DDR2? Должны драйвера под контроллер DDR2 появиться, для On-Chip memory и не требуются, ну а для GPIO - altera_avalon_gpio_regs.h.

 

altera_avalon_gpio_regs.h получается общем для нескольких PIO? я в qsys сделал несколько PIO (PIO_IN, PIO_OUT, PIO_OUT_ON)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

altera_avalon_gpio_regs.h получается общем для нескольких PIO? я в qsys сделал несколько PIO (PIO_IN, PIO_OUT, PIO_OUT_ON)

Да, только там есть параметр BASE, а он для всех GPIO разный.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, только там есть параметр BASE, а он для всех GPIO разный.

 

Спасибо, начинаю понимать. Везде в примерах даются строки, например IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, leds), но не объясняются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

получается, что я могу работать только с адресами ОЗУ? Адресное пространство вроде задал верно, qsys не ругался.

Не совсем понял, что Вы этим хотели сказать. Если к Ниосу прикручен DDR2 и On-chip memory, то и тот и тот есть ОЗУ.

Для работы с DDR2 можно использовать что-то типа:

int *ddr2_ptr = (int *) DDR2_START_ADDRESS;

или в BSP Editor определяете секции, которые будут ложится в DDR2 (например .heap - тогда при динамическом выделении памяти, она и будет выделяться в DDR2).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, только там есть параметр BASE, а он для всех GPIO разный.

 

В моем случае надо так вводить строки?

IOWR_ALTERA_AVALON_PIO_DATA(pio_in, data)

IOWR_ALTERA_AVALON_PIO_DATA(pio_out, data)

IOWR_ALTERA_AVALON_PIO_DATA(pio_out_on, data)

 

Вместо data вводится свое имя переменной

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С DDR можно работать как с памятью вообще

Для этого надо узнать ее адрес и по адресу читать - писать

А можно как с памятью процессора, для этого надо линкеру про нее рассказать, и тогда все остальное будет происходить само. переменные в ней создадутся, куча там будет и так далее..

 

Можно комбинировать, часть разметить и отдать процу, а часть использовать самому по указателю.

 

Неужели альтера не дает примеров с тестом памяти? посмотрите его, там же все очевидно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем понял, что Вы этим хотели сказать. Если к Ниосу прикручен DDR2 и On-chip memory, то и тот и тот есть ОЗУ.

Для работы с DDR2 можно использовать что-то типа:

int *ddr2_ptr = (int *) DDR2_START_ADDRESS;

или в BSP Editor определяете секции, которые будут ложится в DDR2 (например .heap - тогда при динамическом выделении памяти, она и будет выделяться в DDR2).

 

Имеется внешняя DDR2, также есть On-chip memory, которая необходима для моментов времени, когда происходит чтение из DDR2. В эклипсе для работы с адресами я использую строки, например int addr_on_chip=0x4008000; Правильная ли такая запись?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нет

потому что нужно адрес не

int addr_on_chip=0x4008000

 

а

int *addr_on_chip = (int *)0x4008000;

 

записать туда *addr_on_chip = 10;

считать оттуда

int Temp = *addr_on_chip;

 

 

при условии что 0x4008000 - это адрес в ДДР

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В моем случае надо так вводить строки?

IOWR_ALTERA_AVALON_PIO_DATA(pio_in, data)

IOWR_ALTERA_AVALON_PIO_DATA(pio_out, data)

IOWR_ALTERA_AVALON_PIO_DATA(pio_out_on, data)

 

Вместо data вводится свое имя переменной

Да, data - то, что хотите видеть на выходе порта или то, что читаете.

Адреса pio_in, pio_out, pio_out_on берёте из system.h.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...