|
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);
|
|
|
|
|
 |
Ответов
(30 - 44)
|
Jan 20 2015, 12:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(Golikov A. @ Jan 20 2015, 14:58)  С Вашим примером всё понятно, но тут всё немного не так. Альтеровский макрос гарантирует, что запись идёт мимо кэша, т.е. помимо записи по указателю должно быть что-то ещё. Макрос максимум могу посмотреть до __builtin_stwio(void *, unsigned int), а это ни есть запись по указателю. Цитата(krux @ Jan 20 2015, 14:00)  http://www.altera.com/literature/hb/nios2/n2sw_nii52007.pdfдля данных есть такой метод как Bit-31 Cache Bypass для Nios II/f To Golikov A. вот это правильный документ, можете просмотреть, там есть описание того, что использование макросов из BSP позволяет обойти кэш о чём и шла речь. Т.е. это не равнозначно обращению к регистру через указатель.
|
|
|
|
|
Jan 20 2015, 12:28
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
ну пипец ваша альтера  .... этож надо было придумать отдельные инструкции записи мимо кеша. Так за этим еще следить надо чтобы кеш был всегда синхронен с памятью под ним... а вот явно указано Цитата Declaring a C pointer volatile does not make pointer accesses bypass the data cache. The volatile keyword merely prevents the compiler from optimizing out accesses using the pointer. This volatile behavior is different from the methodology for the first-generation Nios processor. что срали они на понятие изменяемый%) и просто оптимизацию отключают и рады)
|
|
|
|
|
Jan 20 2015, 13:12
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата т.е. вся дискуссия была для того, чтобы Вы сказали, что Альтера == дураки? смелое заявление я сказал пипец ваша альтера, дураки ли они не знаю... мне дисскусия была полезна, я теперь знаю что волатаил с альтерой не поможет и что у нее спец команды, и что перифирия в кеше (последние не 100% но косвенно так). А вам не знаю...
|
|
|
|
|
Jan 20 2015, 13:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(Golikov A. @ Jan 20 2015, 16:12)  я сказал пипец ваша альтера, дураки ли они не знаю...
мне дисскусия была полезна, я теперь знаю что волатаил с альтерой не поможет и что у нее спец команды, и что перифирия в кеше (последние не 100% но косвенно так).
А вам не знаю... Хороший подход. Не зная, как оно устроено, Вы утверждали обратное, советовали не вводить человека в заблуждение, потом сказали - "узнал много нового"
|
|
|
|
|
Jan 23 2015, 07:47
|
Участник

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

|
Возник еще такой вопрос: во время переключения DDR2 с чтения на запись и наоборот имеются тайминги, и как их учесть программно, т.е. у меня есть постоянно приходящие данные, которые записываются в DDR2, в нужные моменты времени эти данные считываются из DDR2, и хочу узнать можно ли программно отследить данные в этот маленький момент времени между переключениями ОЗУ.
|
|
|
|
|
Jan 23 2015, 08:50
|
Участник

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

|
Цитата(doom13 @ Jan 23 2015, 11:39)  Для программы Nios у Вас будет что-то типа memcpy() или цикл, "никаких маленьких моментов времени тут нет". Если хотите разгрузить процессор на время записи/чтения данных - используйте одно из ядер DMA/SgDMA/mSgDMA. я планировал на время чтения из DDR2 производить запись входных данных в on-chip memory. Как я понял программно отследить данные на время таймингов переключения не получится
|
|
|
|
|
Jan 23 2015, 09:02
|
Участник

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

|
Цитата(doom13 @ Jan 23 2015, 11:54)  Смотрите в направленни описанных ядер, поможет одновременно читать/писать данные и использовать процессор. Проблема DDR2 памяти в том, что она работает либо на чтение либо на запись. Данные приходят постоянно, а чтение происходит по запросу пользователя, т.е. может быть и раз в минуту, час. Объем данных для чтения 1.2 Мбайт. Поэтому сразу если выводить данные, то накопятся входные данные, а их терять нельзя. Решил использовать два on-chip memory и по кусочкам выводить эти 1.2Мбайта данных. Может есть какой то другой способ реализации?
|
|
|
|
|
Jan 23 2015, 11:16
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(x66 @ Jan 23 2015, 12:02)  Проблема DDR2 памяти в том, что она работает либо на чтение либо на запись. Данные приходят постоянно, а чтение происходит по запросу пользователя, т.е. может быть и раз в минуту, час. Объем данных для чтения 1.2 Мбайт. Поэтому сразу если выводить данные, то накопятся входные данные, а их терять нельзя. Решил использовать два on-chip memory и по кусочкам выводить эти 1.2Мбайта данных. Может есть какой то другой способ реализации? Тут ещё про шину avalon почитайте, если два устройства будут стучаться к DDR, она должна будет разрулить время доступа для каждого из устройств.
|
|
|
|
|
Jan 23 2015, 11:59
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Вам FIFO надо.
Данные поступают в FIFO а оттуда в DDR, через какой либо DMA контроллер.
Если данные нужны кому-то еще вы их читаете из ДДР, это приостанавливает DMA контроллер, и данные на время задержек падают в FIFO.
Ничего руками разруливать не надо, потому что проц не долбиться в шину постоянно (хотя может НИОС опять по чудному сделан, но надеюсь что нет). Вот и пока проц делает что-то еще, ДМА сам займет шину и успеет положить еще кусочек. Систему надо строить именно на таком принципе. Кстати ДДР контроллер разьве изначально не 2 портовый?
Вам надо перейти на следующий уровень абстракции, надо забыть про то какая у вас память, это забота контроллера, вы же не собираетесь еще сами следить за тем вовремя ли он подает ревреши, я надеюсь%)... Так же забота контроллера обеспечивать доступ к памяти по нескольким портам, во всяком случае у ксалинкс контроллер точно несколько портовый с арбитражем, наверяка у вас тоже, если это не так, то надо делать свой контроллер - арбитр, но не лезть к памяти напрямую, это дело контроллера памяти.
Обратите внимание что контроллер памяти ДДР - это не что-то собранное из вентилей ПЛИС, а отдельная область, готовый блок, слишком там все по таймингам не просто.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|