Union C Tertanam Dijelaskan: Berbagi Memori Efisien & Pesan
Memahami Union dalam C Tertanam
Dalam sistem tertanam, union adalah struktur data yang kuat yang memungkinkan Anda menyimpan tipe data berbeda di lokasi memori yang sama. Artikel ini membahas dasar-dasar union, menunjukkan contoh praktis, dan menjelaskan mengapa mereka adalah alat andal untuk aplikasi yang terbatas memori dan sensitif bandwidth.
Perbedaan antara Struktur dan Union dalam C Tertanam
Sebelumnya, kami telah membahas struktur: cara untuk mengelompokkan variabel heterogen ke dalam satu entitas. Dalam C, union adalah konstruksi komplementer yang juga mengelompokkan tipe berbeda, tetapi dengan perbedaan kunci—setiap anggota berbagi alamat memori yang sama.
Contoh Pengantar
Mendeklarasikan union hampir sama dengan mendeklarasikan struktur; Anda hanya mengganti struct dengan union:
union test { uint8_t c; uint32_t i; };
Template mendefinisikan dua anggota: c menempati satu byte, dan i menempati empat byte. Untuk membuat variabel dari tipe ini:
union test u1;
Mengakses anggota menggunakan operator titik:
u1.i = 10; m = u1.c; // m harus uint8_t
Karena ukuran penyimpanan union sama dengan ukuran anggota terbesarnya, u1 menempati empat byte. Menulis ke i menimpa memori yang sama yang akan digunakan oleh c, sehingga kedua anggota saling eksklusif.
Apakah Kita Perlu Ruang Memori Bersama?
Bayangkan dua perangkat tertanam, Perangkat A dan Perangkat B, yang bertukar data status, kecepatan, dan posisi (lihat Gambar 1). Item data dan ukurannya adalah:

Gambar 1
| Variabel | Ukuran (byte) | Arti |
| power | 1 | Isi daya baterai |
| op_mode | 1 | Mode operasi |
| temp | 1 | Suhu lingkungan |
| x_pos | 2 | Koordinat X |
| y_pos | 2 | Koordinat Y |
| vel | 2 | Kecepatan |
Jika Perangkat B memerlukan setiap informasi, struktur sederhana membutuhkan sembilan byte, dan setiap putaran komunikasi akan mentransfer frame 9-byte (lihat Gambar 2). Namun, dalam banyak skenario dunia nyata, tiga jenis pesan saling eksklusif: kadang hanya status, kadang hanya posisi, kadang hanya kecepatan. Dalam hal itu, payload terbesar adalah empat byte (pesan posisi). Union yang berbagi buffer empat byte dapat menampung salah satu dari tiga pesan, mengurangi ukuran frame dari sembilan menjadi empat byte (lihat Gambar 3).

Gambar 2

Gambar 3
Menggunakan Union untuk Paket Pesan
Di bawah ini kami membuat dua struktur—satu untuk status dan satu untuk posisi—dan menyematkannya dalam union bersama dengan bidang kecepatan:
struct status_s { uint8_t power; uint8_t op_mode; uint8_t temp; }; struct position_s { uint16_t x_pos; uint16_t y_pos; }; union msg_union { struct status_s status; struct position_s position; uint16_t vel; };
Ukuran union adalah empat byte (ukuran position_s), yang dibagi bersama oleh ketiga jenis pesan.
Cara Mengetahui Anggota Union yang Aktif
Saat penerima membaca union, ia harus mengetahui anggota mana yang valid. Pola umum adalah union yang ditandai: bidang terpisah yang mencatat anggota aktif. Kami dapat menambahkan satu byte msg_type sebelum union:
struct message_s { uint8_t msg_type; // 's' = status, 'p' = position, 'v' = velocity union { struct status_s status; struct position_s position; uint16_t vel; } msg; };
Dengan mentransmisikan byte msg_type bersama dengan union, penerima dapat menafsirkan payload dengan benar tanpa pengetahuan sebelumnya tentang bentuknya.
Solusi Alternatif: Alokasi Memori Dinamis
Pendekatan lain adalah mengalokasikan memori secara spontan untuk setiap jenis pesan. Penerima akan mengatur msg_type dan mengalokasikan cukup byte untuk payload tersebut. Penerima kemudian akan menafsirkan data masuk berdasarkan msg_type dan membebaskan memori saat selesai. Meskipun ini dapat sedikit lebih efisien memori, alokasi dinamis menimbulkan overhead runtime dan kebutuhan untuk dealokasi eksplisit, yang mengapa banyak pengembang sistem tertanam lebih memilih strategi union statis.
Selanjutnya: Aplikasi Union
Union juga sering digunakan untuk mengekstrak bagian data yang lebih kecil dari kata yang lebih besar—teknik yang sangat berharga saat menguraikan protokol komunikasi atau register hardware. Tetap menunggu artikel selanjutnya dalam seri ini, di mana kami akan menyelami kasus penggunaan tersebut.
Untuk menjelajahi lebih banyak artikel tentang C tertanam, kunjungi indeks artikel.