Satuan 3 / 9

Sistem Tertanam dan Pembuatan Kode Mikrokontroler

Keuntungan:

  • Kemampuan untuk menghasilkan kode tertanam berdasarkan register dan konteks perangkat keras untuk Arduino/STM32/ESP32 dengan AI
  • Kemampuan untuk mengenali dan memperbaiki pola yang tertanam seperti interupsi, pengatur waktu, dan loop non-pemblokiran dalam keluaran AI
  • Kemampuan untuk meninjau kode yang dihasilkan dalam hal memori, waktu nyata dan keamanan sebelum mengunggahnya ke perangkat keras

Dalam mekatronik, mikrokontroler adalah tempat bertemunya ide dengan dunia fisik. Kartu seperti Arduino, STM32, ESP32; ia membaca sensor, menggerakkan aktuator, berkomunikasi, dan melakukan semua ini dalam memori terbatas, daya pemrosesan terbatas, dan persyaratan waktu yang ketat. Kecerdasan buatan sangat berguna dalam bidang ini: ia dapat mengekstrak pengaturan register berdasarkan lembar data sensor, mengkodekan protokol komunikasi, mengatur interupsi pengatur waktu. Namun sistem tertanam adalah salah satu area di mana AI menghasilkan “kebohongan yang paling meyakinkan”; karena alamat register, masker bit, dan perilaku pengaturan waktu khusus untuk papan dan satu kesalahan bit mengganggu keseluruhan perilaku. Dalam unit ini, kami membahas cara membuat kode tertanam yang dihasilkan dengan AI dan cara meninjaunya sebelum memuatnya ke perangkat keras.

Perbedaan Kode Tertanam dan Perangkat Lunak Murni

Program desktop memiliki banyak memori, sistem operasi, dan kemudahan debugging. Kode yang disematkan tidak memiliki sebagian besar hal berikut:

Ukuran

desktop

sistem tertanam

memori

tingkat GB

Tingkat KB (misalnya RAM 2 KB)

waktu

Umumnya fleksibel

Ketat, waktu nyata

melakukan debug

Mudah (debugger, log)

Keras (JTAG, serial, LED)

Hasil kesalahan

Programnya mogok

Aktuator/perangkat keras mungkin rusak

akses sumber daya

abstrak OS

Akses langsung ke Daftar

Perbedaan ini menentukan kriteria Anda untuk mengevaluasi keluaran AI: penggunaan memori, waktu nyata (non-pemblokiran), dan akurasi register perangkat keras selalu menjadi prioritas utama Anda.

Kode Pemblokir vs Non-Pemblokiran

Kesalahan paling umum yang dilakukan oleh pemula (dan sering dilakukan oleh AI) adalah penggunaan penundaan(). delay(1000) mengunci prosesor selama 1 detik; Selama periode ini, tidak ada sensor lain yang dapat dibaca, tidak ada tombol yang dapat dikontrol. Hal ini tidak dapat diterima dalam mekatronika. Sebagai gantinya, pola non-pemblokiran berbasis millis() digunakan.

// BURUK: pemblokir -- prosesor tidak dapat melakukan pekerjaan lain selama 1 detik void loop() { digitalWrite(LED, HIGH); penundaan(1000); // semuanya berhenti digitalWrite(LED, LOW); penundaan(1000); // Tombol darurat tidak dapat dibaca saat ini!}// BAIK: tidak memblokir -- loop tidak diblokir, tugas lain dijalankan jika (nowMs - previousMs >= interval) { previousMs = nowMs; ledStatus = !ledStatus; digitalWrite(LED, ledStatus); } tombolPeriksa(); // dapat dijalankan pada setiap siklus sensorRead(); //dapat berjalan di loop mana pun}

Pola non-pemblokiran adalah dasar dari mekatronik tertanam: putaran kontrol mengalir terus menerus, tidak ada tugas yang mengunci tugas lainnya. Memberi tahu AI untuk "jangan gunakan penundaan, tulis non-pemblokiran berbasis milis" saat menulis kode secara langsung meningkatkan kualitas keluaran.

