Satuan 3 / 9

Sistem Tertanam dan Kode Mikrokontroler

Keuntungan:

  • Kemampuan untuk menentukan persyaratan register, interupsi, dan pengaturan waktu untuk mikrokontroler dengan prompt yang jelas
  • Kemampuan untuk memeriksa kode C/Arduino yang dihasilkan oleh AI dalam hal pengaturan register, buffer overflow, dan batasan waktu nyata
  • Kemampuan untuk menerapkan kebiasaan memverifikasi kode yang dihasilkan dengan mengukurnya pada perangkat keras (osiloskop, port serial)

Pengembangan sistem tertanam adalah tempat perangkat lunak dan perangkat keras bersinggungan: pengaturan bit register yang salah, menahan interupsi terlalu lama, atau buffer yang meluap akan menyebabkan kegagalan yang aneh dan sulit direproduksi di lapangan, meskipun kode "dikompilasi" dan dijalankan. AI benar-benar merupakan akselerator di bidang ini; Ini dapat menghasilkan kerangka awal, fungsi abstraksi perangkat keras, mesin negara, dan rutinitas komunikasi. Namun AI tidak melihat lembar data kartu Anda, tidak mengetahui frekuensi jam Anda, dan tidak merasakan batasan waktu nyata Anda. Dalam unit ini, kita akan membahas cara mendefinisikan dengan jelas cara kerja mikrokontroler terhadap AI, cara memeriksa kode C/Arduino yang dihasilkan, dan mengapa Anda harus mengukur segala sesuatu di perangkat keras.

Mendefinisikan Persyaratan dengan Jelas: Daftar, Pemotongan, Waktu

Memberitahu AI untuk "menyalakan LED" tidak akan berhasil; Kartu yang mana, pin yang mana, frekuensi clock yang mana, timing yang mana? Saat menetapkan tugas tertanam ke AI, gunakan kerangka kerja ini: perangkat keras (keluarga MCU, jam, pin), fungsi (apa yang akan terjadi), batasan (waktu, daya, memori), dan antarmuka (register, HAL, perpustakaan Arduino).

Prompt Lemah / Prompt Kuat

LEMAH: "Menghasilkan PWM dengan STM32." (Hasil: pengatur waktu yang mana, frekuensi yang mana, pin yang mana tidak jelas; umum, mungkin salah kode bernama register.) KUAT: "Menghasilkan PWM tugas 20 kHz, 0-100% yang dapat disesuaikan pada TIM3 CH1 (PA6) untuk STM32F103 (jam sistem 72 MHz). Tulis pada level register (bukan HAL). - Nilai Prescaler dan ARR untuk 20 kHz HITUNG dan tampilkan perhitungan di baris komentar. - Atur tugas dengan suatu fungsi parameter antara 0-100. - Beri komentar pada setiap bit register yang Anda gunakan. Perhatikan bahwa nilainya akan berubah jika asumsi jam Anda salah."

Perbedaannya adalah prompt yang kuat membuat model menunjukkan perhitungan dan mengungkapkan asumsi jam. Jadi Anda dapat memeriksa nilai prescaler/ARR secara mandiri:

Untuk PWM 20 kHz (clock 72 MHz):Timer_clock = 72 MHzJika kita ingin prescaler = 72-1 → counter clock = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49Verifikasi: 1e6 / (49+1) = 20 000 Hz ✓

Mengaudit Kode AI: Apa yang Harus Diperhatikan?

Hanya karena kode yang dihasilkan dikompilasi tidak berarti kode tersebut berfungsi dengan benar. Ikuti daftar periksa ini:

daerah kendali

Apa yang harus dicari

Pengaturan register/bit

Sangat kompatibel dengan lembar data, bit mask yang benar

Interupsi (ISR)

Apakah itu pendek? Tidak ada penundaan pemblokir? Apakah volatil digunakan?

penyangga/array

Apakah ada kontrol perbatasan? Risiko meluap?

waktu

Dengan penundaan atau pengatur waktu? Apakah batasan waktu sebenarnya terpenuhi?

Jenis dan lebar

8/16/32-bit overflow, kebingungan yang ditandatangani/tidak ditandatangani

kekuasaan/anjing penjaga

Pengawas pemberian makan loop tak terbatas?

Rutinitas layanan interupsi (ISR) adalah sumber kesalahan yang paling umum. AI terkadang menempatkan penundaan() atau putaran panjang di dalam ISR. Hal ini menyebabkan interupsi lain terlewatkan dan pengawas diatur ulang. Aturan: ISR harus sesingkat mungkin; Tugas utamanya adalah menyiapkan bendera dan memindahkannya ke loop utama.

