Jump to content
    

С Вашим примером всё понятно, но тут всё немного не так. Альтеровский макрос гарантирует, что запись идёт мимо кэша, т.е. помимо записи по указателю должно быть что-то ещё.

Макрос максимум могу посмотреть до __builtin_stwio(void *, unsigned int), а это ни есть запись по указателю.

 

http://www.altera.com/literature/hb/nios2/n2sw_nii52007.pdf

для данных есть такой метод как Bit-31 Cache Bypass для Nios II/f

To Golikov A.

вот это правильный документ, можете просмотреть, там есть описание того, что использование макросов из BSP позволяет обойти кэш о чём и шла речь. Т.е. это не равнозначно обращению к регистру через указатель.

Share this post


Link to post
Share on other sites

ну пипец ваша альтера:)....

 

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

 

а вот явно указано

 

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.

что срали они на понятие изменяемый%) и просто оптимизацию отключают и рады)

Share this post


Link to post
Share on other sites

ну пипец ваша альтера:)....

 

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

т.е. вся дискуссия была для того, чтобы Вы сказали, что Альтера == дураки? смелое заявление

Share this post


Link to post
Share on other sites

т.е. вся дискуссия была для того, чтобы Вы сказали, что Альтера == дураки? смелое заявление

я сказал пипец ваша альтера, дураки ли они не знаю...

 

мне дисскусия была полезна, я теперь знаю что волатаил с альтерой не поможет и что у нее спец команды, и что перифирия в кеше (последние не 100% но косвенно так).

 

А вам не знаю...

Share this post


Link to post
Share on other sites

я сказал пипец ваша альтера, дураки ли они не знаю...

 

мне дисскусия была полезна, я теперь знаю что волатаил с альтерой не поможет и что у нее спец команды, и что перифирия в кеше (последние не 100% но косвенно так).

 

А вам не знаю...

Хороший подход. Не зная, как оно устроено, Вы утверждали обратное, советовали не вводить человека в заблуждение,

потом сказали - "узнал много нового" :lol:

Share this post


Link to post
Share on other sites

не надо передергивать

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

 

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

 

Ну в целом это не важно хихикайте дальше;)

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Для программы Nios у Вас будет что-то типа memcpy() или цикл, "никаких маленьких моментов времени тут нет". Если хотите разгрузить процессор на время записи/чтения данных - используйте одно из ядер DMA/SgDMA/mSgDMA.

 

Share this post


Link to post
Share on other sites

Для программы Nios у Вас будет что-то типа memcpy() или цикл, "никаких маленьких моментов времени тут нет". Если хотите разгрузить процессор на время записи/чтения данных - используйте одно из ядер DMA/SgDMA/mSgDMA.

я планировал на время чтения из DDR2 производить запись входных данных в on-chip memory. Как я понял программно отследить данные на время таймингов переключения не получится

Share this post


Link to post
Share on other sites

я планировал на время чтения из DDR2 производить запись входных данных в on-chip memory. Как я понял программно отследить данные на время таймингов переключения не получится

Смотрите в направленни описанных ядер, поможет одновременно читать/писать данные и использовать процессор.

Share this post


Link to post
Share on other sites

Смотрите в направленни описанных ядер, поможет одновременно читать/писать данные и использовать процессор.

 

Проблема DDR2 памяти в том, что она работает либо на чтение либо на запись. Данные приходят постоянно, а чтение происходит по запросу пользователя, т.е. может быть и раз в минуту, час. Объем данных для чтения 1.2 Мбайт. Поэтому сразу если выводить данные, то накопятся входные данные, а их терять нельзя. Решил использовать два on-chip memory и по кусочкам выводить эти 1.2Мбайта данных. Может есть какой то другой способ реализации?

Share this post


Link to post
Share on other sites

Проблема DDR2 памяти в том, что она работает либо на чтение либо на запись. Данные приходят постоянно, а чтение происходит по запросу пользователя, т.е. может быть и раз в минуту, час. Объем данных для чтения 1.2 Мбайт. Поэтому сразу если выводить данные, то накопятся входные данные, а их терять нельзя. Решил использовать два on-chip memory и по кусочкам выводить эти 1.2Мбайта данных. Может есть какой то другой способ реализации?

Тут ещё про шину avalon почитайте, если два устройства будут стучаться к DDR, она должна будет разрулить время доступа для каждого из устройств.

 

Share this post


Link to post
Share on other sites

Вам FIFO надо.

 

Данные поступают в FIFO а оттуда в DDR, через какой либо DMA контроллер.

 

Если данные нужны кому-то еще вы их читаете из ДДР, это приостанавливает DMA контроллер, и данные на время задержек падают в FIFO.

 

Ничего руками разруливать не надо, потому что проц не долбиться в шину постоянно (хотя может НИОС опять по чудному сделан, но надеюсь что нет). Вот и пока проц делает что-то еще, ДМА сам займет шину и успеет положить еще кусочек. Систему надо строить именно на таком принципе. Кстати ДДР контроллер разьве изначально не 2 портовый?

 

Вам надо перейти на следующий уровень абстракции, надо забыть про то какая у вас память, это забота контроллера, вы же не собираетесь еще сами следить за тем вовремя ли он подает ревреши, я надеюсь%)... Так же забота контроллера обеспечивать доступ к памяти по нескольким портам, во всяком случае у ксалинкс контроллер точно несколько портовый с арбитражем, наверяка у вас тоже, если это не так, то надо делать свой контроллер - арбитр, но не лезть к памяти напрямую, это дело контроллера памяти.

 

Обратите внимание что контроллер памяти ДДР - это не что-то собранное из вентилей ПЛИС, а отдельная область, готовый блок, слишком там все по таймингам не просто.

Share this post


Link to post
Share on other sites

Обратите внимание что контроллер памяти ДДР - это не что-то собранное из вентилей ПЛИС, а отдельная область, готовый блок, слишком там все по таймингам не просто.

Это уже от ПЛИС зависит, может быть и на логике собран.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...