Saya mulai menulis firmware untuk produk saya dan saya pemula di sini. Saya membaca banyak artikel tentang tidak menggunakan variabel atau fungsi global. Apakah ada batasan untuk menggunakan variabel global dalam sistem 8 bit atau apakah itu lengkap 'Tidak-Tidak'. Bagaimana saya harus menggunakan variabel global dalam sistem saya atau haruskah saya sepenuhnya menghindarinya?
Saya ingin mengambil saran berharga dari kalian tentang topik ini untuk membuat firmware saya lebih ringkas.
static
ruang lingkup file tidak sama dengan "global", lihat jawaban saya di bawah ini.Jawaban:
Anda dapat menggunakan variabel global dengan sukses, selama Anda mengingat pedoman @ Phil. Namun, berikut adalah beberapa cara yang bagus untuk menghindari masalah mereka tanpa membuat kode yang dikompilasi kurang kompak.
Gunakan variabel statis lokal untuk status persisten yang hanya ingin Anda akses di dalam satu fungsi.
Gunakan struct untuk menjaga variabel terkait bersama-sama, untuk membuatnya lebih jelas di mana mereka harus digunakan dan di mana tidak.
Gunakan variabel statis global untuk membuat variabel hanya terlihat dalam file C saat ini. Ini mencegah akses tidak disengaja oleh kode dalam file lain karena konflik penamaan.
Sebagai catatan akhir, jika Anda memodifikasi variabel global dalam rutinitas interupsi dan membacanya di tempat lain:
volatile
.ATAU
sumber
volatile
variabel secara normal adalah untuk memungkinkan kode berjalan dalam satu konteks eksekusi agar kode dalam konteks eksekusi lain tahu sesuatu telah terjadi. Pada sistem 8-bit, buffer yang akan menampung sejumlah dua byte tidak lebih dari 128 dapat dikelola dengan satu byte volatil yang menunjukkan jumlah total seumur hidup byte yang dimasukkan ke buffer (mod 256) dan yang lain menunjukkan jumlah byte yang diambil seumur hidup, asalkan hanya satu konteks eksekusi yang memasukkan data ke buffer dan hanya satu yang mengambil data darinya.Alasan Anda tidak ingin menggunakan variabel global dalam sistem 8-bit adalah sama dengan yang Anda tidak ingin menggunakannya dalam sistem lain: mereka membuat penalaran tentang perilaku program menjadi sulit.
Hanya programmer buruk yang menutup aturan seperti "jangan gunakan variabel global". Pemrogram yang baik memahami alasan di balik aturan, kemudian memperlakukan aturan lebih seperti panduan.
Apakah program Anda mudah dimengerti? Apakah perilakunya dapat diprediksi? Apakah mudah untuk memodifikasi bagian tanpa merusak bagian lain? Jika jawaban untuk masing-masing pertanyaan ini adalah ya , maka Anda sedang menuju program yang bagus.
sumber
Anda seharusnya tidak sepenuhnya menghindari penggunaan variabel global ("global" singkatnya). Tapi, Anda harus menggunakannya dengan bijaksana. Masalah praktis dengan penggunaan global yang berlebihan:
Ini adalah praktik yang baik untuk menambahkan awalan
g_
ke nama variabel global. Sebagai contohg_iFlags
,. Ketika Anda melihat variabel dengan awalan dalam kode, Anda segera mengenali bahwa itu adalah global.sumber
static
bendera menjadi terlihat olehmain()
? Apakah Anda menyiratkan bahwa fungsi yang sama dengan yangstatic
dapat mengembalikannya kemain()
nanti?Keuntungan dari struktur data global dalam pekerjaan tertanam adalah bahwa mereka statis. Jika setiap variabel yang Anda butuhkan adalah global, maka Anda tidak akan pernah kehabisan memori secara tidak sengaja ketika fungsi dimasukkan dan ruang dibuat untuk mereka di stack. Tetapi kemudian, pada titik itu mengapa memiliki fungsi? Mengapa tidak satu fungsi besar yang menangani semua logika dan proses - seperti program BASIC tanpa GOSUB diizinkan. Jika Anda mengambil ide ini cukup jauh, Anda akan memiliki program bahasa assembly khas dari tahun 1970-an. Efisien, dan tidak mungkin dirawat dan kesulitan menembak.
Jadi gunakan global dengan bijaksana, seperti variabel keadaan (misalnya, jika setiap fungsi perlu tahu apakah sistem berada dalam kondisi interpret atau run) dan struktur data lain yang perlu dilihat oleh banyak fungsi dan seperti yang dikatakan @PhilFrost, adalah perilaku dari fungsi Anda dapat diprediksi? Apakah ada kemungkinan untuk mengisi stack dengan string input yang tidak pernah berakhir? Ini adalah hal-hal untuk desain algoritma.
Perhatikan bahwa statis memiliki arti berbeda di dalam dan di luar fungsi. /programming/5868947/difference-between-static-variable-inside-and-outside-of-a-function
/programming/5033627/static-variable-inside-of-a-function-in-c
sumber
Variabel global seharusnya hanya digunakan untuk negara yang benar-benar global. Menggunakan variabel global untuk merepresentasikan sesuatu seperti misalnya garis lintang batas utara peta hanya akan berfungsi jika hanya ada satu "batas utara peta". Jika di masa depan kode mungkin harus bekerja dengan beberapa peta yang memiliki batas utara yang berbeda, kode yang menggunakan variabel global untuk batas utara kemungkinan akan perlu dikerjakan ulang.
Dalam aplikasi komputer biasa, seringkali tidak ada alasan khusus untuk menganggap tidak akan ada lebih dari satu hal. Namun, dalam sistem embedded, asumsi seperti itu seringkali jauh lebih masuk akal. Meskipun ada kemungkinan bahwa program komputer biasa dipanggil untuk mendukung banyak pengguna secara bersamaan, antarmuka pengguna dari sistem tertanam yang khas akan dirancang untuk operasi oleh satu pengguna yang berinteraksi dengan tombol dan tampilan. Dengan demikian, setiap saat akan memiliki status antarmuka pengguna tunggal. Mendesain sistem sehingga banyak pengguna dapat berinteraksi dengan banyak keyboard dan tampilan akan membutuhkan lebih banyak kerumitan, dan membutuhkan waktu lebih lama untuk diimplementasikan, daripada mendesainnya untuk satu pengguna. Jika sistem tidak pernah dipanggil untuk mendukung banyak pengguna, setiap upaya ekstra yang diinvestasikan untuk memfasilitasi penggunaan tersebut akan sia-sia. Kecuali kemungkinan dukungan multi-pengguna akan diperlukan, kemungkinan akan lebih bijaksana jika risiko membuang kode yang digunakan untuk antarmuka pengguna-tunggal jika diperlukan dukungan multi-pengguna, daripada menghabiskan waktu ekstra menambahkan multi-pengguna. dukungan pengguna yang kemungkinan besar tidak akan pernah dibutuhkan.
Faktor terkait dengan sistem tertanam adalah bahwa dalam banyak kasus (terutama yang melibatkan antarmuka pengguna), satu-satunya cara praktis untuk mendukung memiliki lebih dari satu hal adalah dengan menggunakan banyak utas. Dengan tidak adanya beberapa kebutuhan lain untuk multi-threading, mungkin lebih baik menggunakan desain single-threaded sederhana daripada meningkatkan kompleksitas sistem dengan multi-threading yang mungkin tidak pernah benar-benar diperlukan. Jika menambahkan lebih dari satu sesuatu akan memerlukan desain ulang sistem yang besar, tidak masalah jika itu juga membutuhkan pengerjaan ulang penggunaan beberapa variabel global.
sumber
Banyak orang bingung tentang hal ini. Definisi variabel global adalah:
Ini bukan hal yang sama dengan variabel cakupan file , yang dideklarasikan oleh kata kunci
static
. Itu bukan variabel global, mereka adalah variabel pribadi lokal.Haruskah Anda menggunakan variabel global? Ada beberapa kasus di mana itu baik-baik saja:
Dalam setiap kasus lain, Anda tidak akan pernah menggunakan variabel global. Tidak pernah ada alasan untuk melakukannya. Alih-alih menggunakan variabel lingkup file , yang sangat bagus.
Anda harus berusaha untuk menulis modul kode independen dan otonom yang dirancang untuk melakukan tugas tertentu. Di dalam modul-modul itu, variabel ruang lingkup file internal harus berada sebagai anggota data pribadi. Metode desain ini dikenal sebagai orientasi objek dan secara luas diakui sebagai desain yang baik.
sumber
.data
segmennya.