// LEMAH (AI terkadang menghasilkan ini): Fungsi pemblokir di ISR ​​void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; baca_sensor(); // mungkin memakan waktu lama - BAD CASE_Delay(10); // keterlambatan ISR - SANGAT BURUK }}// KUAT: ISR pendek; pekerjaan dipindahkan ke loop utamavolatile uint8_t tick_flag = 0; // volatil CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; tick_flag = 1; //cukup setel flag }}// di loop utama:if (tick_flag) { tick_flag = 0; baca_sensor(); }

Perhatian: Variabel apa pun yang digunakan bersama antara interupsi dan loop utama harus bersifat volatil. Jika tidak, kompiler mungkin menyimpan variabel dalam register dan melewatkan pembaruan. AI sering melupakan kata kunci ini; Carilah secara spesifik saat membaca kode.

Buffer Overflow dan Kesalahan Tipe

AI dapat menyalin data dari port serial ke dalam array berukuran tetap tanpa pemeriksaan batas. Dalam sistem tertanam, ini berarti menghancurkan memori yang berdekatan dan kerusakan yang tidak dapat dijelaskan. Pastikan batas dicentang di setiap strcpy, indeks array, dan buffer DMA. Demikian pula, penghitung 8-bit direset setelah 255; AI dapat mengabaikan hal ini dan mengandalkan akun yang meluap.

Verifikasi di Perangkat Keras: "Berfungsi" Diukur, Bukan Diasumsikan

Dalam sistem tertanam, bukti yang paling dapat diandalkan adalah meteran, bukan kompiler. Verifikasi kode yang dihasilkan dengan tiga cara berikut:

  1. Osiloskop/penganalisis logika: Mengukur frekuensi PWM, waktu sinyal, dan bentuk gelombang komunikasi. Jika Anda menginginkan 20 kHz, lihat 20 kHz di layar.
  2. Log port serial (UART): Cetak nilai variabel, transisi status, dan penghitung kesalahan, lalu bandingkan dengan perilaku yang diharapkan.
  3. Pengujian terikat dan stres: Uji apakah sistem bertahan di bawah beban tertinggi, data tercepat, dan waktu terburuk.

Jika nilai terukur tidak sesuai dengan perhitungan, asumsi jam, nilai prescaler, atau pengaturan register salah; mengejar.

Kasus Mini

Sebuah tim siswa meminta AI mencetak kode pengukuran jarak dengan sensor ultrasonik HC-SR04. Kode dikompilasi tetapi jarak selalu memberikan nilai yang konyol. Ketika mereka menghubungkannya ke osiloskop, mereka melihat bahwa kaki gema menghitung waktunya dalam milidetik, bukan mikrodetik; AI menggunakan millis(), bukan micros(). Kesalahan satu kata ini mengacaukan seluruh pengukuran dengan faktor 1000. Saat mereka mencetak waktu gema mentah ke dalam log serial dan membandingkannya dengan penggaris sebenarnya, mereka menemukan kesalahan tersebut dan memperbaikinya. Pelajaran: kode yang dikompilasi bukanlah kode yang benar; Pengukuran di perangkat keras segera menunjukkan kesalahannya.

Kesalahan Umum

  • Menerima nama register dan bit mask tanpa membandingkannya dengan lembar data.
  • Mengizinkan penundaan pemblokiran atau pemrosesan yang lama dalam ISR.
  • Melupakan volatilitas pada variabel bersama.
  • Lewati pemeriksaan buffer dan batas array; tidak melihat luapannya.
  • Mengandalkan frekuensi clock dan asumsi waktu tanpa memverifikasinya.
  • Mengingat kode "berfungsi" tanpa mengukurnya dengan osiloskop/log serial.

Singkatnya

  • Definisikan dengan jelas tugas tertanam dalam hal perangkat keras, fungsi, batasan, dan antarmuka.
  • Minta AI menghitung nilai waktu seperti prescaler/ARR dan memverifikasinya secara independen.
  • Pertahankan ISR tetap singkat, gunakan variabel yang mudah menguap pada variabel bersama.
  • Secara khusus mencari kesalahan register, batas buffer, dan lebar tipe.
  • "Berhasil" dibuktikan dengan osiloskop, penganalisis logika, dan log serial, bukan dengan kompiler.
  • Jika nilai terukur tidak sesuai dengan perhitungan, ikuti asumsinya.

Tugas aplikasi

Dengan mikrokontroler yang Anda miliki (Arduino, STM32, ESP32), mintalah PWM atau tugas berkala kepada AI pada frekuensi tertentu. Sebelum memuat kode: (1) verifikasi nilai frekuensi/waktu secara independen dari akun di baris komentar, (2) periksa volatilitas dan pemblokiran di variabel ISR dan bersama. Setelah diunggah, ukur frekuensi aktual dengan osiloskop atau penganalisis logika dan bandingkan dengan target. Apabila terdapat penyimpangan, carilah sumbernya dan perbaiki, serta catat apa yang dianggap salah.