Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
з лабораторної роботи №5
на тему:
„ SystemC: моделювання інтерфейсу на основі
семафору (mutex).”
Підготував: ст. гр. СКС-1
Львів 2007
Мета: Ознайомитись з поняттям каналів у SystemC на прикладі проекту «Mutex».
Завдання:
1.Заванажити до середовища SystemC проект mutex та запустити його на виконання.
2.Ознайомитись з результатами та зробити висновки.
Теоретичні відомості:
SystemC має вбудовані механізми, відомі як канали, призначені для полегшення рутинної праці , інкапсулюючи засоби організації взаємозв’язку між паралельними процесами. SystemC має два типи каналів: базові та ієрархічні.
Базовий канал sc_mutex
У програмуванні mutex (mutual exclusion – взаємовиключення) - це об’єкт «семафор», який дозволяє багатьом програмам здійснювати потоковий спільний доступ до певного ресурсу, наприклад, до файлів, без колізій.
У SystemC sc_mutex – це наперед визначений базовий канал, призначений для моделювання поведінки механізму синхронізації доступу паралельних процесів до спільних ресурсів.
sc_mutex має власні наперед визначені методи:
- int lock() – блокує семафор, якщо він є розблокований, в іншому випадку очікує факту розблокування;
- int unlock()- розблоковує семафор;
- int trylock() – перевіряє чи семафор є вільним; якщо так – блокує його, в іншому випадку повертає «-1».
Прикладом використання семафору може бути керування спільною шиною.
class bus {
sc_mutex bus_access;
void write(int addr, int data) {
bus_access.lock();
// perform write
bus_access.unlock();
}
};//endclass
Виконання лабораторної роботи:
1.Лістинг проекту:
#include <systemc.h>
SC_MODULE( mod_a )
{
sc_mutex mutex;
void write( const char* msg )
{
cout << sc_simulation_time() << " " << msg << endl;
}
void proc_a()
{
while( true ) {
wait( 1, SC_NS );
write( "proc_a - lock requested" );
mutex.lock();
write( "proc_a - lock obtained" );
wait( 2, SC_NS );
if( mutex.unlock() == 0 ) {
write( "proc_a - unlock successful" );
} else {
write( "proc_a - unlock failed" );
}
wait( 3, SC_NS );
if( mutex.trylock() == 0 ) {
write( "proc_a - trylock successful" );
} else {
write( "proc_a - trylock failed" );
}
if( mutex.unlock() == 0 ) {
write( "proc_a - unlock successful" );
} else {
write( "proc_a - unlock failed" );
}
}
}
void proc_b()
{
while( true ) {
wait( 2, SC_NS );
write( "proc_b - lock requested" );
mutex.lock();
write( "proc_b - lock obtained" );
wait( 4, SC_NS );
if( mutex.unlock() == 0 ) {
write( "proc_b - unlock successful" );
} else {
write( "proc_b - unlock failed" );
}
wait( 3, SC_NS );
if( mutex.trylock() == 0 ) {
write( "proc_b - trylock successful" );
} else {
write( "proc_b - trylock failed" );
}
if( mutex.unlock() == 0 ) {
write( "proc_b - unlock successful" );
} else {
write( "proc_b - unlock failed" );
}
}
}
SC_CTOR( mod_a )
{
SC_THREAD( proc_a );
SC_THREAD( proc_b );
}
};
int
sc_main( int, char*[] )
{
mod_a a( "a" );
sc_start( 20, SC_NS );
return 0;
}
2. Результати дослідження роботи проекту:
Висновок: На даній лабораторній роботі я ознайомився з поняттям каналів у SystemC на прикладі проекту «Mutex».