Apakah ada metode pengujian standar untuk kode logam kosong

8

Saya ingin tahu apakah kode logam kosong, terutama hal-hal seperti perangkat / kode inisialisasi periferal memiliki metode pengujian karena ada sedikit atau tidak ada yang bisa salah ketika menulis ke register (setelah Anda tahu bahwa semua alamat dipetakan dengan benar). Juga kode semacam ini biasanya memiliki sangat sedikit cabang / jalur ketika perangkat sedang dikonfigurasikan untuk satu fungsi tunggal, jadi jenis pengujian apa yang perlu atau dapat diterapkan di sini?

manusia gua
sumber

Jawaban:

11

Hal pertama yang saya verifikasi di papan baru, apakah itu menggunakan osilator internal atau kristal eksternal, adalah saya mengatur frekuensi clock dengan benar. Ini penting karena banyak periferal, seperti UART, SPI, I2C dan timer bergantung padanya.

Cara saya memverifikasi itu adalah menulis sebuah program dengan loop pendek, baik dalam bahasa assembly di mana saya bisa menghitung siklus secara manual, atau C selama Anda bisa mendapatkan daftar pembongkaran dan melakukan hal yang sama - dan menyalakan LED dan pergi. Saya mengatur loop sehingga dijalankan sekali per detik. Saya menjalankan kode, dan memeriksa apakah LED berkedip 60 kali dalam satu menit.

Sejauh periferal berjalan, cara terbaik untuk memeriksanya adalah dengan menggunakan osiloskop jika Anda memilikinya, dan lihat garis RX untuk UART, CLK, MOSI, dan jalur pilih chip untuk SPI, dan jalur SDA dan SCL untuk I2C, dan periksa apakah garisnya berubah dan waktunya terlihat benar.

Jika Anda tidak memiliki osiloskop, Anda dapat menempatkan LED pada garis-garis ini, dan kemudian mengaktifkan atau menonaktifkan periferal, Ketika dinonaktifkan, sebagian besar garis akan rendah (LED mati), tetapi beberapa akan menjadi tinggi, seperti ujung RX dari UART (LED menyala). Ketika periferal diaktifkan, sebagian besar LED harus redup, karena garis akan berubah-ubah. Dengan menjalankan dalam satu lingkaran (dinonaktifkan / diaktifkan), lebih mudah untuk melihat perbedaan antara aktif atau redup.

Untuk UART, Anda dapat menghubungkan garis TX ke garis RX sebagai loop di sekitar. Anda juga dapat menghubungkan kemudian ke kabel UART ke USB , dan pada PC nyata terminal program seperti RealTerm . Selain menguji antarmuka, ini akan berguna untuk debugging lain nanti.

Untuk potongan kode lainnya, saya menggunakan beberapa LED yang diperlukan untuk menunjukkan bahwa berbagai jalur dalam kode sedang dieksekusi. Jika UART Anda berfungsi dan terhubung ke PC, Anda dapat memercikkan kode Anda dengan panggilan ke subrutin untuk menampilkan pesan untuk menunjukkan poin apa yang telah dicapai oleh program (atau menggunakan printf jika Anda memiliki perpustakaan C standar yang tersedia). Tetapi seperti yang ditunjukkan oleh Vladimir Cravero dalam komentar di bawah, ini dapat memperlambat beberapa kode Anda (pada 115.200 baud, tidak terlalu banyak, karena waktu satu karakter adalah <10 μs). Tetapi dalam ISR dan kode kritis waktu lainnya, cukup gunakan LED.

Seperti yang ditunjukkan oleh Al Bundy dalam komentar di bawah ini, debugger di dalam sirkuit dapat berguna juga, terutama jika seseorang dapat menetapkan beberapa breakpoint, dan bahkan lebih berguna jika Anda dapat breakpoint pada lokasi memori yang sedang diubah. Tidak semua debugger memiliki fitur itu.

Namun saya tidak banyak menggunakan debugger kecuali saya harus, misalnya untuk melihat bit dalam register perangkat; atau untuk melacak bug yang tidak dapat saya temukan dengan inspeksi; atau untuk analisis cakupan kode yang belum sempurna. Tetapi secara umum saya suka menjalankan program dengan kecepatan "normal" karena banyak masalah biasanya akan muncul yang mungkin tidak ketika program dijalankan satu langkah. Sebagian besar program saya banyak menggunakan interupsi, yang mengganggu menggunakan debugger.

tcrosley
sumber
Anda mengatakan semuanya, saya hanya ingin menambahkan bahwa biasanya menaburkan kode Anda dengan fprintf akan memperlambatnya, itu adalah hal yang harus Anda gunakan jika perlu dan jika Anda tahu apa yang Anda lakukan. Saya telah melihat beberapa pertanyaan (dan memiliki beberapa masalah) tentang fprintf dalam ISR atau semacamnya.
Vladimir Cravero
@VladimirCravero Setuju - itu sebabnya seperti menggunakan LED.
tcrosley
Terima kasih atas jawabannya. Setiap petunjuk tentang alat / pengaturan apa yang akan Anda gunakan untuk cakupan kode jika Anda hanya memiliki simulator tetapi tidak perangkat keras yang sebenarnya?
manusia gua
Bagaimana dengan debugguer? Bukankah itu layak untuk disebutkan?
Al Bundy
2
@ ALBundy Saya tidak banyak menggunakan debugger kecuali saya harus, misalnya untuk melihat bit dalam register periferal; atau untuk melacak bug yang tidak dapat saya temukan dengan inspeksi; atau untuk melakukan analisis cakupan kode yang belum sempurna seperti yang saya sebutkan dalam komentar saya kepada OP. Tetapi secara umum saya suka menjalankan program dengan kecepatan "normal" karena banyak masalah biasanya akan muncul yang tidak akan terjadi ketika program berjalan satu langkah. Sebagian besar program saya banyak menggunakan interupsi, yang mengganggu menggunakan debugger. Saya akan menambahkan beberapa komentar ini ke dalam jawaban saya.
tcrosley