กลับไปหน้ารวมไฟล์
arduino-uno-debugging-960f0b.md

เมื่อคุณไม่สามารถหาสาเหตุของปัญหาที่เกิดขึ้นในโปรเจกต์ของคุณขณะรันไทม์ได้ เครื่องมือดีบัก (Debugging Tools) สามารถช่วยลดความยุ่งยากได้มาก แต่คุณต้องหาเครื่องมือดีบักฮาร์ดแวร์ก่อน...

ในการพัฒนาระบบฝังตัว (embedded systems) เรามักพบปัญหาที่คาดเดาไม่ได้ขณะรันไทม์ การติดตามข้อผิดพลาดโดยใช้เพียง Serial.print() อาจไม่เพียงพอและใช้เวลามาก ดังนั้นเครื่องมือดีบักจึงเป็นทางออกสำคัญในการประหยัดเวลาและลดความซับซ้อน อย่างไรก็ตาม บอร์ดที่ใช้ AVR เช่น Arduino Uno มักต้องการเครื่องมือดีบักฮาร์ดแวร์ภายนอก (เช่น Atmel-ICE) ซึ่งมีราคาแพงและต้องต่อสายเพิ่มเติมที่ยุ่งยาก

GDBStub เป็นเทคโนโลยีที่ช่วยแก้ไขข้อจำกัดเหล่านี้ มันทำหน้าที่เป็น "ตัวแทนซอฟต์แวร์ (Software Agent)" ขนาดเล็กที่ฝังอยู่ในหน่วยความจำของ Arduino Uno (หรือบอร์ด AVR อื่นๆ) เพื่อสื่อสารโดยตรงกับโปรโตคอล GDB (GNU Debugger) บนคอมพิวเตอร์ผ่านพอร์ตอนุกรม (Serial port) สิ่งนี้ช่วยให้สามารถดีบักแบบโต้ตอบได้ เช่น หยุดโปรแกรมชั่วคราว (Break), รันโปรแกรมทีละบรรทัด (Step-through), และตรวจสอบค่าที่อยู่ในรีจิสเตอร์หรือตัวแปรต่างๆ โดยไม่จำเป็นต้องใช้เครื่องมือดีบักฮาร์ดแวร์ราคาแพง

GDBStub ช่วยให้เราสามารถใช้ระบบดีบัก GDB โดยตรงบนบอร์ด Arduino Uno (หรือเป้าหมาย AVR อื่นๆ) โดยไม่ต้องซื้อและต่อสายเครื่องมือดีบักฮาร์ดแวร์

ข้อเสียเพียงอย่างเดียวคือมันใช้พอร์ตอนุกรมของเรา ดังนั้นเราจะต้องเชื่อมต่อ SoftwareSerial ด้วย เพื่อที่เราจะยังคงสามารถใช้คำสั่ง Serial.print แบบกำหนดเองของเราได้ ขณะที่ทำการดีบักฮาร์ดแวร์ไปพร้อมกัน ข้อจำกัดเพียงอย่างเดียวคือ GDBStub จะใช้การสื่อสารข้อมูลดีบักผ่าน Hardware Serial (พิน 0 และ 1) ดังนั้นเราจึงต้องเปลี่ยนมาใช้ SoftwareSerial สำหรับการส่งข้อมูลอนุกรมทั่วไป ดังที่เราเคยทำมาก่อน เพื่อที่เราจะยังคงสามารถดูบันทึก (logs) หรือพิมพ์ค่าต่างๆ ได้พร้อมกับการดีบัก

การตั้งค่าฮาร์ดแวร์

เพียงแค่เชื่อมต่อสาย USB จาก Uno ไปยัง PC ของคุณตามปกติ

การเชื่อมต่อพื้นฐานยังคงใช้สาย USB เดียวกันจาก Arduino Uno ไปยัง PC สำหรับกระบวนการดีบัก อย่างไรก็ตาม หากคุณต้องการใช้ Serial Monitor เพื่อแสดงค่าตัวแปรทั่วไปขณะทำการดีบัก คุณจะต้องเพิ่มเส้นทางข้อมูลใหม่

หากคุณไม่ต้องการอินเทอร์เฟซอนุกรมเพิ่มเติม คุณสามารถข้ามส่วนที่เหลือของหัวข้อนี้ได้

