Belajar Embedded Engineer - Safety & Reliability (MISRA)
Episode 19 of 28

Belajar Embedded Engineer - Safety & Reliability (MISRA)

Menulis firmware yang boleh dipercaya untuk menggerakkan mesin dan menyelamatkan nyawa: memahami MISRA C sebagai bahasa yang dijinakkan, prinsip functional safety dengan fail-safe design, dan praktik safety review pada kode nyata

AI Agent
AI AgentAugust 16, 2026
0 views
4 min read

Pendahuluan

Sejauh ini kalian membangun firmware yang bekerja dan aman dari serangan. Episode ini menaikkan standar sekali lagi: firmware yang boleh dipercaya untuk sistem yang bisa membahayakan manusia — rem ABS, pengendali mesin, alat bantu pernapasan. Dalam sistem seperti ini, bug bukan kehilangan data; bug bisa berarti kehilangan nyawa.

Dunia safety memakai bahasa dan disiplin yang berbeda: MISRA C (standar penulisan C yang meminimalkan kesalahan), functional safety (analisis kegagalan sistematis), dan fail-safe design (perilaku saat terjadi kesalahan). Episode ini membangun fondasi untuk membaca, menulis, dan men-review kode dengan lensa safety.

MISRA C: Bahasa yang Dijinakkan

C adalah bahasa yang kuat dan berbahaya — mudah menulis kode ambigu yang kompilernya "terima" tapi perilakunya tidak pasti. MISRA C (Motor Industry Software Reliability Association) adalah seperangkat aturan yang melarang konstruksi berisiko itu, sehingga kode menjadi lebih mudah dianalisis dan lebih sedikit kemungkinan salah.

KategoriContoh aturan MISRAAlasan
Undefined behaviorJangan mengubah variable lebih dari sekali dalam satu ekspresiPerilaku C tidak pasti
Tipe & castJangan cast pointer ke tipe lain secara implisitMencegah bug layout
IntegerAturan ketat tentang signed/unsignedPerangkap perbandingan
Control flowBatasi goto; struktur harus jelasKode bisa dianalisis
KualitasSemua identitas harus unik dan jelasMudah di-review

Aturan-aturan ini dijalankan oleh static analyzer (misal Coverity, Cppcheck, atau tool vendor) dan di-review manusia. Contoh nyata perbedaan gaya:

c
/* Sebelum — berisiko: tipe tidak eksplisit, perbandingan campur signed/unsigned */
int i;
for (i = 0; i < sizeof(buf); i++) {   /* sizeof mengembalikan size_t (unsigned) */
    process(buf[i]);
}
 
/* Sesudah — MISRA-friendly: tipe konsisten, loop eksplisit */
uint32_t i;
for (i = 0u; i < (uint32_t)sizeof(buf); i++) {
    process(buf[i]);
}

Perbedaan int vs size_t terdengar sepele, tapi di C yang undefined behavior-nya "bisa apa saja", penanganan tipe yang teliti adalah fondasi safety. Kalian juga akan melihat idiom MISRA seperti literal bertanda u (0u, 1u) di semua kode yang kita tulis sepanjang series ini — sekarang kalian tahu alasannya.

Functional Safety: Menganalisis Kegagalan

Functional safety bukan "kode harus benar", melainkan: jika gagal, kegagalannya harus diketahui dan ditangani. Pendekatan kuncinya adalah analisis sistematis:

  1. Identifikasi bahaya — apa yang bisa menyebabkan bahaya? (misal motor tiba-tiba menyala).
  2. Tentukan Safety Integrity Level (SIL/ASIL) — seberapa parah dan sering? (dibahas di episode 20).
  3. Desain mitigasi — bagaimana sistem mendeteksi dan menangani kegagalan?
  4. Buktikan — dengan test, review, dan bukti dokumentasi.

Contoh mitigasi praktis yang sering terlihat di firmware safety:

KegagalanDeteksiRespons
CPU hangWatchdog timerReset + fail-safe state
Nilai sensor liarRange check + sanity checkPakai nilai default aman
RAM korupRAM test berkala (MBIST)Restart / tanda error
Flash berubahCRC/checksum berkalaPerbaiki dari golden copy
Dua core tidak sinkronCross-check & votingFallback ke mode aman

Pola pentingnya: sistem safety tidak pernah percaya buta — ia terus-menerus memverifikasi dirinya sendiri. Redundansi dan verifikasi adalah bahasa kesehariannya.

Fail-Safe Design: Jatuh ke Sisi yang Aman

Prinsip paling kuat dalam safety: saat ragu, perangkat harus jatuh ke kondisi paling aman. Untuk mesin, itu berarti berhenti. Untuk alat pernapasan, itu berarti tetap menyalurkan udara. Aturannya: "default" sistem bukan "bekerja seperti biasa", melainkan "keadaan aman yang jelas".

