หน่วย 3 / 9

ระบบสมองกลฝังตัวและรหัสไมโครคอนโทรลเลอร์

กำไร:

  • ความสามารถในการกำหนดข้อกำหนดการลงทะเบียน การขัดจังหวะ และเวลาสำหรับไมโครคอนโทรลเลอร์พร้อมการแจ้งเตือนที่ชัดเจน
  • ความสามารถในการตรวจสอบโค้ด C/Arduino ที่ AI สร้างขึ้นในแง่ของการตั้งค่ารีจิสเตอร์ บัฟเฟอร์ล้น และข้อจำกัดแบบเรียลไทม์
  • ความสามารถในการใช้นิสัยในการตรวจสอบรหัสที่สร้างขึ้นโดยการวัดบนฮาร์ดแวร์ (ออสซิลโลสโคป, พอร์ตอนุกรม)

การพัฒนาระบบสมองกลฝังตัวคือจุดที่ซอฟต์แวร์และฮาร์ดแวร์ตัดกัน: การตั้งค่าบิตรีจิสเตอร์ไม่ถูกต้อง การระงับการขัดจังหวะนานเกินไป หรือการล้นบัฟเฟอร์จะทำให้เกิดความล้มเหลวที่แปลกประหลาดและยากที่จะทำซ้ำในภาคสนาม แม้ว่าโค้ดจะ "คอมไพล์" และรันก็ตาม AI เป็นตัวเร่งในด้านนี้อย่างแท้จริง มันสามารถสร้างโครงกระดูกเริ่มต้น ฟังก์ชันการลบล้างฮาร์ดแวร์ เครื่องควบคุมสถานะ และกิจวัตรการสื่อสาร แต่ AI ไม่เห็นเอกสารข้อมูลของการ์ดของคุณ ไม่ทราบความถี่สัญญาณนาฬิกาของคุณ และไม่รับรู้ถึงข้อจำกัดแบบเรียลไทม์ของคุณ ในหน่วยนี้ เราจะกล่าวถึงวิธีกำหนดการทำงานของไมโครคอนโทรลเลอร์ให้กับ AI อย่างชัดเจน วิธีตรวจสอบโค้ด C/Arduino ที่สร้างขึ้น และเหตุผลที่คุณควรวัดทุกอย่างในฮาร์ดแวร์

การกำหนดความต้องการให้ชัดเจน: การลงทะเบียน การตัด การกำหนดเวลา

การบอกให้ AI "เปิดไฟ LED" จะไม่ทำงาน การ์ดใบไหน พินไหน ความถี่สัญญาณนาฬิกาไหน ไทม์มิ่งไหน? เมื่อมอบหมายงานที่ฝังตัวให้กับ AI ให้ใช้เฟรมเวิร์กนี้: ฮาร์ดแวร์ (ตระกูล MCU, นาฬิกา, พิน), ฟังก์ชัน (สิ่งที่จะเกิดขึ้น), ข้อจำกัด (เวลา, พลังงาน, หน่วยความจำ) และอินเทอร์เฟซ (รีจิสเตอร์, HAL, ไลบรารี Arduino)

พรอมต์ที่อ่อนแอ / พรอมต์ที่แข็งแกร่ง

อ่อนแอ: "สร้าง PWM ด้วย STM32" (ผลลัพธ์: ตัวจับเวลาใด, ความถี่ใด, ขาใดไม่ชัดเจน; ทั่วไป, รหัสชื่อรีจิสเตอร์ผิด) STRONG: "สร้าง PWM หน้าที่ปรับได้ 20 kHz, 0-100% บน TIM3 CH1 (PA6) สำหรับ STM32F103 (นาฬิการะบบ 72 MHz) เขียนที่ระดับรีจิสเตอร์ (ไม่ใช่ HAL) - ค่า Prescaler และ ARR สำหรับ 20 kHz CALCULATE และแสดงการคำนวณในบรรทัดแสดงความคิดเห็น - กำหนดหน้าที่ด้วย พารามิเตอร์ฟังก์ชันระหว่าง 0-100 - แสดงความคิดเห็นแต่ละบิตรีจิสเตอร์ที่คุณใช้ โปรดทราบว่าค่าจะเปลี่ยนไปหากสมมติฐานนาฬิกาของคุณผิด

ข้อแตกต่างก็คือพรอมต์ที่ทรงพลังทำให้โมเดลแสดงการคำนวณและเปิดเผยสมมติฐานของนาฬิกา คุณจึงสามารถตรวจสอบค่าพรีสเกลเลอร์/ARR ได้อย่างอิสระ:

สำหรับ 20 kHz PWM (นาฬิกา 72 MHz):Timer_clock = 72 MHzหากเราต้องการพรีสเกลเลอร์ = 72-1 → นาฬิกาเคาน์เตอร์ = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49 การตรวจสอบ: 1e6 / (49+1) = 20 000 Hz ✓