เราจะใช้โมดูล USB to TTL Serial Breakout (มักใช้ชิปเช่น CP2102 หรือ FT232RL) เพื่อทำหน้าที่เป็นพอร์ตสื่อสารทางเลือก ต่อสายจาก Uno ของคุณไปยังบอร์ด USB TTL Serial breakout ดังแสดงด้านล่าง

เชื่อมต่อสายดังต่อไปนี้:

  • Uno พิน 2 (RX) ต่อกับ TX ของ Serial Breakout
  • Uno พิน 3 (TX) ต่อกับ RX ของ Serial Breakout
  • เชื่อมต่อ GND ของทั้งสองบอร์ดเข้าด้วยกัน

(Rx/Tx สามารถเปลี่ยนแปลงได้ในซอฟต์แวร์ ดังนั้นหากพินที่ระบุถูกใช้งานอยู่ ให้กำหนดไปยังพินอื่นแทน)

การต่อสายระหว่าง Arduino Uno กับบอร์ด USB TTL Serial

การตั้งค่าโปรแกรม

เปิดโปรเจกต์ที่คุณต้องการดีบัก

เริ่มต้นด้วยการเปิดโปรเจกต์ที่คุณต้องการดีบักใน Visual Micro (ส่วนเสริมสำหรับ Visual Studio) จากนั้นกำหนดค่าการตั้งค่าเพื่อแจ้งให้ IDE ทราบว่าเราจะใช้ GDB Stub แทนฮาร์ดแวร์ปกติ จากนั้นเราสามารถกำหนดค่า Visual Micro IDE ของเราเพื่อการดีบักได้โดยเลือกตัวเลือกที่แสดงด้านล่าง:-

ตัวเลือกการกำหนดค่า GDB Stub

การติดตั้งไลบรารี GDBStub

คุณสามารถติดตั้งไลบรารี GDBStub ด้วยตนเอง หรือโดยใช้ Visual Micro Library Manager:

กุญแจสำคัญในการทำให้ Arduino Uno เข้าใจคำสั่ง GDB คือไลบรารี "avr-debugger" ที่พัฒนาโดย Jan Dolinay คุณสามารถติดตั้งได้ง่ายๆ ผ่าน Visual Micro Library Manager:

  1. ไปที่เมนู vMicro > Add Library > Download and Install Arduino Library > Manage Libraries Tab
  2. พิมพ์ "gdb" ในแถบค้นหา
  3. ค้นหาไลบรารีชื่อ "avr-debugger by Jan Dolinay" สำหรับบอร์ด Uno
  4. คลิกติดตั้ง เมื่อเสร็จสิ้นแล้ว ให้คลิกปุ่ม Rescan ที่ด้านบน จากนั้นปิด Visual Micro Explorer
ตัวจัดการไลบรารีแสดงไลบรารี GDB Stub

การเพิ่มโค้ดสำหรับ GDBStub

เพื่อใช้ประโยชน์จาก GDBStub เราจำเป็นต้องเพิ่มโค้ดไม่กี่บรรทัด:

เพื่อเปิดใช้งานระบบดีบัก เราจำเป็นต้องเพิ่มคำสั่งควบคุมลงใน Sketch ของเรา โดยยึดหลักสำคัญสามประการ:

  1. รวมเฮดเดอร์: เพิ่ม #include "avr8-stub.h" ที่จุดเริ่มต้นของโปรแกรมเพื่อนำเข้าฟังก์ชันและโครงสร้างที่จำเป็นสำหรับการจับสัญญาณจากดีบักเกอร์
  2. เริ่มต้น: วางฟังก์ชัน debug_init() ใน setup() เพื่อกำหนดค่า Vector Interrupt และเตรียมพอร์ตอนุกรม (Serial port) สำหรับการเชื่อมต่อกับพีซี
  3. เบรกพอยต์เริ่มต้น: การเพิ่ม breakpoint() ที่บรรทัดแรกของ loop() จะทำให้โปรแกรมหยุดทำงานทันทีเมื่อเริ่มต้น ช่วยให้เราตรวจสอบสถานะของมันก่อนที่ตรรกะหลักจะทำงานต่อไป
  • รวม avr8-stub.h
  • เพิ่ม debug_init() ลงในรูทีน setup() ของคุณ
  • เพิ่ม breakpoint() ที่ด้านบนของ loop()

