Pelajaran Teach
STM32 Mbed CodeIDE (4/8): penyahpepijatan bersiri dengan printf
Pelajar menggunakan printf penyahpepijatan bersiri dalam STM32 Mbed CodeIDE untuk membandingkan kelakuan yang dijangka dan sebenar, kemudian membetulkan ketidakpadanan dengan bukti.
Kali pertama menggunakan LabsLand? Cipta akaun guru anda
Hasil pembelajaran
Gunakan
printf()untuk memerhati apa yang sedang dijalankan oleh program Mbed.Cetak nilai integer dan bukannya bergantung pada pemformatan titik terapung.
Gunakan output bersiri untuk menyahpepijat satu perubahan terkawal pada satu masa.
Pratonton aktiviti pelajar
Kandungan aktiviti
Pratonton sahaja. Dalam sesi kelas, pelajar boleh mengisi jawapan dan menyerahkan hasil kerja mereka kepada guru.
Mengapa keluaran bersiri penting
8 min
Kamera sahaja tidak dapat memberitahu anda nilai yang digunakan oleh kod apabila berlaku kesilapan. Pengawal selalunya memerlukan panel instrumen untuk pengaturcara; konsol bersiri berfungsi sebagai panel itu supaya anda boleh mencari ketidakpadanan pemasaan atau logik dan bukannya meneka daripada kamera sahaja.
Apabila pengawal tidak berkelakuan seperti yang dijangkakan, meneka mengambil masa. Output bersiri membolehkan anda mencetak nilai dan titik semakan:
printf("cycle=%d led=%d\n", cycle, led_state);
Dalam program Mbed ini, printf() menghantar teks daripada papan STM32 yang sedang berjalan ke konsol bersiri dalam CodeIDE. Penanda %d digantikan dengan nilai integer dan \n memulakan baris baharu supaya setiap bacaan lebih mudah untuk disalin.
Kursus ini menggunakan keluaran bersiri integer. Dalam persekitaran Mbed ini, output titik terapung printf("%f") bukanlah alat penyahpepijatan pertama yang baik. Gunakan integer seperti milisaat, milivolt, peratusan dan darjah.
Dalam makmal STM32 Mbed CodeIDE, output bersiri muncul dalam panel konsol berhampiran bahagian bawah paparan makmal. CodeIDE menguruskan sambungan bersiri USB dan kadar baud untuk anda; anda hanya perlu mengkompil, memuat naik dan membaca baris yang dicetak.
Cara printf mencapai konsol CodeIDE
Selepas memuat naik, baca kawasan Console berhampiran bahagian bawah CodeIDE. Iaitu
di mana baris yang dicetak oleh panggilan printf() yang sedang berjalan muncul.
Semakan manakah yang terbaik menguji sama ada nilai pemasaan bercetak menerangkan program fizikal?
Cetak mesej denyut semasa program berjalan
26 min
Peruntukkan dua proses kompilasi/muat naik dan kira-kira 22 minit masa makmal aktif: satu pelaksanaan yang mengandungi pepijat dan satu pelaksanaan yang telah dibetulkan. Jika perlu menunggu giliran, sediakan jadual dan kaedah pemasaan lima selang. Jangan ubah kod untuk membuat diagnosis sebelum anda memperoleh bukti bersiri dan kamera daripada versi 1.
Buka makmal STM32 Mbed CodeIDE.
Buka
main.cpp.Gantikan fail dengan program di bawah dengan tepat. Versi yang dibekalkan ini mengandungi kesalahan pemasaan/pelaporan yang disengajakan; jangan betulkan lagi.
Simpan, jalankan kompilasi 1 dan muat naik versi yang mengandungi pepijat.
Buka atau tonton kawasan konsol bersiri dalam CodeIDE.
Perhatikan baris bersiri dan sahkan bahawa nombor kitaran meningkat manakala LED berubah.
Salin sekurang-kurangnya tiga baris bersiri sebelum menukar atur cara.
Dengan kamera, ukur masa lima selang perubahan keadaan LED berturut-turut dalam saat. Bahagikan dengan 5 untuk mendapatkan satu selang yang diperhatikan.
Biarkan kompilasi 1 berjalan sehingga jadual dan bukti masa lengkap.
#include "mbed.h"
DigitalOut status_led(PB_5, 0);
int main() {
int cycle = 0;
const int interval_ms = 500;
const auto interval = 1000ms;
printf("STM32 Mbed serial debug start\n");
while (true) {
status_led = !status_led.read();
cycle = cycle + 1;
printf("cycle=%d led=%d interval_ms=%d\n", cycle, status_led.read(), interval_ms);
ThisThread::sleep_for(interval);
}
}
Baris pertama sepatutnya kelihatan seperti ini:
STM32 Mbed serial debug start
cycle=1 led=1 interval_ms=500
cycle=2 led=0 interval_ms=500
cycle=3 led=1 interval_ms=500
Isi tiga baris jadual menggunakan baris cycle=... yang berbeza, bukan baris permulaan. Tampal setiap baris penuh. Untuk Gelagat kamera pada baris itu, rakam keadaan LED atau perubahan yang kelihatan pada masa yang sama; jangan menganggap bahawa nilai mentah 0/1 sentiasa bermaksud hidup/mati. Tulis pemerhatian ringkas seperti "kitaran meningkat sebanyak 1" atau "nilai LED yang dicetak berselang-seli." Nilai pemasaan hanya daripada perbandingan lima selang di bawah.
Jadual bukti bersiri
| Baris konsol yang disalin | Tingkah laku kamera pada baris itu | Perkara ini memberitahu saya |
|---|---|---|
Untuk versi 1 yang mengandungi pepijat, jawab dengan tiga baris ini:
1. Selang tercetak: ... ms
2. Masa diukur untuk 5 selang: ... s
3. Pengiraan satu selang: (... s / 5) × 1000 = ... ms
Jangan cadangkan pembetulan lagi.
Cari ketidakpadanan bersiri
13 min
Gunakan hanya baris bersiri, pemasaan kamera anda dan dua pemalar pemasaan dalam kod untuk mendiagnosis kompilasi 1.
Tampal satu baris bersiri daripada kompilasi 1 yang mengelirukan. Nyatakan selang yang dinyatakan dan selang yang diukur dengan kamera, masing-masing dengan unit, kemudian kenal pasti dua ungkapan kod yang tidak sepadan. Jangan laporkan bukti yang telah diperbetulkan dalam jawapan ini.
Selepas menjawab, gantikan dua pengisytiharan masa dengan templat pembetulan ini. Ia mengandungi tepat dua ruang letak yang menghalang kompilasi. Pilih sama ada selang 500 ms atau 1000 ms, tetapi kedua-dua penggantian TODO mesti mewakili tempoh yang sama. Cari TODO sebelum mengkompil.
// TODO 1: integer milisaat yang akan dicetak dalam baris bersiri.
const int interval_ms = TODO_REPORTED_MS;
// TODO 2: tempoh yang sama sebagai literal chrono Mbed, termasuk ms.
const auto interval = TODO_WAIT_MS;
Simpan, jalankan kompilasi 2, muat naik dan ulangi pengukuran kamera bagi lima selang yang sama. Hanya selepas merekodkan bukti yang telah dibetulkan, klik Tandai amalan sebagai selesai.
Untuk kompilasi 2 yang telah diperbetulkan, jawab dalam format ini:
1. Baris bersiri: ...
2. Selang tercetak: ... ms
3. Masa diukur untuk 5 selang: ... s
4. Pengiraan satu selang: (... s / 5) × 1000 = ... ms
5. Kesimpulan: kedua-duanya sepadan/tidak sepadan dalam julat ketidakpastian masa kamera kerana...
Serahkan kod anda
8 min
Lampirkan main.cpp akhir anda yang disimpan
Klik Semak fail yang disimpan, sahkan bahawa main.cpp mengandungi versi yang diperbetulkan, dimuat naik dan tiada TODO. Kemudian lampirkan dan serahkan.