---
# System prepended metadata

title: IOT_TP_Modul3

---

---
title: TP Modul 3
---
# TP Modul 3

Pembuat : WN

Nama  : Salim
NPM   : 2306204604

**JAWABAN TANPA REFERENSI YANG SESUAI DIANGGAP MENDAPATKAN 0 POIN (UNLESS SPECIFIED OTHERWISE)**

1. **Jelaskan** mengenai Static Memory, Stack, dan Heap dengan menjelaskan kapan setiapnya digunakan. Serta jelaskan masalah yang berpotensi muncul dari sisi manajemen memory di setiap jenis tipe alokasi memory tersebut (20 poin).
Static memory adalah memori yang digunakan untuk mengalokasikan variabel global dan static. Stack digunakan untuk mengalokasikan variabel local secara otomatis. Heap digunakan untuk mengalokasikan variabel secara dinamis.
Static memory memiliki potensi masalah seperti ukurannya harus ditentukan saat compile dan tidak dapat ditentukan pada saat runtime. Stack memiliki potensi masalah yaitu variabel tersimpan secara local. Heap memiliki potensi masalah memory leak dan juga fragmentasi pada memori.
**Referensi:**
- [1]“FreeRTOS Memory Management,” Digikey.com, 2021. https://www.digikey.com/en/maker/projects/introduction-to-rtos-solution-to-part-4-memory-management/6d4dfcaa1ff84f57a2098da8e6401d9c
- [2]“Static Vs Dynamic Memory Allocation - FreeRTOSTM,” Freertos.org, 2024. https://www.freertos.org/Documentation/02-Kernel/02-Kernel-features/09-Memory-management/03-Static-vs-Dynamic-memory-allocation
‌
2. **Jelaskan** secara singkat poin-poin manajemen heap pada FreeRTOS (heap_1 hingga heap_5). Menurut anda, faktor apa yang diperhatikan dalam pemilihan jenis manajemen? (10 poin)
- heap_1 : Pada heap_1, memory yang telah dialokasikan tidak dapat dibebaskan
- heap_2 : Pada heap_2, memory yang dialokasikan dapat dibebaskan, akan tetapi beberapa blok memori bebas yang berdeketan tidak disatukan menjadi satu blok memori yang besar
- heap_3 : Heap_3 membuat fungsi malloc() dan free() aman untuk digunakan dalam thread
- heap_4 : Heap_4 mirip dengan heap_2 akan tetapi pada heap_4, beberapa blok memori bebas yang berdeketan disatukan menjadi satu blok memori yang besar
- heap_5 : Heap_5 sama dengan heap_4 dengan tambahan heap_5 juga dapat menyatukan blok memori yang tidak berdekatan

Faktor yang diperhatikan dalam jenis manajemen adalah jenis aplikasi yang dibuat. Aplikasi yang sederhana dapat menggunakan heap_1 karena simpel. Terdapat juga beberapa aplikasi yang menggunakan jenis heap yang lain untuk memaksimalkan pengalokasian memori sesuai penggunaan aplikasi.

**Referensi:**
- [3]freertos, “FreeRTOS heap memory management - FreeRTOSTM,” Freertos.org, 2024. https://www.freertos.org/Documentation/02-Kernel/02-Kernel-features/09-Memory-management/01-Memory-management
- [4]“Static Vs Dynamic Memory Allocation - FreeRTOSTM,” Freertos.org, 2024. https://www.freertos.org/Documentation/02-Kernel/02-Kernel-features/09-Memory-management/03-Static-vs-Dynamic-memory-allocation

3. **Jelaskan** mengenai Queue pada FreeRTOS. Masalah apa yang dapat diselesaikan dengan penggunaan queue dalam transfer data antar task? (20 poin)
Queue adalah sebuah objek yang digunakan dalam komunikasi antar task. Queue bekerja dengan mengirimkan data dengan metode FIFO (First In First Out). Masalah yang diselesaikan dengan penggunaan queue dalam transfer data antar task adalah mencegah berbagai task mengisi memori yang sama bersamaan sehingga menyebabkan race condition.

**Referensi:**
- [5]FreeRTOS, “FreeRTOS queues - FreeRTOSTM,” Freertos.org, 2024. https://www.freertos.org/Documentation/02-Kernel/02-Kernel-features/02-Queues-mutexes-and-semaphores/01-Queues
- [6]ShawnHymel, “Introduction to RTOS - Solution to Part 5 (FreeRTOS Queue Example),” DigiKey, Feb. 08, 2021. https://www.digikey.com/en/maker/projects/introduction-to-rtos-solution-to-part-5-freertos-queue-example/72d2b361f7b94e0691d947c7c29a03c9
‌‌
4. Carilah use case lain dari Queue, lalu **jelaskan** manfaat yang diperoleh dari penggunaan queue pada kasus tersebut! (10 poin)
Use case lain dari queue adalah ketika memori yang digunakan terbatas pada suatu lokasi memori tertentu. manfaat yang didapat adalah dengan penggunaan queue, data dari queue hanya dapat diakses dengan RTOS dengan privilege penuh.

