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.