|
NIOS II, программирование ниос2 на СИ |
|
|
|
Jan 20 2015, 06:52
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122

|
Здравствуйте, пишу программу на Си в ниос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);
|
|
|
|
|
 |
Ответов
(90 - 104)
|
Jan 28 2015, 14:02
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122

|
Цитата(Golikov A. @ Jan 28 2015, 16:54)  нет. Надо просто линкеру указать что у него есть такая память. Ну я все элементы добавил и указал адреса. Сделал несколько проектов в кусис. Кстати, можно ли как-то внося изменения в кусисе применять их и в ниос2 эклипсе не создавая заново проект. А то не удобно каждый раз заново создавать проект
|
|
|
|
|
Jan 28 2015, 14:22
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122

|
Цитата(doom13 @ Jan 28 2015, 17:14)  Этого и не надо делать (заново создавать). Правой кнопкой на project_name_bsp->Nios II->Generate BSP/BSP Editor (если хотите настройки генерации BSP менять). А если я в кусисе переименовал проект, то как можно сделать?
|
|
|
|
|
Jan 28 2015, 14:34
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(Golikov A. @ Jan 28 2015, 16:39)  а... 3.2 Гигабита... Тут я просто обязан был спросить: Вы ошибались, да? Цитата(x66 @ Jan 28 2015, 17:22)  А если я в кусисе переименовал проект, то как можно сделать? Тогда есть варианты, но я бы сделал так: progect_name_bsp->BSP Editor->вылазит окно Nios II BSP Editor Далее в окне Nios II BSP Editor: File->New BSP->Выбираете нужный (новый) SOPC Information File Name->снимаете галку Use default locations->Задаёте название progect_name_bsp->Generate В эклипсе все названия сохранятся, а ссылаться будет на новое железо.
|
|
|
|
|
Jan 28 2015, 14:52
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(Golikov A. @ Jan 28 2015, 17:34)  Если вам будет приятно потешить местечковое самолюбие вы разработчик конечно гораздо лучше чем я. Не собирался тут с Вами ничем меряться, всего лишь указал на Ваше свойство уверенно давать ответы на вопросы в которых Вы некомпетентны. Извините, если это задело Вас. Далее был просто стёб, жаль, что Вы не заценили Цитата(Golikov A. @ Jan 28 2015, 17:34)  Одна идея что DMA контроллер, который работает через туже шину что проц и делит с ним эту шину, будет работать быстрее чем проц отдельного уже говорит о многом. Я не говорил, что это будет быстрее (если читать/писать данные в одну и ту же память), а говорил, что это разгрузит проц и он сможет делать что-то там ещё во время пока DMA переливает данные.
|
|
|
|
|
Jan 28 2015, 15:42
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Из полезного вот что надо сделать надо ниосом в память записать кусок данных считать кусок данных и записать - считать кусок данных попеременно (то есть 4 байта записали, затем 4 байта считали). Этот режим лучше попробовать в нескольких вариантах (16 байт записали, 4 считали, 32 байта записали, 4 считали). Писать и читать надо из разных адресов. Данные для записи надо брать из какой-то valotile переменной. А лучше из внешней периферии потому что надо еще через кеш альтеры пробиться, то есть чтобы компилятор поставил правильные команды.
Для всего этого померить время выполнения, чтобы определить реальную пропускную способность.
при скорости 15 МСлов в секунду и проце 100 МГц, у вас на каждую операцию есть 6 тактов, что-то мне говорит что проц не успеет. Кстати сколько микросхем памяти у проца? то есть реально какой длинны слово оно может записать за такт?
П.С. фраза "что-то мне говорит" означает что я не уверен, но мне так кажется
|
|
|
|
|
Feb 6 2015, 09:33
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122

|
Цитата(Golikov A. @ Jan 20 2015, 12:24)  нет потому что нужно адрес не int addr_on_chip=0x4008000
а int *addr_on_chip = (int *)0x4008000;
записать туда *addr_on_chip = 10; считать оттуда int Temp = *addr_on_chip;
при условии что 0x4008000 - это адрес в ДДР смотрел код из документа an398.pdf там написано unsigned int *led_address; unsigned long *DDR_address; //long is 32 bits. int led_value; int addr; int datar; int ddr_data_out; char packet[32]; DDR_address = (unsigned long *)0x80000000; //make non-cache led_address = (unsigned int *)0x84008800; //make non-cache В чем отличие *addr_on_chip = (int *)0x4008000 от addr_on_chip = (int *)0x4008000
|
|
|
|
|
Feb 6 2015, 10:16
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
букварь по С надо почитать. в чем отличие int A; от int *A; ? забавно что в вашем примере непонимание еще даже глубже  вам надо еще узнать разницу между int *A; и *A просто, при условии что объявлено как int *A; естественно в приведенном примере сделано правильно переменная объявлена как указатель и адресу присвоено значение меня вот комментарии интересуют 0x84008800; //make non-cache то есть получается что адрес 4008800 - под кешем, а если поставить старшую единичку, то будет обращение в те же адреса, только без кеша? так надо это понимать? То есть у ниоса тоже есть не кешируемое пространство, и в целом можно обращаться к портам через указатель, просто написав макрос добавления старшей единички? Или там как-то хитро ММУ настроен, что обращение в эти адреса порождает вызов спец команд? ---upd перечитал некрасиво без ответа int *A; - объявление указателя на int int *A = (int *)ADDR; - объявление указателя на int и сразу задание указателю значения ADDR (ссылается на адрес ADDR) A = (int *)ADDR; - задание значение указателю ADDR (ссылается на адрес ADDR) *A = VALUE; - задание значения переменной на которую ссылается указатель
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|