**Referensi:**
- [7]FreeRTOS, “FreeRTOS queues - FreeRTOSTM,” Freertos.org, 2024. https://www.freertos.org/Documentation/02-Kernel/02-Kernel-features/02-Queues-mutexes-and-semaphores/01-Queues
- [8]ShawnHymel, “Introduction to RTOS - Solution to Part 5 (FreeRTOS Queue Example),” DigiKey, Feb. 08, 2021. https://www.digikey.com/en/maker/projects/introduction-to-rtos-solution-to-part-5-freertos-queue-example/72d2b361f7b94e0691d947c7c29a03c9
5. Buatlah program yang terdiri dari 2 buah task untuk melakukan transfer data. Data yang dikirimkan adalah struct dengan 2 buah atribut, yaitu [string] pesan dan [boolean] mengandung_angka.

   Task pertama akan membaca input serial dan menyimpannya dalam atribut pesan dari struct. Task tersebut juga akan menentukan apakah string tersebut mengandung angka dan memasukkan nilai true bila string mengandung angka dan false bila string tidak mengandung angka pada atribut mengandung_angka dari struct.

   Pengiriman data dilakukan menggunakan queue dengan ukuran queue didasarkan dari angka terakhir NPM anda (bila angka terakhir adalah 0 atau 1, maka ukuran queue adalah 10). **Gunakan pass by reference dalam mengirimkan data melalui queue!**

   **BERIKAN ANALISIS KODE BERUPA PENJELASAN PENGGUNAAN FUNCTION DARI API QUEUE FREERTOS (UNTUK MEMBUAT QUEUE SERTA MENGIRIMKAN DAN MENERIMA DATA DARI QUEUE)** (40 poin)
Kode berjalan dengan membuat queue terlebih dahulu dengan ukurun queue 4. Setelah itu, task input memasukan nilai dari input ke dalam struct yang akan dikirimkan. Kemudian, data dikirimkan dengan menggunakan queue yang telah dibuat. Terakhir, task output menggunakan data pada queue, setelah selesai digunakan data akan di free.
```cpp=
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

TaskHandle_t xInputTaskHandle  = NULL;
TaskHandle_t xOutputTaskHandle  = NULL;

typedef struct Data_t {
  String pesan;
  bool mengandung_angka;
}Data_t;

static QueueHandle_t queue;

static const uint32_t INPUT_PERIOD_MS = 500;
static const uint32_t OUTPUT_PERIOD_MS = 500;

static bool isInteger(const String& s) {
  if (s.length() == 0) return false;

  for (int i = 0; i < s.length() - 1; i++) {
    char ch = s.charAt(i);
    if (ch < '0' || ch > '9') {
      if (i == 0 && (ch == '+' || ch == '-')) {
        continue;
      }
      
      return false;
    }
  }
  return true;
}

void vInputTask(void* pv) {
  String pesan;
  bool mengandung_angka;
  Serial.setTimeout(5);

  const TickType_t FreqInput = pdMS_TO_TICKS(INPUT_PERIOD_MS);
  TickType_t LastTick = xTaskGetTickCount();

  while (true) {
    if (Serial.available() > 0 )
    {
      pesan = Serial.readString();
    }

    if (pesan.length() == 0)
    {
      continue;
    }

    Data_t *data = (Data_t *) pvPortMalloc(sizeof(Data_t));
    if (data == NULL) {
      Serial.println("Error: Malloc failed!");
      continue;
    }
    data->pesan = pesan;
    data->mengandung_angka = isInteger(pesan);
    xQueueSend(queue, &data, portMAX_DELAY);

    pesan = "";
    
    vTaskDelayUntil(&LastTick, FreqInput);
  }
}

void vOutputTask(void* pv) {
  Data_t *data = NULL;
  
  Serial.setTimeout(5);

  const TickType_t FreqOutput = pdMS_TO_TICKS(OUTPUT_PERIOD_MS);
  TickType_t LastTick = xTaskGetTickCount();

  while(true) {
    if (xQueueReceive(queue, &data, portMAX_DELAY) == pdPASS) {
      Serial.print("Pesan diterima: ");
      Serial.println(data->pesan);
      Serial.print("Mengandung angka? ");
      Serial.println(data->mengandung_angka ? "YA" : "TIDAK");
      vPortFree(data);
    }

    vTaskDelayUntil(&LastTick, FreqOutput);
  }
}

void setup() {
  Serial.begin(115200);
  delay(100);

  const UBaseType_t PRIO_INPUT    = 3;
  const UBaseType_t PRIO_OUTPUT = 2;

  const uint32_t STACK_WORDS = 8192;

  queue = xQueueCreate(4, sizeof(Data_t *));
  
  if (queue != NULL) {
    xTaskCreate(
      vInputTask,
      "Input",
      STACK_WORDS,
      NULL,
      PRIO_INPUT,
      &xInputTaskHandle
    );

    xTaskCreate(
      vOutputTask,
      "Output",
      STACK_WORDS,
      NULL,
      PRIO_OUTPUT,
      &xOutputTaskHandle
    );
  } else {
    Serial.println("Error: Queue creation failed!");
  }

}

void loop() {

}
```

6. Jelaskan apa passion anda, dan hal apa yang membuat anda terus kembali pada passion tersebut (0 Poin)
Tidak ada