Berpikir seperti insinyur sistem real-time: perbedaan hard dan soft deadline, determinism dan jitter, estimasi WCET, analisis penjadwalan Rate-Monotonic, latensi interrupt, serta desain firmware yang merespons tepat waktu dalam semua kondisi.

Setelah di episode 15 kita menulis firmware Rust, pada episode ini kita kembali ke filosofi paling mendasar embedded: waktu. Bukan "secepat mungkin" — melainkan tepat waktu, selalu, dalam kondisi apa pun. Ini yang membedakan sistem real-time dari sekadar program.
Mengapa ini penting? Coba bayangkan airbag mobil: dari sensor tabrakan hingga airbag mengembang, tenggatnya milidetik, dan keterlambatan berarti nyawa. Motor, robot, telekomunikasi, medis — semua butuh jaminan waktu. Di episode ini kalian belajar memikirkan deadline, determinism, dan bagaimana menganalisisnya sebelum kode ditulis.
Sistem real-time bukan "sistem yang cepat" — melainkan sistem yang benar dari sisi waktu: hasil harus datang sebelum deadline. Ada dua kelas:
| Kelas | Deadline dilanggar | Contoh |
|---|---|---|
| Hard real-time | Bencana / sistem gagal | Airbag, flight control, pembangkit |
| Soft real-time | Kualitas menurun, tidak fatal | Audio/video, antarmuka pengguna |
Perluasan lain: firm real-time (menengah). Prinsip penentu: seberapa mahal pelanggaran deadline.
Konsep terkait:
Latency : waktu dari event ke reaksi pertama
Throughput : jumlah pekerjaan per satuan waktu
Jitter : deviasi latency antar eksekusiAnda tidak bisa menjamin deadline tanpa tahu berapa lama task bisa berjalan. WCET (Worst-Case Execution Time) adalah batas atas durasi eksekusi sebuah task — diukur atau dianalisis untuk input terburuk:
mulai = timer_now()
fungsi_tugas()
durasi = timer_now() - mulai
// ulangi ribuan kali + variasi input -> dapat distribusi
// WCET ≈ maksimum yang terukur + marginYang sering dilupakan: WCET bukan rata-rata. Loop dengan kondisi terburuk, cache miss, dan interrupt preempt menambah waktu. Estimasi yang terlalu optimis = deadline dilewati di lapangan.
Untuk sistem multitasking (RTOS dari episode 7), kita perlu membuktikan semua task memenuhi deadline. Dua pendekatan klasik:
Prioritas tetap: task dengan periode lebih pendek dapat prioritas lebih tinggi. Analisis utilisasi sederhana untuk n task periodik: jika utilisasi total U = Σ (C_i / T_i) kurang dari n(2^(1/n) - 1), semua task terjamin memenuhi deadline.
Task dengan deadline terdekat jalan duluan. Optimal secara teori, tapi kompleks di implementasi embedded.
Task A: periode 10 ms, WCET 2 ms -> util 0.2
Task B: periode 20 ms, WCET 3 ms -> util 0.15
Total util = 0.35 < 0.69 (batas 2 task) -> amanBatas RM untuk 2 task adalah 2·(√2 − 1) ≈ 0.83 — aman di 0.35, dengan margin sehat. Formula ini bisa dihitung cepat di awal desain.
Interrupt (episode 6) adalah jalur respons tercepat — jaga tetap pendek:
1. Jaga ISR minimal (set flag / data siap)
2. Kerja berat di task berprioritas sesuai deadline
3. Hindari blocking pada jalur kritis
4. Ukur latency interrupt dan jitter secara berkalaTask dengan deadline ketat tidak boleh menunggu lama di mutex, queue kosong, atau I/O lambat. Gunakan timeout, bukan portMAX_DELAY tak terbatas:
if (xSemaphoreTake(mutex, pdMS_TO_TICKS(5)) == pdTRUE) {
// aman: dapat mutex
} else {
// timeout: jalankan jalur alternatif / laporkan
}Determinism dirusak oleh: alokasi dinamis (episode 8), cache policies yang tidak terkontrol, dan prioritas yang sering berubah. Desain yang baik menghapus variabilitas, bukan mengkompensasinya.
Important
Sistem hard real-time tidak boleh menggunakan alokasi dinamis (malloc/pvPortMalloc) di jalur kritis: alokasi bisa gagal dan lamanya tidak deterministik. Alokasikan semua buffer di inisialisasi, atau pakai pool statis. Inilah alasan mengapa "no malloc" adalah aturan emas firmware produksi.
Analisis sebuah task yang sering ditemui — sampling ADC + kontrol PWM:
Periode : 1 ms (1000 Hz)
WCET sampl : 150 us (ADC + filter)
WCET compute: 400 us (PID + output)
Deadline : 900 us (margin 100 us)
Utilisasi = (150+400)/1000 = 0.55
Latency interrupt target: < 50 us
Jitter target : < 100 usLangkah verifikasi: ukur latency interrupt nyata (oscilloscope/GPIO toggle), ukur WCET task, konfirmasi utilisasi di bawah batas analisis, lalu jalankan stress test (interrupt banjir + workload maksimal).
Inti yang harus dibawa pulang:
Di episode 17 selanjutnya kita menata penyimpanan: Storage & Filesystem — flash memory, LittleFS dan FAT, wear leveling, serta desain firmware yang menyimpan data dengan aman dan tahan terhadap putusnya listrik. Data kalian akan bertahan!