Tertanam
Artikel ini memberikan beberapa informasi dasar tentang struktur dalam pemrograman C tertanam.
Setelah memperkenalkan struktur, kita akan melihat beberapa aplikasi penting dari objek data yang kuat ini. Kemudian, kita akan memeriksa sintaks bahasa C untuk mendeklarasikan sebuah struktur. Terakhir, kami akan memperkenalkan persyaratan penyelarasan data secara singkat. Kita akan melihat bahwa kita mungkin dapat mengurangi ukuran struktur hanya dengan mengatur ulang urutan anggotanya.
Sejumlah variabel dari jenis yang sama yang secara logis terkait satu sama lain dapat dikelompokkan sebagai array. Bekerja pada kelompok daripada kumpulan variabel independen memungkinkan kita untuk mengatur data dan menggunakannya dengan lebih nyaman. Misalnya, kita dapat mendefinisikan larik berikut untuk menyimpan 50 sampel terakhir dari ADC yang mendigitalkan input suara:
suara uint16_t[50];
Perhatikan bahwa uint16_t adalah tipe integer tidak bertanda dengan lebar tepat 16 bit. Ini didefinisikan dalam pustaka standar C stdint.h , yang menyediakan tipe data dengan panjang bit tertentu yang tidak bergantung pada spesifikasi sistem.
Array dapat digunakan untuk mengelompokkan sejumlah variabel yang bertipe data sama. Bagaimana jika ada hubungan antar variabel berbeda tipe data? Bisakah kita memperlakukan variabel-variabel ini sebagai grup dalam program kita? Misalnya, asumsikan bahwa kita perlu menentukan laju pengambilan sampel ADC yang menghasilkan suara susunan di atas. Kita dapat mendefinisikan variabel float untuk menyimpan sample rate:
mengambang sample_rate;
Meskipun variabel suara dan sample_rate terkait satu sama lain, mereka didefinisikan sebagai dua variabel independen. Untuk mengaitkan kedua variabel ini satu sama lain, kita dapat menggunakan konstruksi data yang kuat dari bahasa C yang disebut struktur. Struktur memungkinkan kita untuk mengelompokkan tipe data yang berbeda dan menanganinya sebagai objek data tunggal. Sebuah struktur dapat mencakup berbagai jenis variabel seperti struktur lain, pointer ke fungsi, pointer ke struktur, dll. Untuk contoh suara, kita dapat menggunakan struktur berikut:
rekam struktur { uint16_t voice[50]; float sample_rate;};
Dalam hal ini, kami memiliki struktur yang disebut record yang memiliki dua anggota atau bidang yang berbeda:anggota pertama adalah larik uint16_t elemen, dan anggota kedua adalah variabel bertipe float. Sintaksnya dimulai dengan kata kunci struct . Kata setelah kata kunci struct adalah nama opsional yang digunakan untuk referensi struktur nanti. Kami akan membahas detail lain tentang mendefinisikan dan menggunakan struktur di sisa artikel.
Contoh di atas menunjukkan aplikasi penting dari struktur, yaitu, mendefinisikan objek data yang bergantung pada aplikasi yang dapat mengasosiasikan variabel individu dari tipe yang berbeda satu sama lain. Ini tidak hanya mengarah pada cara yang efisien untuk memanipulasi data tetapi juga memungkinkan kita untuk mengimplementasikan struktur khusus yang disebut struktur data.
Struktur data dapat digunakan untuk berbagai aplikasi seperti pengiriman pesan antara dua sistem yang disematkan dan menyimpan data yang dikumpulkan dari sensor di lokasi memori yang tidak berdekatan.
Selain itu, struktur adalah objek data yang berguna ketika program perlu mengakses register periferal mikrokontroler yang dipetakan memori. Kita akan melihat aplikasi struktur di artikel berikutnya.
Untuk menggunakan struktur, pertama-tama kita perlu menentukan template struktur. Perhatikan contoh kode di bawah ini:
rekaman struct { suara uint16_t[4]; float sample_rate;};
Ini menentukan tata letak atau template untuk membuat variabel masa depan jenis ini. Template ini menyertakan larik uint16_t dan variabel bertipe float. Nama templatenya adalah record , dan ini muncul setelah kata kunci struct . Perlu disebutkan bahwa tidak ada alokasi memori untuk menyimpan template struktur. Alokasi memori hanya terjadi setelah variabel struktur berdasarkan tata letak ini ditentukan. Kode berikut mendeklarasikan variabel mic1 dari template di atas:
struct record mic1;
Sekarang, bagian memori dialokasikan untuk variabel mic1 . Ini memiliki ruang untuk menyimpan empat uint16_t elemen array dan satu variabel float.
Anggota struktur dapat diakses menggunakan operator anggota (.). Misalnya, kode berikut menetapkan 100 ke elemen pertama larik dan menyalin nilai sample_rate ke fs variabel (yang harus bertipe float).
mic1.voice[0]=100;fs=mic1.sample_rate;
Kami melihat salah satu cara mendeklarasikan struktur di bagian sebelumnya. Bahasa C mendukung beberapa format lain yang akan diulas di bagian ini. Anda mungkin akan tetap menggunakan satu format di seluruh program Anda, tetapi membiasakan diri dengan format lain terkadang dapat membantu.
Sintaks umum untuk mendeklarasikan template struktur adalah:
struct tag_name { type_1 member_1; tipe_2 anggota_2; … type_n member_n;} nama_variabel;
nama_tag dan nama_variabel adalah pengidentifikasi opsional. Kami biasanya akan melihat setidaknya satu dari dua pengidentifikasi ini, tetapi ada kasus di mana kami dapat menghilangkan keduanya.
Sintaks 1: Saat keduanya tag_name dan nama_variabel hadir, kami mendefinisikan variabel struktur tepat setelah template. Dengan menggunakan sintaks ini, kita dapat menulis ulang contoh sebelumnya sebagai berikut:
rekaman struct { suara uint16_t[4]; float sample_rate;} mic1;
Sekarang, jika kita perlu mendefinisikan variabel lain (mic2 ), kita dapat menulis
struct record mic2;
Sintaks 2: Hanya nama_variabel disertakan. Dengan menggunakan sintaks ini, kita dapat menulis ulang contoh di bagian sebelumnya sebagai berikut:
struct { suara uint16_t[4]; float sample_rate;} mic1;
Dalam hal ini, kita harus mendefinisikan semua variabel kita tepat setelah template dan kita tidak dapat mendefinisikan variabel lain di program kita nanti (karena template tidak memiliki nama dan kita tidak dapat merujuknya nanti).
Sintaks 3 Dalam hal ini, tidak ada tag_name atau nama_variabel . Template struktur yang didefinisikan dengan cara ini disebut sebagai struktur anonim. Struktur anonim dapat didefinisikan dalam struktur atau serikat lain. Contoh diberikan di bawah ini:
uji struct { // struct struktur anonim { float f; karakter; };} test_var;
Untuk mengakses anggota dari struktur anonim di atas, kita dapat menggunakan operator anggota (.). Kode berikut memberikan 1.2 ke anggota f .
test_var.f=1.2;
Karena strukturnya anonim, kami mengakses anggotanya dengan menggunakan operator anggota hanya sekali. Jika memiliki nama seperti pada contoh berikut, kita harus menggunakan operator anggota dua kali:
ujian struct { struct { float f; karakter; } bersarang;} test_var;
Dalam hal ini, kita harus menggunakan kode berikut untuk menetapkan 1.2 ke f :
test_var.nested.f=1.2;
Seperti yang Anda lihat, struktur anonim dapat membuat kode lebih mudah dibaca dan tidak terlalu bertele-tele. Dimungkinkan juga untuk menggunakan kata kunci typedef bersama dengan struktur untuk mendefinisikan tipe data baru. Kita akan melihat metode ini di artikel mendatang.
Standar C menjamin bahwa anggota struktur akan ditempatkan di memori satu demi satu dalam urutan di mana anggota dideklarasikan dalam struktur. Alamat memori anggota pertama akan sama dengan alamat struktur itu sendiri. Perhatikan contoh berikut:
struct Test2{ uint8_t c; uint32_t d; uint8_t e; uint16_t f;} MyStruct;
Empat lokasi memori akan dialokasikan untuk menyimpan variabel c, d, e, dan f. Urutan lokasi memori akan cocok dengan mendeklarasikan anggota:lokasi untuk c akan memiliki alamat terendah, kemudian d, e, dan akhirnya, f akan muncul. Berapa banyak byte yang kita butuhkan untuk menyimpan struktur ini? Mengingat ukuran variabel, kita tahu bahwa, setidaknya, 1+4+1+2=8 byte diperlukan untuk menyimpan struktur ini. Namun, jika kami mengkompilasi kode ini untuk mesin 32-bit, kami akan secara mengejutkan mengamati bahwa ukuran MyStruct adalah 12 byte daripada 8! Hal ini disebabkan oleh fakta bahwa kompiler memiliki batasan tertentu ketika mengalokasikan memori untuk anggota struktur yang berbeda. Misalnya, bilangan bulat 32-bit hanya dapat disimpan di lokasi memori yang alamatnya habis dibagi empat. Batasan seperti itu, yang disebut sebagai persyaratan penyelarasan data, diimplementasikan agar prosesor mengakses variabel dengan lebih efisien. Penyelarasan data menyebabkan beberapa ruang yang terbuang (atau bantalan) dalam tata letak memori. Topik ini hanya diperkenalkan di sini; kita akan membahas detailnya di artikel berikutnya dari seri ini.
Menyadari persyaratan penyelarasan data, kami mungkin dapat mengatur ulang urutan anggota dalam suatu struktur dan membuat penggunaan memori lebih efisien. Misalnya, jika kita menulis ulang struktur di atas seperti yang diberikan di bawah ini, ukurannya akan berkurang menjadi 8 byte pada mesin 32-bit.
struct Test2{ uint32_t d; uint16_t f; uint8_t c; uint8_t e;} MyStruct;
Untuk sistem tersemat dengan memori terbatas, pengurangan ukuran objek data dari 12 byte menjadi 8 byte merupakan penghematan yang signifikan, terutama jika suatu program memerlukan banyak objek data ini.
Artikel berikutnya akan membahas penyelarasan data secara lebih rinci dan memeriksa beberapa contoh penggunaan struktur dalam sistem tertanam.
Untuk melihat daftar lengkap artikel saya, silakan kunjungi halaman ini.
Tertanam
Ada beberapa bagian yang membantu sistem suspensi kendaraan berfungsi dengan baik. Sistem ini dilengkapi berbagai komponen peredam kejut yang membantu meningkatkan penanganan dan mendukung kendaraan saat berada di jalan. Sambungan bola adalah salah satu bagian utama dari suspensi. Mereka membantu p
Pelajari tentang metode yang banyak digunakan untuk memfilter dan memproses sampel data dalam domain waktu sambil melihat lebih dekat mesin Dual Biquad IIR unit PowerQuad di MCU LPC55S69. Saat menangani sampel data yang dikumpulkan dari waktu ke waktu, atau dalam domain waktu, salah satu operasi p
Pelajari tentang objek data yang disebut union dalam bahasa C yang disematkan. Pelajari tentang objek data yang disebut union dalam bahasa C yang disematkan. Perbedaan Antara Struktur dan Union dalam Embedded C Dalam artikel sebelumnya dari seri ini, kita telah membahas bahwa struktur dalam C yang
Saat mengadopsi teknologi cloud, keamanan adalah salah satu masalah paling kritis. Banyak Organisasi masih khawatir bahwa data mereka tidak aman di lingkungan cloud. Perusahaan ingin menerapkan tingkat keamanan yang sama ke sistem cloud mereka sebagai sumber daya internal mereka. Sangat penting un