Цитата(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"