การตรวจสอบรหัส AI: สิ่งที่ต้องมองหา

เพียงเพราะการคอมไพล์โค้ดที่สร้างขึ้นไม่ได้หมายความว่ามันทำงานได้อย่างถูกต้อง ทำตามรายการตรวจสอบนี้:

พื้นที่ควบคุม

สิ่งที่ต้องมองหา

การลงทะเบียน/การตั้งค่าบิต

เข้ากันได้ทุกประการกับแผ่นข้อมูล มาสก์บิตที่ถูกต้อง

ขัดจังหวะ (ISR)

สั้นมั้ย? ไม่มีความล่าช้าของตัวบล็อก? ใช้สารระเหยหรือไม่?

บัฟเฟอร์/อาร์เรย์

มีการควบคุมชายแดนหรือไม่? เสี่ยงล้น?

เวลา

ด้วยความล่าช้าหรือตัวจับเวลา? เป็นไปตามข้อจำกัดด้านเวลาจริงหรือไม่

ประเภทและความกว้าง

โอเวอร์โฟลว์ 8/16/32 บิต ความสับสนแบบลงนาม/ไม่ได้ลงนาม

อำนาจ/สุนัขเฝ้าบ้าน

สุนัขเฝ้าบ้านให้อาหารวนไม่สิ้นสุด?

รูทีนการบริการขัดจังหวะ (ISR) เป็นสาเหตุที่พบบ่อยที่สุดของข้อผิดพลาด บางครั้ง AI ก็ทำให้เกิดความล่าช้า() หรือการวนซ้ำแบบยาวภายใน ISR สิ่งนี้นำไปสู่การขัดจังหวะอื่นๆ ที่พลาดไปและรีเซ็ตโปรแกรมเฝ้าระวัง กฎ: ISR ควรสั้นที่สุดเท่าที่จะทำได้ งานหลักควรเป็นการตั้งค่าแฟล็กและย้ายไปยังลูปหลัก

// WEAK (AI บางครั้งสร้างสิ่งนี้): ฟังก์ชัน Blocker ใน ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // อาจใช้เวลานาน - BAD CASE_Delay(10); // ความล่าช้าใน ISR - แย่มาก }}// แข็งแกร่ง: ISR สั้น; งานย้ายไปที่ loopvolatile หลัก uint8_t Tick_flag = 0; // สภาพระเหยเป็นโมฆะ TIM3_IRQHandler (เป็นโมฆะ) { ถ้า (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; ติ๊ก_แฟล็ก = 1; //เพียงตั้งค่าสถานะ }}// ในลูปหลัก:if (tick_flag) { mark_flag = 0; read_sensor(); }

ข้อควรระวัง: ตัวแปรใดๆ ที่ใช้ร่วมกันระหว่างอินเทอร์รัปต์และลูปหลักจะต้องมีความผันผวน มิฉะนั้น คอมไพลเลอร์อาจแคชตัวแปรในการลงทะเบียนและพลาดการอัปเดต AI มักจะลืมคำสำคัญนี้ มองหามันโดยเฉพาะเมื่ออ่านโค้ด

บัฟเฟอร์ล้นและข้อผิดพลาดประเภท

AI สามารถคัดลอกข้อมูลจากพอร์ตอนุกรมไปยังอาเรย์ขนาดคงที่โดยไม่มีการตรวจสอบขอบเขต ในระบบฝังตัว นี่หมายถึงการพังหน่วยความจำที่ต่อเนื่องกันและการหยุดทำงานที่ไม่สามารถอธิบายได้ ตรวจสอบให้แน่ใจว่าได้ตรวจสอบขีดจำกัดที่ strcpy, ดัชนีอาร์เรย์ และบัฟเฟอร์ DMA แต่ละรายการ ในทำนองเดียวกัน ตัวนับ 8 บิตจะรีเซ็ตหลังจาก 255; AI สามารถเพิกเฉยต่อสิ่งนี้และพึ่งพาบัญชีที่ล้นได้

การตรวจสอบยืนยันในฮาร์ดแวร์: "การทำงาน" เป็นการวัด ไม่ใช่สันนิษฐาน

ในระบบฝังตัว หลักฐานที่น่าเชื่อถือที่สุดคือมิเตอร์ ไม่ใช่คอมไพเลอร์ ตรวจสอบรหัสที่สร้างขึ้นด้วยสามวิธีเหล่านี้:

  1. ออสซิลโลสโคป/เครื่องวิเคราะห์ลอจิก: วัดความถี่ PWM, จังหวะสัญญาณ และรูปคลื่นการสื่อสาร หากคุณต้องการ 20 kHz โปรดดู 20 kHz บนหน้าจอ
  2. บันทึกพอร์ตอนุกรม (UART): พิมพ์ค่าตัวแปร การเปลี่ยนสถานะ และตัวนับข้อผิดพลาด และเปรียบเทียบกับลักษณะการทำงานที่คาดหวัง
  3. การทดสอบ Bound และ Stress: ทดสอบว่าระบบรองรับโหลดสูงสุด ข้อมูลที่เร็วที่สุด และเวลาที่แย่ที่สุดหรือไม่