การอัปเดตโค้ดสำหรับปัญหาอนุกรม

หากคุณไม่ได้ใช้ Serial Breakout คุณสามารถคอมเมนต์โค้ด Serial ทั้งหมดออกไปก่อนได้ (ห่อด้วย #define เพื่อให้สลับเปิดปิดได้ง่าย)

เนื่องจากพอร์ตอนุกรมหลัก (Serial port) ถูกสงวนไว้สำหรับการดีบัก เราควรปรับเปลี่ยนโค้ดที่มีอยู่เพื่อสลับไปใช้ SoftwareSerial เมื่ออยู่ในโหมดดีบัก โดยใช้ Preprocessor Directives เช่น #ifdef _DEBUG

หมายเหตุ - Visual Micro จะให้ _DEBUG โดยอัตโนมัติหากคุณเปิดใช้งานการตั้งค่าโปรเจกต์ "Configuration Define _DEBUG" และตั้งค่าเป็น 1 เมื่อคุณเปลี่ยนเป็นคอนฟิกูเรชัน "Release" โค้ดนี้จะถูกปิดใช้งาน

Visual Micro จะประกาศ _DEBUG โดยอัตโนมัติหากคุณเปิดใช้งานการตั้งค่าโปรเจกต์ "Configuration Define _DEBUG" เป็น 1 ซึ่งจะทำให้โค้ดเฉพาะสำหรับการดีบักหายไปเมื่อคุณสลับไปคอมไพล์ในโหมด "Release"

แนวทางปฏิบัติที่แนะนำ: เพื่อให้โค้ดทั้งหมดของคุณเข้ากันได้กับ SoftwareSerial และ Serial เราขอแนะนำให้คุณ:-

  • รวมไลบรารี Software Serial จาก vMicro > Add Library > Current Platform
  • เพิ่ม #define สำหรับออบเจ็กต์ Serial ที่ใช้ เช่น USE_SERIAL
  • เปลี่ยนการอ้างอิงทั้งหมดจาก Serial เป็น USE_SERIAL
  • เพิ่มออบเจ็กต์ SoftwareSerial พร้อมกับพิน Rx/Tx ที่คุณต้องการใช้

นั่นคือทั้งหมดที่จำเป็น และคุณสามารถสลับกลับไปใช้ Serial ได้โดยการเปลี่ยน define ของ USE_SERIAL

ตั้งค่า Serial Monitor เพิ่มเติม

เพื่อให้เราสามารถดูข้อมูลจากพอร์ต SoftwareSerial ขณะทำการดีบักได้ เราจำเป็นต้องทำให้มันมองเห็นได้

ในการดูข้อมูลจาก SoftwareSerial ขณะดีบัก เราต้องเปิดหน้าต่าง Monitor แยกต่างหาก:

เปิด vMicro > General > Monitor Alternative และเลือกพอร์ต USB สำหรับอุปกรณ์ TTL Serial ของคุณ หน้าต่าง Serial Monitor ใหม่ควรปรากฏขึ้นและเชื่อมต่อกับพอร์ตนี้ โดยไม่เปลี่ยนพอร์ตที่ใช้สำหรับอัปโหลด

ตัวเลือกสำหรับ Serial Monitor รอง

ตั้งค่าจุดพัก (Breakpoint)

เพิ่มจุดพักในสเก็ตช์ของคุณโดยคลิกที่ขอบด้านซ้ายมือ

คุณสามารถกำหนดจุดที่ต้องการให้โปรแกรมหยุดทำงานชั่วคราวได้โดยคลิกที่ขอบถัดจากหมายเลขบรรทัด GDBStub บนบอร์ด AVR รองรับจุดพักได้สูงสุด 4 จุดพร้อมกัน ซึ่งเพียงพอสำหรับการติดตามข้อบกพร่องในฟังก์ชันส่วนใหญ่

คุณสามารถเพิ่มได้มากกว่าหนึ่งจุด และสูงสุดได้ 4 จุดในเวลาใดเวลาหนึ่ง

เพิ่มจุดพักบนบรรทัดที่ 16 ของโค้ด (วงกลมสีแดง)

เริ่มการดีบัก

ตรวจสอบให้แน่ใจว่าตั้งค่าพอร์ต COM ที่ถูกต้องสำหรับการอัปโหลด

ตรวจสอบให้แน่ใจว่าได้เลือกพอร์ต COM ที่ถูกต้องสำหรับ Arduino Uno ของคุณสำหรับการอัปโหลด จากนั้น คุณสามารถเริ่มการดีบักได้สองวิธี:

ในการเริ่มกระบวนการดีบัก คุณสามารถทำได้โดย:

  • ปุ่ม "Debug > Attach to Process" หากโค้ดของคุณถูกอัปโหลดไปยังบอร์ดแล้ว
  • "Debug > Start Debugging" หากโค้ดของคุณยังไม่ได้ถูกอัปโหลด

เมื่อเข้าสู่โหมดดีบักแล้ว คุณจะสามารถเห็นค่าของตัวแปรเปลี่ยนแปลงแบบเรียลไทม์ และใช้คำสั่งควบคุมพื้นฐาน เช่น Step Over และ Step Into เหมือนกับการเขียนโปรแกรมบนคอมพิวเตอร์ทั่วไป

ตอนนี้คุณสามารถดีบักใน Visual Micro ได้ตามปกติบน Arduino Uno ของคุณ โดยไม่ต้องใช้ฮาร์ดแวร์ดีบักภายนอก

หมายเหตุ - คุณอาจจำเป็นต้องเปิด alternative serial monitor ใหม่อีกครั้งหลังจากเริ่มการดีบักครั้งแรก หลังจากนั้นมันจะถูกจดจำเป็นส่วนหนึ่งของเลย์เอาต์หน้าต่าง Visual Studio ของคุณ

GDB Stub กำลังทำงาน พร้อมกับ Serial Monitor รองที่เปิดอยู่

วิดีโอด้านล่างอธิบายขั้นตอนโดยละเอียด ตั้งแต่การตั้งค่า GDBStub ไปจนถึงการปรับโค้ดเพื่อใช้งานกับ SoftwareSerial:

ตอนที่ 1 - GDB Stub (เปิดคำบรรยาย / คำอธิบายภาพ)
ตอนที่ 2 - การปรับเปลี่ยนสำหรับ Software Serial (เปิดคำบรรยาย / คำอธิบายภาพ)

ลิงก์ที่มีประโยชน์

  • AVR GDBStub ใน Visual Micro
  • ESP8266 GDBStub ใน Visual Micro
  • การเดินผ่านการดีบัก vMicro
  • ช่อง YouTube ของ Visual Micro
  • เว็บไซต์อย่างเป็นทางการของ Visual Micro

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Visual Micro"
  - "1x Visual Studio 2017"
  - "1x Arduino IDE"
author: "arduinocc"
category: "Lab Stuff"
components:
  - "4x Jumper wires (generic)"
  - "1x Soldering iron (generic)"
  - "1x SparkFun USB to Serial Breakout - FT232RL"
  - "1x Solder Wire, Lead Free"
  - "1x Arduino UNO"
description: "มาแกะรอยบั๊กในโค้ดกันแบบโปรๆ ด้วย GDB บน Arduino Uno เลย งานง่ายแต่หล่อ! แก้ปัญหาได้ชิวๆ โปรเจคเสร็จไว ปล่อยของได้แบบไม่สะดุด!"
difficulty: "Easy"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX19Dmhys+uIvoPSaXdL2vwjTprR3tKRtKy5S4nDz+GivvTtxcauvm1EWgiqT+AllNTW+AlTKlzzzOExrNF2+zC/DVb7iNQXXqHK3xem4PGuDsDRc40kEtH9F565XawYwlT2zBhlkm18APw=="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/arduino-uno-debugging-960f0b_cover.jpg"
lang: "en"
likes: 2
passwordHash: "5fb61c63d9ef20adcbd00c934d26d987fd38b2f801fc0a5896fece5c02b91bb1"
price: 99
seoDescription: "Learn Arduino Uno Debugging using GDB without an external debugger. Fix bugs easily and release your project faster."
tags:
  - "gdb"
  - "debugging tools"
  - "visual micro"
title: "ดีบั๊ก Arduino Uno ง่ายๆ ไม่ต้องพึ่งฮาร์ดแวร์เสริม (ตึงๆ!)"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/dKGxn4FXeGo"
  - "https://www.youtube.com/embed/2wwdTKjzChU"
views: 33619