реклама на сайте
подробности

 
 
> QSYS, память DDR и два мастера
Styv
сообщение Mar 1 2013, 09:31
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 133
Регистрация: 16-08-04
Пользователь №: 504



Привет Всем!

Собираю систему в qsys, состоящую из контроллера памяти DDR и двух моих модулей, которые являются мастерами Аvalon-ММ, которые должны независимо друг от друга обращаться к ДДР.

Если по отдельности каждый модуль работает с ДДР нормально, то при сподключении к ДДР двух модуляй, оба или перестают работать или работают с ошибками.

Как подключать к одному слейву несколько мастеров?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
torik
сообщение Mar 7 2013, 11:31
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



интересно конечно. Но из даташита непонятно как пользоваться этим mutex. Есть опыт?

Цитата
Если по отдельности каждый модуль работает с ДДР нормально, то при сподключении к ДДР двух модуляй, оба или перестают работать или работают с ошибками.

а что за ошибки такие? Вообще, если чтение/запись бурстами, то арбитраж самому делать не надо, надо только учесть waitrequest.


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
wpost
сообщение Mar 9 2013, 06:13
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 1-04-10
Из: СПб
Пользователь №: 56 354



Цитата(torik @ Mar 7 2013, 15:31) *
интересно конечно. Но из даташита непонятно как пользоваться этим mutex. Есть опыт?


да, опыт есть. там все просто.
Если из ниоса, то вообще все просто...
Код
#include <altera_avalon_mutex.h>
/* get the mutex device handle */
alt_mutex_dev* mutex = altera_avalon_mutex_open( ”/dev/mutex” );
/* acquire the mutex, setting the value to one */
altera_avalon_mutex_lock( mutex, 1 );
/*
* Access a shared resource here.
* Здесь защищенный код. можно пользоваться общим ресурсом.
*/
/* release the lock */
altera_avalon_mutex_unlock( mutex );

Естественно, любое обращение любого мастера к общему ресурсу нужно заключать между altera_avalon_mutex_lock и altera_avalon_mutex_unlock( mutex ). Значение 1 взято просто для примера.

Если без ниоса, то примерно так:

захват шины происходит путем записи в регистр mutex двух идентификаторов: OWNER - номер процессора (CPU ID), и VALUE - идентификатор процесса, который хочет занять устройство (любое число не 0)
после чего проверяется факт удачного захвата (вдруг нас опередили)

Код
static int alt_mutex_trylock( alt_mutex_dev* dev, alt_u32 value )
{
  alt_u32 id, data, check;
  int ret_code = -1;

  NIOS2_READ_CPUID(id);

  /* the data we want the mutex to hold */
  data = (id << ALTERA_AVALON_MUTEX_MUTEX_OWNER_OFST) | value;

  /* attempt to write to the mutex */
  IOWR_ALTERA_AVALON_MUTEX_MUTEX(dev->mutex_base, data);
  
  check = IORD_ALTERA_AVALON_MUTEX_MUTEX(dev->mutex_base);

  if ( check == data)
  {
    ret_code = 0;
  }

  return ret_code;
}


Проверка что устройство свободно заключается в прочтении регистра mutex. Если VALUE = 0 то путь свободен, можно лезть.

чтобы освободить устройство нужно записать 1 в регистр reset.

в первом приближении это все. подробнее посмотрите в папке "с:\altera\11.0\ip\altera\sopc_builder_ip\altera_avalon_mutex\HAL\src"

Сообщение отредактировал wpost - Mar 9 2013, 06:22
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 21:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016