หากค่าที่วัดได้ไม่สอดคล้องกับการคำนวณ สมมติฐานของนาฬิกา ค่าพรีสเกลเลอร์ หรือการตั้งค่ารีจิสเตอร์ไม่ถูกต้อง ไล่ล่า.

มินิเคส

ทีมนักศึกษาให้ AI พิมพ์รหัสวัดระยะทางด้วยเซ็นเซอร์อัลตราโซนิก HC-SR04 โค้ดคอมไพล์แต่ระยะทางจะให้ค่าที่ไร้สาระเสมอ เมื่อเชื่อมต่อกับออสซิลโลสโคป พวกเขาเห็นว่าขาสะท้อนคำนวณเวลาเป็นมิลลิวินาทีแทนที่จะเป็นไมโครวินาที AI ใช้ millis() แทน micros() ข้อผิดพลาดเพียงคำเดียวนี้ทำให้การวัดทั้งหมดสับสนถึง 1,000 เท่า เมื่อพวกเขาพิมพ์เวลาสะท้อนดิบลงในบันทึกอนุกรมและเปรียบเทียบกับไม้บรรทัดจริง พวกเขาพบข้อผิดพลาดและแก้ไข บทเรียน: โค้ดที่คอมไพล์ไม่ใช่โค้ดที่ถูกต้อง การวัดในฮาร์ดแวร์จะเผยให้เห็นข้อผิดพลาดทันที

ข้อผิดพลาดทั่วไป

  • การยอมรับชื่อรีจิสเตอร์และบิตมาสก์โดยไม่ต้องเปรียบเทียบกับแผ่นข้อมูล
  • อนุญาตให้บล็อกความล่าช้าหรือการประมวลผลที่ยาวนานภายใน ISR
  • ลืมความผันผวนของตัวแปรที่ใช้ร่วมกัน
  • บายพาสบัฟเฟอร์และการตรวจสอบขอบเขตอาเรย์ ไม่เห็นล้น
  • อาศัยสมมติฐานด้านความถี่สัญญาณนาฬิกาและจังหวะเวลาโดยไม่ต้องตรวจสอบ
  • พิจารณาโค้ด "ใช้งานได้" โดยไม่ต้องวัดด้วยออสซิลโลสโคป/บันทึกอนุกรม

โดยสรุป

  • กำหนดงานที่ฝังไว้อย่างชัดเจนในแง่ของฮาร์ดแวร์ ฟังก์ชัน ข้อจำกัด และอินเทอร์เฟซ
  • ให้ AI คำนวณค่าเวลา เช่น พรีสเกลเลอร์/ARR และตรวจสอบค่าต่างๆ อย่างอิสระ
  • ทำให้ ISR สั้น ใช้ความผันผวนกับตัวแปรที่ใช้ร่วมกัน
  • ค้นหาข้อผิดพลาดของการลงทะเบียน ขีดจำกัดบัฟเฟอร์ และความกว้างของประเภทโดยเฉพาะ
  • "ใช้งานได้" ได้รับการพิสูจน์แล้วด้วยออสซิลโลสโคป เครื่องวิเคราะห์ลอจิก และบันทึกซีเรียล ไม่ใช่ด้วยคอมไพเลอร์
  • หากค่าที่วัดได้ไม่สอดคล้องกับการคำนวณให้ไล่ตามสมมติฐาน

งานสมัคร

ด้วยไมโครคอนโทรลเลอร์ที่คุณมี (Arduino, STM32, ESP32) ให้ถาม AI สำหรับ PWM หรืองานเป็นระยะที่ความถี่ที่แน่นอน ก่อนที่จะโหลดโค้ด: (1) ตรวจสอบค่าความถี่/เวลาโดยไม่ขึ้นอยู่กับบัญชีในบรรทัดความคิดเห็น (2) ตรวจสอบความผันผวนและการบล็อกใน ISR และตัวแปรที่ใช้ร่วมกัน หลังจากการอัปโหลด ให้วัดความถี่จริงด้วยออสซิลโลสโคปหรือเครื่องวิเคราะห์ลอจิกแล้วเปรียบเทียบกับเป้าหมาย หากมีการเบี่ยงเบน ให้ค้นหาแหล่งที่มาและแก้ไข และจดบันทึกสิ่งที่สันนิษฐานว่าผิด