Saya biasanya memprogram PIC dalam C, biasanya untuk konverter mode yang diaktifkan. Saya pernah mendengar tentang berbagai alat analisis statis dan standar seperti MISRA C yang dapat digunakan untuk membantu meningkatkan keandalan kode. Saya ingin tahu lebih banyak. Standar atau alat apa yang mungkin sesuai untuk konteks saya?
9
Jawaban:
Validasi kode tertanam sulit, terutama ketika berhadapan dengan bagian sumber daya terbatas seperti PIC. Anda sering tidak memiliki kemewahan pengkodean dalam kasus uji karena kendala memnry bagian dan pemrograman "real-time" yang sering dilakukan pada perangkat semacam ini.
Berikut ini beberapa pedoman saya:
Tulis spec jika tidak ada: Jika Anda tidak mengkode terhadap spec, dokumentasikan apa yang seharusnya kode Anda, apa input yang valid, apa output yang diharapkan, berapa lama setiap rutin mengambil, apa yang bisa dan tidak bisa dapatkan musnah, dll - teori operasi, diagram alur, segala sesuatu lebih baik daripada tidak sama sekali.
Komentari kode Anda: Hanya karena sesuatu sudah jelas bagi Anda, tidak berarti bahwa kode itu jelas (atau benar) untuk orang lain. Komentar dalam bahasa biasa diperlukan untuk peninjauan dan pemeliharaan kode.
Kode bertahan: Jangan hanya memasukkan kode untuk input normal. Menangani input yang hilang, input yang berada di luar jangkauan, luapan matematis, dll. - semakin banyak sudut yang Anda cakup oleh desain kode Anda, semakin sedikit derajat kebebasan yang dimiliki kode ketika digunakan.
Gunakan alat analisis statis: Dapat merendahkan berapa banyak alat bug seperti PC-lint dapat ditemukan dalam kode Anda. Pertimbangkan menjalankan analisis statis bersih sebagai titik awal yang baik untuk pengujian serius.
Ulasan rekan sangat penting: Kode Anda harus bersih dan cukup terdokumentasi sehingga dapat ditinjau secara efisien oleh pihak independen. Periksa ego Anda di pintu dan pertimbangkan dengan serius kritik atau saran apa pun yang dibuat.
Pengujian sangat penting: Anda harus melakukan validasi sendiri, serta memiliki validasi independen terhadap kode. Orang lain dapat memecahkan kode Anda dengan cara yang tidak mungkin Anda bayangkan. Uji setiap kondisi valid dan setiap kondisi tidak valid yang dapat Anda pikirkan. Gunakan PRNG dan masukkan data sampah. Lakukan apa saja untuk memecahkan masalah, lalu perbaiki dan coba lagi. Jika Anda beruntung, Anda akan dapat menjalankan kode Anda dalam mode debug dan mengintip register dan variabel - jika tidak, Anda harus menggunakan LED / sinyal digital yang licik dan bergantian untuk mendapatkan gambaran tentang keadaan komputer Anda. alat. Lakukan apa pun yang diperlukan untuk mendapatkan umpan balik yang Anda butuhkan.
Lihat di bawah kap: Jangan takut untuk melihat kode mesin yang dihasilkan oleh kompiler C Anda. Anda dapat (akan?) Menemukan tempat-tempat di mana kode C indah Anda telah meledak menjadi puluhan jika tidak ratusan operasi, di mana sesuatu yang harus aman (karena hanya satu baris kode, kan?) Membutuhkan waktu lama untuk mengeksekusi beberapa gangguan telah memecat dan membatalkan persyaratan. Jika sesuatu menjadi sangat tidak efisien, refactor dan coba lagi.
sumber
Sebagian besar teknik yang sama untuk membuat perangkat lunak yang andal di PC juga berlaku untuk pengembangan yang disematkan. Sangat membantu untuk memisahkan algoritma Anda dari kode khusus perangkat keras, dan menguji mereka secara terpisah dengan unit test, simulasi, analisis statis, dan alat-alat seperti Valgrind. Dengan begitu ada jauh lebih sedikit kode yang hanya diuji pada perangkat keras.
Saya tidak akan meninggalkan C. Sementara bahasa seperti Ada dapat menawarkan beberapa jaminan kecil, mudah untuk jatuh ke dalam jebakan berpikir bahasa yang dijanjikan lebih dari yang sebenarnya.
sumber
MISRA-C memang sangat berguna untuk meningkatkan kualitas kode umum dan meminimalkan bug. Pastikan Anda membaca dan memahami setiap aturan, sebagian besar dari mereka baik, tetapi beberapa dari mereka tidak masuk akal.
Sebuah peringatan di sini. Dokumen MISRA mengasumsikan bahwa pembaca adalah seseorang dengan pengetahuan luas tentang bahasa C. Jika Anda tidak memiliki veteran C yang keras di tim Anda, tetapi memutuskan untuk mendapatkan penganalisa statis dan kemudian secara membabi buta mengikuti setiap peringatan yang diberikan, kemungkinan besar akan menghasilkan kode kualitas yang lebih rendah , karena Anda mungkin mengurangi keterbacaan dan membuat bug secara tidak sengaja. Saya sudah sering melihat ini terjadi, mengonversi kode ke kepatuhan MISRA bukanlah tugas sepele.
Ada dua versi dokumen MISRA-C yang mungkin berlaku. Baik MISRA-C: 2004, yang masih menjadi standar industri de facto saat ini. Atau MISRA-C baru: 2012 yang mendukung standar C99. Jika Anda belum pernah menggunakan MISRA-C sebelumnya, saya akan merekomendasikan Anda untuk mengimplementasikan yang terakhir.
Perlu diketahui bahwa vendor alat biasanya merujuk ke MISRA-C: 2004 ketika mereka mengatakan bahwa mereka memiliki pengecekan MISRA (kadang-kadang mereka bahkan merujuk ke versi MISRA-C: 1998 yang sudah usang). Sejauh yang saya tahu, dukungan alat untuk MISRA-C: 2012 masih terbatas. Saya pikir hanya beberapa analisa statis yang telah mengimplementasikannya sejauh ini: Klocwork, LDRA, PRQA dan Polyspace. Mungkin lebih, tetapi Anda pasti perlu memeriksa versi MISRA yang didukungnya.
Sebelum memutuskan, tentu saja Anda dapat mulai dengan membaca dokumen MISRA dan melihat apa yang disyaratkan. Ini dapat dibeli seharga £ 10 dari misra.org , cukup terjangkau dibandingkan dengan harga untuk standar ISO.
sumber
Mathworks (orang-orang MATLAB) memiliki alat analisis kode statis yang disebut Polyspace .
Selain analisis kode statis, serat dan sejenisnya, saya akan menyarankan definisi dan desain antarmuka yang cermat (dengan proses peninjauan formal) dan analisis cakupan kode.
Anda mungkin juga ingin melihat pedoman untuk desain kode kritis keselamatan, termasuk MISRA, tetapi juga standar UL1998, dan IEC 61508.
sumber
Untuk jawaban yang lengkap untuk pertanyaan ini, saya akan menekan pemikiran tentang "keandalan kode" dan alih-alih memikirkan "keandalan desain", karena kode tersebut hanyalah ekspresi akhir dari desain.
Jadi, mulailah dengan persyaratan dan tulis serta periksa itu. Jika Anda tidak memiliki dokumen persyaratan, tunjukkan kode acak dan tanyakan pada diri sendiri "mengapa baris itu diperlukan?" Kebutuhan untuk setiap baris kode pada akhirnya harus dapat dilacak ke persyaratan, bahkan jika sesederhana / sejelas "catu daya akan menghasilkan 5VDC jika inputnya antara 12-36VDC." Salah satu cara untuk berpikir tentang hal ini adalah bahwa jika garis kode tidak dapat dilacak ke suatu persyaratan, maka bagaimana Anda tahu itu kode yang benar, atau bahwa itu diperlukan sama sekali?
Selanjutnya, verifikasi desain Anda. Tidak apa-apa jika benar-benar ada dalam kode (misalnya, dalam komentar), tetapi itu membuatnya lebih sulit untuk mengetahui apakah kode tersebut melakukan apa yang benar-benar dimaksudkan. Misalnya, kode mungkin memiliki baris yang bertuliskan
output = 3 * setpoint / (4 - (current * 5));
Apakahcurrent == 4/5
input yang valid dapat menyebabkan kerusakan? Apa yang harus dilakukan dalam kasus ini untuk mencegah kesenjangan dengan nol? Apakah Anda menghindari operasi sama sekali atau justru menurunkan output? Memiliki catatan umum dalam dokumen desain Anda tentang cara menangani kasing tepi membuatnya lebih mudah untuk memverifikasi desain di tingkat yang lebih tinggi. Jadi, sekarang inspeksi kode lebih mudah karena masalah memeriksa apakah kode tersebut benar mengimplementasikan desain itu.Bersamaan dengan itu, inspeksi kode harus memeriksa kesalahan umum yang tidak ditangkap oleh IDE Anda (Anda menggunakan IDE, kan?) Seperti '=' ketika Anda bermaksud '==', kawat gigi yang hilang yang mengubah arti 'jika Pernyataan, titik koma di mana mereka seharusnya tidak, dll.
Ketika saya menulis ini, terpikir oleh saya bahwa sangat sulit untuk meringkas tahun pelatihan / pengalaman kualitas perangkat lunak dalam satu posting. Saya menulis kode untuk perangkat medis dan di atas adalah ringkasan yang sangat disederhanakan tentang bagaimana kami mendekatinya.
sumber