Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Лабораторна робота №4
з диципліни: «Програмовані системи реального часу»
на тему: «Використання семафорів і мютексів для реалізації доступу до спільних ресурсів системи.»
Мета роботи: навчитись використовувати семафори і мютекси для реалізації доступу до спільних ресурсів системи.
Теоретичні відомості
Розробити програму, в якій декілька задач імітують доступ до деякого спільного ресурсу використовуючи семафори та м’ютекси. Кожна із задач захоплює ресурс на випадковий інтервал часу із наперед заданого діапазону , який є однаковим для всіх задач. Якщо ресурс є недоступний протягом часу , то надсилається повідомлення про помилку. Окрім задач, які саму імітують використання ресурсу, існує додаткова задача, яка виводить повідомлення про те, яка із задач отримала спільний ресурс і повідомлення про помилку, якщо вибраний ресурс не був доступний в межах заданого інтервалу часу.
Окрім виводу повідомлень про використання певних ресурсів, додаткова задача здійснює збір статистичних даних про мінімальний, середній і максимальний час доступу до ресурсу для кожної із задач. Виконати дві реалізації програми – використовуючи семафори та використовуючи м’ютекси для реалізації доступу до спільного ресурсу. Порівняти отримані результати для часу доступу із використанням механізму семафорів і механізму м’ютексів. Пояснити відмінності в отриманих часових параметрах.
Програмна реалізація
static void TaskStartCreateTasks (void)
{
INT8U i;
for (i = 0; i < N_TASKS; i++) { /* Create N_TASKS identical tasks */
TaskData[i] = '0' + i; /* Each task will display its own letter */
OSTaskCreate(Task, (void *)&TaskData[i], &TaskStk[i][TASK_STK_SIZE - 1], i+10 );
}
OSTaskCreate(StatisticTask,NULL,&StatisticTaskStk[TASK_STK_SIZE - 1],StatisticPrio);
}
/******************************** TASKS ********************************/
void Task (void *parg)
{
INT8U r;
INT8U err1,err2;
struct QStruct *elem;
randomize();
for (;;) {
OSSemPend(RandomSem, T3, &err1);
elem=(struct QStruct *)OSQPend(QFree,0,&err2);
elem->ErrCode=err1;
elem->NumTask= (INT8U )(*(char *)parg - '0');
elem->Time = 0;
if (err1 == OS_NO_ERR) {
r =(INT8U)random(T2-T1);
elem->Time = r;
OSTimeDly(r);
r=0;
OSSemPost(RandomSem);
}
OSQPost(QNFree,(void *)elem);
}
}
void StatisticTask (void *parg)
{
INT8U i;
INT8U err;
char str[5];
struct QStruct *elem;
struct Times{
INT8U TMin;
INT8U TMax;
INT8U T;
} MasTime[N_TASKS] = {175,0,0, 45,0,0, 255,0,0} ;
for (;;) {
elem=(struct QStruct *)OSQPend(QNFree,0,&err);
OSQPost(QFree,(void *)elem);
MasTime[elem->NumTask].T = elem->Time;
if (MasTime[elem->NumTask].T>MasTime[elem->NumTask].TMax)
MasTime[elem->NumTask].TMax = MasTime[elem->NumTask].T;
if ((MasTime[elem->NumTask].T<MasTime[elem->NumTask].TMin)&&(MasTime[elem->NumTask].T!=0))
MasTime[elem->NumTask].TMin = MasTime[elem->NumTask].T;
PC_DispChar(3,elem->NumTask+10, elem->NumTask+'1', DISP_FGND_YELLOW + DISP_BGND_BLUE);
PC_DispStr(10,elem->NumTask+10," ", DISP_FGND_YELLOW + DISP_BGND_GREEN);
PC_DispStr(10,elem->NumTask+10,itoa(MasTime[elem->NumTask].T,str,5), DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSTimeDly(10);
}
}
Результати виконання
Висновок: Під час виконання даної лабораторної роботи я навчився використовувати семафори і мютекси для реалізації доступу до спільних ресурсів системи процесора.