Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
з лабораторної роботи №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».
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!