Tip: Carilah penundaan (dalam kode yang tertanam dari AI. Jika Anda melihat penundaan dalam loop kontrol utama, sering kali kode tersebut tidak cocok untuk sistem real-time dan harus ditulis ulang.

Interupsi dan Timer

Kami menangkap peristiwa penting waktu (pulsa encoder, tombol, pengambilan sampel berkala) dengan interupsi alih-alih menunggu di loop utama. Rutinitas interupsi (ISR) harus ditulis singkat dan hati-hati: tidak ada penundaan, Serial.print atau perhitungan panjang di dalamnya; Variabel bersama ditandai dengan volatilitas.

encoderCounter panjang yang mudah menguap = 0; // ISR dan loop dibagikan -> kondisi volatil void enkoderISR() { // ISR pendek: hitung saja, jangan lakukan pekerjaan lain if (digitalRead(ENC_B)) enkoderCounter++; lain encoderCounter--;}void setup() { pinMode(ENC_A, INPUT_PULLUP); pinMode(ENC_B, INPUT_PULLUP); lampirkanInterrupt(digitalPinToInterrupt(ENC_A), enkoderISR, RISING);}void loop() { penghitung panjang; tidak ada Interupsi(); //interupsi singkat untuk penghitung pembacaan atom = encoderCounter; interupsi(); //bertransaksi dengan aman menggunakan konter...}

Tiga poin penting dalam contoh ini yang sering terlewatkan oleh AI: (1) encoderCounter yang dibagikan harus `volatile` atau pengoptimalan kompiler akan melewatkan pembaruan; (2) ISR harus pendek; (3) Saat membaca variabel multi-byte di loop utama, interupsi untuk pembacaan atom harus ditutup untuk waktu yang singkat, jika tidak, ISR dapat mengintervensi selama pembacaan dan setengah/nilai rusak dapat dibaca (kondisi balapan). Pastikan untuk memeriksa apakah ketiganya ada dalam kode AI.

Akurasi Daftar dan Lembar Data

AI dapat salah menggambarkan alamat register sensor atau bit konfigurasi MCU. Misalnya, register manajemen daya IMU MPU6050 adalah 0x6B; Jika AI memberikan ini sebagai 0x6A, kode dikompilasi, tampaknya berfungsi, tetapi sensor tidak bangun. Kesalahan seperti itu hanya terdeteksi jika dibandingkan dengan lembar data.

// Bangun MPU6050: menurut datasheet PWR_MGMT_1 = 0x6B, nilai 0x00#define MPU_ADDR 0x68#define PWR_MGMT_1 0x6B // <-- VERIFY dari datasheetWire.beginTransmission(MPU_ADDR);Wire.write(PWR_MGMT_1);Wire.write(0x00); // bangun dari mode tidurWire.endTransmission(true);

Perhatian: Verifikasi setiap alamat register, bit mask, dan alamat I2C/SPI yang diberikan oleh AI dari lembar data. Nilai-nilai ini khusus untuk kartu dan chip; Nilai yang "diingat" AI mungkin berasal dari revisi chip lain. Pendaftaran yang salah secara diam-diam menyebabkan perilaku yang salah.

Prompt Lemah / Prompt Kuat

LEMAH:"Baca sensor suhu di ESP32."(Sensor yang mana? Protokol yang mana? Pin yang mana? Generik, mungkin kode yang salah.)KUAT:"Baca sensor suhu DS18B20 di ESP32 (kerangka Arduino) dari GPIO4 dengan OneWire. Tulis non-blocking, sampel setiap 1 detik (menggunakan penundaan, berbasis milis). Setel tanda kesalahan jika terjadi kesalahan baca (nilai tetap -127 atau 85). Harap tentukan setiap perpustakaan dan koneksi pin yang Anda gunakan di komentar pertama. Untuk alasan memori, gunakan buffer char alih-alih String."

Perintah yang kuat; Ini memberikan chip, kerangka kerja, sensor, protokol, pin, pola pengambilan sampel, status kesalahan dan batasan memori. Dengan cara ini hasilnya dapat diverifikasi dan realistis.

Tinjau Daftar Periksa untuk Kode Tersemat

Sebelum memuat keluaran AI, teruskan melalui daftar ini:

  1. Pemblokiran: Apakah ada penundaan atau pemblokiran yang lama di loop utama?
  2. volatil: Apakah variabel yang digunakan bersama dengan ISR bersifat volatil?
  3. Akses atom: Apakah variabel bersama multi-byte aman untuk dibaca?
  4. Daftar: Apakah alamat dan bit mask kompatibel dengan lembar data?
  5. Memori: String, array besar, apakah rekursi membuat level KB meluap?
  6. Penanganan kesalahan: Apakah kesalahan pembacaan sensor, batas waktu komunikasi ditangani?
  7. Safe start: Apakah output aktuator ditempatkan pada kondisi aman (pasif) saat startup?

Kasus Mini

Insinyur sistem tertanam, Baran, meminta AI menulis kode yang membaca IMU untuk drone. Kode dikompilasi dan tampaknya berfungsi, tetapi nilai sudutnya tidak ada artinya. Baran menerapkan daftar periksa: membandingkan alamat register dengan lembar data dan menemukan bahwa AI salah mengeluarkan register konfigurasi giroskop (0x1A bukan 0x1B), sehingga skala sensitivitasnya salah. Setelah dikoreksi, nilainya ditetapkan. Kemudian tunda(10) pemberitahuan di loop utama; mengubahnya menjadi struktur berbasis milis, karena memblokir loop kontrol penerbangan tidak dapat diterima. Terakhir, ia melihat bahwa variabel penghitung bersama tidak mudah berubah dan menambahkannya. AI memberikan kerangka itu dengan cepat; Namun daftar tinjauan menemukan tiga kesalahan terpisah: register, pemblokiran, dan volatil, dan perangkat keras tidak berisiko sama sekali.

Kesalahan Umum

  • Membunuh respons waktu nyata dengan menggunakan penundaan() di loop kontrol utama.
  • Hindari membuat variabel yang dibagikan dengan ISR tidak stabil dan mengalami kerusakan data diam-diam.
  • Membaca variabel bersama multi-byte secara non-atom dan menghasilkan kondisi balapan.
  • Tidak memverifikasi register/bit mask yang diberikan oleh AI dengan lembar data.
  • Membuat memory overflow dengan menggunakan String dan array besar dalam RAM terbatas.
  • Lupa mengamankan keluaran aktuator pada awalnya.

Singkatnya

  • Kode tertanam; Ini beroperasi dengan memori terbatas, waktu ketat, dan akses register langsung.
  • Di loop utama, pola non-pemblokiran berbasis milis digunakan sebagai pengganti penundaan.
  • ISR dibuat pendek; variabel yang dibagikan harus mudah menguap dan dapat diakses secara atomik.
  • Alamat register dan bit mask selalu diverifikasi berdasarkan lembar data; AI bisa saja salah.
  • Memori, penanganan kesalahan, dan status pengaktifan aman selalu diperiksa.
  • Perintah yang kuat; Ini mencakup chip, kerangka kerja, sensor, protokol, pin, dan batasan.

Tugas aplikasi

Pilih sensor (misalnya DS18B20, MPU6050 atau HC-SR04) dan mikrokontroler (Arduino/ESP32/STM32). Minta AI menghasilkan kode baca non-pemblokiran dengan template prompt yang kuat di unit ini. Kemudian ikuti tujuh item daftar periksa tinjauan satu per satu: bandingkan setidaknya satu nilai register/pin dengan lembar data, periksa penundaan loop, periksa status volatil dari variabel bersama. Berapa banyak item yang "lulus" pada percobaan pertama dan berapa banyak koreksi yang diperlukan? Catat setiap masalah yang Anda temukan dan perbaikannya.