Semihosting กลายเป็นทางเลือกฟรีแทน J-Link RTT ที่แพงสำหรับการ Debug ARM

ทีมชุมชน BigGo
Semihosting กลายเป็นทางเลือกฟรีแทน J-Link RTT ที่แพงสำหรับการ Debug ARM

นักพัฒนา Embedded มักต้องเผชิญกับค่าใช้จ่ายสูงของเครื่องมือ debugging แบบมืออาชีพ โดยเฉพาะ J-Link probes ของ SEGGER และฟีเจอร์ Real Time Transfer (RTT) ของมัน แม้ว่า RTT จะให้การสื่อสารแบบสองทางที่ยอดเยี่ยมผ่าน debug lines แต่ข้อกำหนดด้านฮาร์ดแวร์ที่แพงและใบอนุญาตที่เข้มงวดได้ผลักดันให้นักพัฒนาแสวงหาทางเลือกอื่น

การอภิปรายได้เข้มข้นขึ้นเกี่ยวกับ semihosting ในฐานะทางเลือกที่เป็นไปได้ เทคนิค debugging มาตรฐาน ARM นี้ช่วยให้ไมโครคอนโทรลเลอร์สื่อสารกับคอมพิวเตอร์โฮสต์ผ่านการเชื่อมต่อ debug ที่มีอยู่ ทำให้ไม่จำเป็นต้องใช้ GPIO pins เพิ่มเติมหรือ UART peripherals

การเปรียบเทียบ Semihosting กับ RTT

คุณสมบัติ Semihosting J-Link RTT
ต้นทุนฮาร์ดแวร์ ใช้ debug probe ที่มีอยู่แล้ว ต้องใช้ J-Link probe ($$$)
ประสิทธิภาพ แบบ Blocking, 10-100ms ต่อการเรียกใช้ แบบ Non-blocking, แบนด์วิดท์สูง
การใช้หน่วยความจำ น้อยที่สุด ใช้พื้นที่ค่อนข้างเยอะ
ความต้องการ GPIO ไม่ต้องใช้ (ใช้สาย SWD) ไม่ต้องใช้ (ใช้สาย SWD)
ความเข้ากันได้ ARM debug probe ส่วนใหญ่ เฉพาะ J-Link probe เท่านั้น
ลิขสิทธิ์ มาตรฐานเปิด เป็นกรรมสิทธิ์

การแลกเปลี่ยนประสิทธิภาพจุดประกายการถกเถียง

ข้อเสนอแนะจากชุมชนเผยให้เห็นประสบการณ์ที่หลากหลายกับประสิทธิภาพของ semihosting นักพัฒนาหลายคนเน้นข้อจำกัดด้านความเร็วที่สำคัญ โดยสังเกตว่าการเรียก semihosting สามารถหยุดโปรเซสเซอร์เป็นเวลาหลายสิบถึงหลายร้อยมิลลิวินาทีขณะที่ debug probes จัดการคำขอ สิ่งนี้ทำให้ไม่เหมาะสำหรับแอปพลิเคชันที่ต้องการเวลาที่แม่นยำ ซึ่ง RTT ที่ไม่บล็อกให้ข้อได้เปรียบที่ชัดเจน

อย่างไรก็ตาม คนอื่นๆ โต้แย้งว่าสำหรับสถานการณ์ debugging ทั่วไป ความเสียหายด้านประสิทธิภาพนี้ยอมรับได้และเทียบเคียงได้กับการทำงานของ UART แบบบล็อก ประโยชน์หลักอยู่ที่การปลดปล่อย GPIO pins ที่มีค่าและการขจัดข้อกำหนดฮาร์ดแวร์ภายนอก

วิธีแก้ปัญหาสร้างสรรค์เกิดขึ้น

โซลูชันที่สร้างสรรค์กำลังถูกแบ่งปันเพื่อแก้ไขข้อจำกัดของ semihosting เทคนิคหนึ่งเกี่ยวข้องกับการส่งการเรียก semihosting ผ่านฟังก์ชันที่อยู่ใน RAM ซึ่งสามารถปรับเปลี่ยนแบบไดนามิกเมื่อ debuggers เชื่อมต่อ วิธีการนี้ลด overhead เมื่อไม่ได้ใช้งาน debugging ขณะที่ยังคงความเข้ากันได้

ส่งการเรียก semihosting ทั้งหมดผ่านฟังก์ชันนี้ใน RAM: BX LR, BX LR จากนั้นเมื่อคุณเชื่อมต่อ debugger ให้เขียนทับด้วย BKPT 0xAB เพื่อเปิดใช้งาน semihosting

System Calls หลักของ Semihosting

  • SYS_WRITE - ส่งออกข้อมูลไปยังคอนโซลของโฮสต์
  • SYS_READC - อ่านตัวอักษรเดี่ยวจากโฮสต์
  • SYS_OPEN - เริ่มต้น file descriptors (แนะนำ)
  • การใช้งานต้องใช้คำสั่ง assembly bkpt 0xAB
  • รองรับการทำงานกับไฟล์, เวลา UTC และการเข้าถึงระบบไฟล์ของโฮสต์

ทางเลือกของ RTT ได้รับความนิยม

ชุมชนกำลังสำรวจโซลูชันที่เข้ากันได้กับ RTT ซึ่งทำงานได้นอกเหนือจากฮาร์ดแวร์ J-Link โปรเจ็กต์อย่าง defmt-rtt สำหรับ Rust แสดงให้เห็นว่าการ logging แบบ RTT สามารถทำงานกับ debug probes ที่ถูกกว่าอย่าง ST-Link การใช้งานเหล่านี้ใช้เทคนิคที่ชาญฉลาดเพื่อลดการใช้หน่วยความจำโดยการเก็บข้อความที่ละเอียดไว้ในไฟล์ ELF ขณะที่สตรีมเฉพาะข้อมูลที่จำเป็น

ความท้าทายในการใช้งานยังคงมีอยู่

แม้จะมีความหวัง แต่ semihosting ต้องการการใช้งานที่ระมัดระวัง นักพัฒนาต้องจัดการกับ exceptions เมื่อ debuggers ไม่ได้เชื่อมต่อและให้แน่ใจว่ามีการเริ่มต้น file descriptor อย่างเหมาะสม สภาพแวดล้อมการพัฒนาบางอย่าง รวมถึง VSCode extensions บางตัว ไม่รองรับ semihosting อย่างเต็มที่ แม้ว่าสิ่งนี้สามารถแก้ไขได้ด้วย compilation flags

เทคนิคนี้ทำงานได้กับโปรเซสเซอร์ ARM Cortex และ debug probe combinations ส่วนใหญ่ ทำให้เข้าถึงได้มากกว่าทางเลือกที่เป็นกรรมสิทธิ์อย่างมีนัยสำคัญ สำหรับโปรเจ็กต์ที่คำนึงถึงงบประมาณและวัตถุประสงค์ทางการศึกษา semihosting เสนอเส้นทางที่ปฏิบัติได้สู่ความสามารถ debugging ระดับมืออาชีพโดยไม่มีค่าใช้จ่ายที่เกี่ยวข้อง

อ้างอิง: J-Link RTT for the Masses