Keuntungan:
- Keupayaan untuk menentukan keperluan daftar, gangguan dan pemasaan untuk mikropengawal dengan gesaan yang jelas
- Keupayaan untuk menyemak kod C/Arduino yang dihasilkan oleh AI dari segi tetapan daftar, limpahan penimbal dan kekangan masa nyata
- Keupayaan untuk menggunakan tabiat mengesahkan kod yang dihasilkan dengan mengukurnya pada perkakasan (osiloskop, port bersiri)
Pembangunan sistem terbenam ialah tempat perisian dan perkakasan bersilang: menetapkan bit daftar secara tidak betul, menahan sampukan terlalu lama, atau melimpah penimbal akan menyebabkan kegagalan yang aneh dan sukar untuk dihasilkan semula dalam medan, walaupun kod itu "menghimpun" dan berjalan. AI benar-benar pemecut dalam bidang ini; Ia boleh menghasilkan rangka awal, fungsi abstraksi perkakasan, mesin keadaan dan rutin komunikasi. Tetapi AI tidak melihat lembaran data kad anda, tidak mengetahui kekerapan jam anda dan tidak merasakan kekangan masa sebenar anda. Dalam unit ini, kami akan membincangkan cara mentakrifkan kerja mikropengawal dengan jelas kepada AI, cara menyemak kod C/Arduino yang dijana, dan sebab anda perlu mengukur segala-galanya dalam perkakasan.
Menentukan Keperluan Dengan Jelas: Daftar, Pemotongan, Masa
Memberitahu AI untuk "menyalakan LED" tidak akan berfungsi; Kad yang mana, pin yang mana, frekuensi jam yang mana, pemasaan yang mana? Apabila memberikan tugasan terbenam kepada AI, gunakan rangka kerja ini: perkakasan (keluarga MCU, jam, pin), fungsi (apa yang akan berlaku), kekangan (masa, kuasa, memori) dan antara muka (daftar, HAL, perpustakaan Arduino).
Gesaan Lemah / Gesaan Kuat
LEMAH: "Hasilkan PWM dengan STM32." (Hasil: pemasa yang mana, frekuensi mana, pin mana yang tidak jelas; umum, mungkin kod nama daftar yang salah.) KUAT: "Hasilkan 20 kHz, 0-100% tugas boleh laras PWM pada TIM3 CH1 (PA6) untuk STM32F103 (jam sistem 72 MHz). Tulis pada tahap daftar (bukan HAL) Tunjukkan nilai kHz calcULA dan ARR dalam prascaler dan ARR. baris komen. - Tetapkan tugas dengan parameter fungsi antara 0-100 - Komen setiap bit daftar yang anda gunakan.
Perbezaannya ialah gesaan yang berkuasa menjadikan model menunjukkan pengiraan dan mendedahkan andaian jam. Jadi anda boleh menyemak nilai prescaler/ARR secara bebas:
Untuk 20 kHz PWM (jam 72 MHz):Jam_Pemasa = 72 MHzJika kita mahu praskala = 72-1 → jam pembilang = 1 MSARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49Pengesahan: 1e6 / (49+1) = 20 Hz
Mengaudit Kod AI: Apa yang Perlu Diperhatikan?
Hanya kerana kod yang dijana menyusun tidak bermakna ia berfungsi dengan betul. Ikuti senarai semak ini:
kawasan kawalan
Apa yang perlu dicari
Tetapan daftar/bit
Betul-betul serasi dengan lembaran data, topeng bit yang betul
Gangguan (ISR)
Adakah ia pendek? Tiada kelewatan penyekat? Adakah tidak menentu digunakan?
penimbal/tatasusunan
Adakah terdapat kawalan sempadan? Risiko limpahan?
masa
Dengan kelewatan atau pemasa? Adakah kekangan masa sebenar dipenuhi?
Jenis dan lebar
Limpahan 8/16/32-bit, kekeliruan yang ditandatangani/tidak ditandatangani
kuasa/pengawas
Pengawas makan gelung tak terhingga?
Rutin perkhidmatan gangguan (ISR) adalah sumber ralat yang paling biasa. AI kadangkala meletakkan kelewatan() atau gelung panjang di dalam ISR. Ini menyebabkan gangguan lain terlepas dan penetapan semula badan pemerhati. Peraturan: ISR hendaklah sesingkat mungkin; Tugas utama adalah untuk menyediakan bendera dan memindahkannya ke gelung utama.
// WEAK (AI kadangkala menghasilkan ini): Fungsi penyekat dalam ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; baca_sensor(); // mungkin mengambil masa yang lama - BAD CASE_Delay(10); // kelewatan dalam ISR - SANGAT BURUK }}// KUAT: ISR pendek; kerja berpindah ke gelung utama uint8_t tick_flag = 0; // KEADAAN yang tidak menentuvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; tick_flag = 1; //hanya tetapkan bendera }}// dalam gelung utama:if (tick_flag) { tick_flag = 0; baca_sensor(); }
Awas: Sebarang pembolehubah yang dikongsi antara gangguan dan gelung utama mestilah tidak menentu. Jika tidak, pengkompil mungkin cache pembolehubah dalam daftar dan terlepas kemas kini. AI sering terlupa kata kunci ini; Cari ia secara khusus semasa membaca kod.
Ralat Limpahan Penampan dan Jenis
AI boleh menyalin data daripada port bersiri ke dalam tatasusunan bersaiz tetap tanpa semakan sempadan. Dalam sistem terbenam, ini bermakna menghancurkan memori bersebelahan dan ranap yang tidak dapat dijelaskan. Pastikan had disemak pada setiap strcpy, indeks tatasusunan dan penimbal DMA. Begitu juga, kaunter 8-bit ditetapkan semula selepas 255; AI boleh mengabaikan perkara ini dan bergantung pada akaun yang melimpah.
Pengesahan dalam Perkakasan: "Berfungsi" Diukur, Tidak Diandaikan
Dalam sistem terbenam, bukti yang paling boleh dipercayai ialah meter, bukan pengkompil. Sahkan kod yang dijana dalam tiga cara ini:
- Osiloskop/penganalisis logik: Ukur frekuensi PWM, pemasaan isyarat dan bentuk gelombang komunikasi. Jika anda mahukan 20 kHz, lihat 20 kHz pada skrin.
- Log port bersiri (UART): Cetak nilai pembolehubah, peralihan keadaan dan pembilang ralat dan bandingkan dengan tingkah laku yang dijangkakan.
- Ujian terikat dan tekanan: Uji sama ada sistem bertahan di bawah beban tertinggi, data terpantas dan pemasaan yang paling teruk.
Jika nilai yang diukur tidak bersetuju dengan pengiraan, andaian jam, nilai praskala atau tetapan daftar adalah tidak betul; mengejar.
Mini Case
Sekumpulan pelajar mempunyai AI mencetak kod ukuran jarak dengan sensor ultrasonik HC-SR04. Kod menyusun tetapi jarak sentiasa memberikan nilai yang tidak masuk akal. Apabila mereka menyambungkannya ke osiloskop, mereka melihat bahawa kaki gema mengira masanya dalam milisaat dan bukannya mikrosaat; AI menggunakan millis() dan bukannya micros(). Ralat satu perkataan ini mengelirukan keseluruhan ukuran dengan faktor 1000. Apabila mereka mencetak masa gema mentah ke dalam log bersiri dan membandingkannya dengan pembaris sebenar, mereka mencari ralat dan membetulkannya. Pengajaran: kod yang disusun bukan kod yang betul; Pengukuran dalam perkakasan mendedahkan ralat dengan serta-merta.
Kesilapan Biasa
- Menerima nama daftar dan topeng bit tanpa membandingkannya dengan lembaran data.
- Membenarkan kelewatan menyekat atau pemprosesan lama dalam ISR.
- Melupakan tidak menentu pada pembolehubah yang dikongsi.
- Pintasan penimbal dan semakan sempadan tatasusunan; tidak melihat limpahan.
- Bergantung pada kekerapan jam dan andaian masa tanpa mengesahkannya.
- Memandangkan kod "berfungsi" tanpa mengukurnya dengan log osiloskop/siri.
Secara ringkasnya
- Tentukan tugas yang dibenamkan dengan jelas dari segi perkakasan, fungsi, kekangan dan antara muka.
- Minta AI mengira nilai pemasaan seperti prescaler/ARR dan sahkannya secara bebas.
- Pastikan ISR pendek, gunakan tidak menentu pada pembolehubah yang dikongsi.
- Cari secara khusus untuk ralat daftar, had penimbal dan lebar taip.
- "Ia berfungsi" dibuktikan dengan osiloskop, penganalisis logik dan log bersiri, bukan dengan pengkompil.
- Jika nilai yang diukur tidak bersetuju dengan pengiraan, kejar andaian.
Tugasan permohonan
Dengan mikropengawal yang anda miliki (Arduino, STM32, ESP32), minta AI untuk PWM atau tugas berkala pada frekuensi tertentu. Sebelum memuatkan kod: (1) sahkan nilai kekerapan/masa secara bebas bagi akaun dalam baris ulasan, (2) semak untuk tidak menentu dan menyekat dalam ISR dan pembolehubah kongsi. Selepas memuat naik, ukur kekerapan sebenar dengan osiloskop atau penganalisis logik dan bandingkan dengan sasaran. Jika terdapat penyelewengan, cari sumber dan betulkan, dan perhatikan apa yang diandaikan salah.