Uploaded by duatuyul2

213310028 Muhammad Shobari Prak Sistem Operasi Real Time PertemuanKe-9

advertisement
LAPORAN PRAKTIKUM
SISTEM OPERASI REAL TIME
PERTEMUAN KE – 9
Disusun Oleh :
NAMA
: MUHAMMAD SHOBARI
NIM
: 213310028
JURUSAN
: TEKNOLOGI KOMPUTER
JENJANG
: D3
UNIVERSITAS TEKNOLOGI DIGITAL INDONESIA
2023
PERTEMUAN KE- 9
(Lock dan Unlock Resource Menggunakan Mutex)
A. TUJUAN
1. Praktikan mampu menggunakan lock dan unlock resource dengan Mutex
B. BAHAN DAN ALAT
1. ESP32 Develepment Board
2. Breadboard
3. Kabel micro USB
4. LED x 2
5. Resistor 100 x 2
6. Mircro Switch
7. Potensiometer x 1
8. Kabel Jumper
9. Arduino IDE
C. METODE PRAKTIK
a) Akses Resource Dengan Lock Semaphore Binary
1. Membuat rangkaian seperti diagram blok gambar 2.
2. Membuat kode program seperti listing 1 dan upload.
Listing 1 :
#define LED1 12
#define LED2 13
SemaphoreHandle_t lockFlag;
TaskHandle_t task1, task2, task3;
void setup() {
Serial.begin(9600);
lockFlag = xSemaphoreCreateBinary();
xSemaphoreGive(lockFlag);
xTaskCreate(taskA,
// Task function
"taskA",
// Task name
1024,
// Stack size
NULL,
1,
// Priority
&task1);
xTaskCreate(taskB,
// Task function
"taskB",
// Task name
1024,
// Stack size
NULL,
3,
// Priority
&task2);
xTaskCreate(taskC,
// Task function
"taskC",
// Task name
1024,
// Stack size
NULL,
2,
// Priority
&task3);
}
void loop() {
vTaskDelete(NULL);
}
/*
* taskA
*/
void taskA(void *pvParameters) {
(void)pvParameters;
pinMode(LED1, OUTPUT);
boolean stat = false;
for (;;) {
int counter = 0;
xSemaphoreTake(lockFlag, portMAX_DELAY);
while (counter < 10) {
stat = !stat;
digitalWrite(LED1, stat);
counter++;
Serial.print("TaskA ");
Serial.println(uxTaskPriorityGet(task1));
vTaskDelay(1000);
}
xSemaphoreGive(lockFlag);
vTaskDelay(100);
}
}
/*
* task
*/
void taskB(void *pvParameters) {
(void)pvParameters;
pinMode(LED1, OUTPUT);
boolean stat = false;
for (;;) {
int counter = 0;
xSemaphoreTake(lockFlag, portMAX_DELAY);
while (counter < 10) {
stat = !stat;
digitalWrite(LED1, stat);
counter++;
Serial.print("TaskB ");
Serial.println(uxTaskPriorityGet(task2));
vTaskDelay(200);
}
xSemaphoreGive(lockFlag);
vTaskDelay(100);
}
}
/*
* taskC
*/
void taskC(void *pvParameters) {
(void)pvParameters;
pinMode(LED2, OUTPUT);
boolean stat = false;
for (;;) {
stat = !stat;
digitalWrite(LED2, stat);
vTaskDelay(100);
}
}
b) Akses Resource Dengan Lock Mutex
1. Melakukan upload program listing 2 berikut ini.
Listing 2 :
#define LED1 12
#define LED2 13
SemaphoreHandle_t lockMutex;
TaskHandle_t task1, task2, task3;
void setup() {
Serial.begin(9600);
//lockFlag = xSemaphoreCreateBinary();
lockMutex = xSemaphoreCreateMutex();
xSemaphoreGive(lockMutex);
xTaskCreate(taskA,
// Task function
"taskA",
// Task name
1024,
// Stack size
NULL,
1,
// Priority
&task1);
xTaskCreate(taskC,
// Task function
"taskC",
// Task name
1024,
// Stack size
NULL,
2,
// Priority
&task3);
xTaskCreate(taskB,
// Task function
"taskB",
// Task name
1024,
// Stack size
NULL,
3,
// Priority
&task2);
}
void loop() {
vTaskDelete(NULL);
}
/*
* taskA
*/
void taskA(void *pvParameters) {
(void)pvParameters;
pinMode(LED1, OUTPUT);
boolean stat = false;
for (;;) {
int counter = 0;
xSemaphoreTake(lockMutex, portMAX_DELAY);
while (counter < 10) {
stat = !stat;
digitalWrite(LED1, stat);
counter++;
Serial.print("TaskA ");
Serial.println(uxTaskPriorityGet(task1));
vTaskDelay(1000);
}
xSemaphoreGive(lockMutex);
vTaskDelay(1000);
}
}
/*
* task
*/
void taskB(void *pvParameters) {
(void)pvParameters;
pinMode(LED1, OUTPUT);
boolean stat = false;
for (;;) {
int counter = 0;
xSemaphoreTake(lockMutex, portMAX_DELAY);
while (counter < 10) {
stat = !stat;
digitalWrite(LED1, stat);
counter++;
Serial.print("TaskB ");
Serial.println(uxTaskPriorityGet(task2));
vTaskDelay(200);
}
xSemaphoreGive(lockMutex);
vTaskDelay(100);
}
}
/*
* taskC
*/
void taskC(void *pvParameters) {
(void)pvParameters;
pinMode(LED2, OUTPUT);
boolean stat = false;
for (;;) {
stat = !stat;
digitalWrite(LED2, stat);
vTaskDelay(500);
}
}
D. HASIL DAN PEMBAHASAN
a) Akses Resource Dengan Lock Semaphore Binary
Melakukan analisa a hasil tampilan di terminal Serial, dan bandingkan dengan listing
yang kedua
Tampilan pada serial Monitor :
Tampilan pada device :
b) Akses Resource Dengan Lock Mutex
Membandingkan hasil dengan listing 1.
Tampilan Serial Monitor :
Tampilan pada device :
Hasil Perbandingan dan Analisa :
Hasil analisis dari kedua program tersebut memiliki perbedaan output dari terminal
serial yang akan mencerminkan interaksi antar tugas, dan perbandingan prioritas dapat
diamati dari output yang dicetak di terminal serial. Program Listing 2 menunjukkan
hasil yang lebih teratur dan dapat diprediksi karena penggunaan mutex untuk
mengkoordinasikan akses bersama, sementara Program Listing 1 mungkin lebih rentan
terhadap situasi bertabrakan dan konflik saat mengakses sumber daya.
E. LATIHAN
1. Tambahkan mutex untuk taskC untuk mengakses ke terminal serial dan perhatikan
hasilnya. (Lihat taskA dan taskB untuk mutexnya)
Kode Program :
#define LED1 12
#define LED2 13
SemaphoreHandle_t lockMutex;
TaskHandle_t task1, task2, task3;
void setup() {
Serial.begin(9600);
lockMutex = xSemaphoreCreateMutex();
xSemaphoreGive(lockMutex);
xTaskCreate(taskA, "taskA", 1024, NULL, 1, &task1);
xTaskCreate(taskC, "taskC", 1024, NULL, 2, &task3);
xTaskCreate(taskB, "taskB", 1024, NULL, 3, &task2);
}
void loop() {
vTaskDelete(NULL);
}
void taskA(void *pvParameters) {
(void)pvParameters;
pinMode(LED1, OUTPUT);
boolean stat = false;
for (;;) {
int counter = 0;
xSemaphoreTake(lockMutex, portMAX_DELAY);
while (counter < 10) {
stat = !stat;
digitalWrite(LED1, stat);
counter++;
Serial.print("TaskA ");
Serial.println(uxTaskPriorityGet(task1));
vTaskDelay(1000);
}
xSemaphoreGive(lockMutex);
vTaskDelay(1000);
}
}
void taskB(void *pvParameters) {
(void)pvParameters;
pinMode(LED1, OUTPUT);
boolean stat = false;
for (;;) {
int counter = 0;
xSemaphoreTake(lockMutex, portMAX_DELAY);
while (counter < 10) {
stat = !stat;
digitalWrite(LED1, stat);
counter++;
Serial.print("TaskB ");
Serial.println(uxTaskPriorityGet(task2));
vTaskDelay(200);
}
xSemaphoreGive(lockMutex);
vTaskDelay(100);
}
}
void taskC(void *pvParameters) {
(void)pvParameters;
pinMode(LED2, OUTPUT);
boolean stat = false;
for (;;) {
xSemaphoreTake(lockMutex, portMAX_DELAY);
stat = !stat;
digitalWrite(LED2, stat);
Serial.print("TaskC ");
Serial.println(uxTaskPriorityGet(task3));
xSemaphoreGive(lockMutex);
vTaskDelay(500);
}
}
Tampilan pada Serial Monitor :
Tampilan pada device :
Hasil output dari terminal serial akan menampilkan urutan dan waktu akses setiap tugas
ke sumber daya bersama, serta menampilkan prioritas masing-masing tugas. Dengan
penambahan taskC, output yang dihasilkan akan menunjukkan bahwa taskA, taskB,
dan taskC secara bergantian akan mengakses dan memanipulasi pin LED yang terkunci
oleh mutex.
F. TUGAS
Buat diagram pewaktuan untuk task dari mulai dibuat sampai dua siklus.
TaskA mengganti status LED1 setiap detik selama 1 detik
TaskB mengganti status LED1 setiap 200 milidetik selama 2 detik (200ms per detik).
TaskC mengganti status LED2 setiap 500 milidetik selama 500 milidetik.
Pada siklus 1 dan 2, TaskA dan TaskB bersaing untuk mengakses LED1 menggunakan
lockMutex. TaskC berdiri sendiri dan mengakses LED2 tanpa bersaing dengan tugas lain.
G. KESIMPULAN
Pada praktikum pertemuan ini didapatkan pemahaman mengenai konsep dasar mutex,
bagaimana mutex bekerja sebagai mekanisme untuk menghindari race condition dan
konflik akses pada sumber daya bersama. Melalui implementasi lock dan unlock
menggunakan mutex, praktikan dapat mengaplikasikan prinsip-prinsip tersebut dalam
pengembangan perangkat lunak yang melibatkan task-task.
Download