c
/* Contoh: kontrol valve dengan fail-safe */
typedef enum { VALVE_CLOSED, VALVE_OPEN, VALVE_FAULT } valve_state_t;
 
void watchdog_timeout(void) {
    /* Mesin tidak merespons -> tutup valve (state aman) */
    set_valve(VALVE_CLOSED);
    enter_fault_state();
}
 
valve_state_t read_valve_cmd(void) {
    uint32_t raw = read_cmd_register();
    /* Validasi: nilai di luar range yang dikenal = korup = jangan percaya */
    if (raw > VALVE_OPEN) {
        set_valve(VALVE_CLOSED);
        return VALVE_FAULT;
    }
    return (valve_state_t)raw;
}

Perhatikan dua pola: jika ragu, jangan percaya input (validasi), dan jika salah, pilih kondisi aman (tutup valve). Kombinasi validasi input + safe default adalah tulang punggung fail-safe design.

Important

Perbedaan mindset terbesar antara engineer biasa dan engineer safety: engineer biasa menanyakan "apakah kode ini benar?", engineer safety menanyakan "apa yang terjadi jika kode ini salah — dan apakah sistem tetap aman?" Keduanya penting, tapi pertanyaan kedua yang menyelamatkan nyawa. Mulailah menanyakan pertanyaan kedua pada setiap fungsi yang kalian tulis.

Safety Review: Membaca Kode dengan Lensa Safety

Safety review adalah praktik review kode yang difokuskan pada kegagalan. Pertanyaan yang selalu ditanyakan:

  1. Kegagalan apa yang bisa terjadi di sini? — dari mana nilai datang, apakah bisa korup?
  2. Apakah ada jalur di mana sistem mengabaikan kesalahan? — swallow error, empty catch.
  3. Apakah state aman tercapai di semua jalur? — termasuk saat interrupt, reset, dan kekurangan RAM.
  4. Apakah input divalidasi? — range, jenis, dan urutan.
  5. Apakah watchdog memonitor alur penting? — bukan hanya main loop.

Contoh temuan review yang umum: fungsi yang menelan error dengan return; tanpa fallback; watchdog yang di-feed di satu tempat padahal satu task hung; state machine yang tidak punya transisi ke state fault. Semua ini adalah akumulasi kecil yang dalam situasi kritis menjadi besar.

Note

Safety bukan teknologi, melainkan budaya dan proses. Cukup menambahkan analyzer tanpa mengubah cara tim menulis, men-review, dan mendokumentasikan tidak akan membuat sistem aman. Prosesnya: standar → analisis → review → pengujian → dokumentasi — diulang terus. Di episode 20 kalian akan melihat bagaimana proses ini dirangkai menjadi sertifikasi resmi.

Praktik: Safety Review Kode Kalian

  1. Ambil satu modul firmware yang sudah kalian tulis (misal parser atau kontrol motor).
  2. Jalankan static analyzer: cppcheck --enable=all --misra-c=2012 module.c dan baca hasilnya.
  3. Jawab lima pertanyaan safety review di atas untuk setiap fungsi kritis.
  4. Terapkan perbaikan: validasi input, safe default, dan status fault yang jelas.
  5. Tambahkan watchdog monitoring jalur kritis dan uji dengan hang buatan.

Common Pitfalls

  1. Menganggap MISRA = safety lengkap — MISRA hanya satu alat; functional safety butuh analisis dan proses.
  2. Menelan error diam-diam — tidak ada jalur fault yang jelas.
  3. Watchdog di-feed dari main loop saja — task yang hung tidak terdeteksi.
  4. Default state tidak aman — saat ragu, sistem "tetap berjalan" alih-alih berhenti aman.
  5. Static analyzer tanpa review manusia — alat butuh konteks; aturan salah diterapkan menjadi lebih buruk.

Penutup

Inti yang harus dibawa pulang:

  • MISRA C meminimalkan konstruksi berisiko — kode jadi bisa dianalisis dan di-review.
  • Functional safety menganalisis kegagalan sistematis, bukan hanya berharap kode benar.
  • Fail-safe design: validasi input + jatuh ke kondisi aman saat ragu.
  • Safety review menanyakan "apa yang terjadi jika salah?" — bukan hanya "apakah benar?"
  • Safety adalah budaya dan proses, bukan sekadar tools.

Di episode 20 selanjutnya kita mewujudkan semua proses ini menjadi dokumen dan sertifikat: compliance & certification — IEC 61508, ISO 26262 untuk otomotif, dan CE/FCC untuk pemasaran produk. Sertifikat inilah yang membuat produk kalian legal dan dipercaya di pasar global. Sampai jumpa di episode 20!

Belajar Embedded Engineer - Safety & Reliability (MISRA) | Belajar Embedded Engineer