Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial Internet of Things >> Tertanam

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:

Union C Tertanam Dijelaskan: Berbagi Memori Efisien & Pesan

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).

Union C Tertanam Dijelaskan: Berbagi Memori Efisien & Pesan

Gambar 2

Union C Tertanam Dijelaskan: Berbagi Memori Efisien & Pesan

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.

Tertanam

  1. Memilih Bahasa Pemrograman Ideal untuk Solusi IoT Industri
  2. Dasar-Dasar Pemrograman Mikroprosesor
  3. Memanfaatkan Data di Internet of Reliability: Strategi untuk Manajemen yang Efektif
  4. Membumikan Internet of Things: Satelit IoT Generasi Berikutnya Menyediakan Konektivitas Universal dan Terjangkau
  5. Temukan 9 Bahasa Pemrograman yang Harus Dipelajari Tahun 2021
  6. Union C Dijelaskan: Manajemen Memori Efisien untuk Beberapa Tipe Data
  7. Masa Depan Data Center: Tren, Teknologi, dan Keberlanjutan
  8. Memanfaatkan Kekuatan Cloud untuk IoT: Membuka Konektivitas dan Wawasan Data yang Mulus
  9. Memahami Pemrograman Robot: Metode yang Dijelaskan
  10. Satuan Kompresor Master: Panduan Jelas tentang Satuan Pengukuran Umum