โมดูล 5/5 · สัปดาห์ 13–15 · 27 ชม.

RTOS และระบบฝังตัวสู่ AI

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

เวลาเรียนประมาณ 80 นาทีร่าง รอตรวจปรับปรุงล่าสุด 27 กันยายน 2569

บทเรียน

เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ

  1. อธิบาย task, priority และ preemption ในระบบปฏิบัติการเวลาจริง (RTOS)
  2. ตรวจว่าชุด task จัดตารางแบบ rate-monotonic ได้หรือไม่ด้วยขอบเขตของ Liu และ Layland และด้วยการจำลอง
  3. ระบุ RTOS ที่ใช้ใน PX4 และ ArduPilot และสัญญาอนุญาตของ NuttX, ChibiOS และ FreeRTOS
  4. อธิบายการนำโมเดล AI ขนาดเล็กขึ้น MCU (TinyML) และข้อจำกัด

ความรู้พื้นฐานที่ควรมี: UAT 204 โมดูล 1–4

ทำไมต้องรู้

ตัวควบคุมการบินต้องทำหลายงานพร้อมกัน อ่าน IMU พันครั้งต่อวินาที คำนวณท่าทาง รับ GPS บันทึก log และคุยกับสถานีภาคพื้น ถ้างานบันทึก log ทำนานเกินจนงานอ่าน IMU พลาดเวลา การควบคุมจะแย่ลงทันที RTOS (real-time operating system) จัดลำดับงานให้งานสำคัญได้ทำตรงเวลาเสมอ ส่วนหัวข้อสุดท้ายของบทพาไปถึงการนำ AI ขนาดเล็กขึ้น MCU

Task, priority และ preemption

  • Task คืองานที่ทำซ้ำเป็นรอบ แต่ละงานมีคาบ และเวลาประมวลผล
  • Priority ความสำคัญของงาน
  • Preemption งานที่สำคัญกว่าขัดงานที่กำลังทำได้ทันที

Rate-monotonic scheduling ให้ priority สูงกับงานที่คาบสั้น Liu และ Layland (1973) พิสูจน์ว่าถ้าการใช้ CPU รวม ไม่เกิน สำหรับ งาน ทุกงานจะทันเวลาแน่นอน ค่านี้ลดลงเข้าหาประมาณ 69% เมื่อมีงานมาก เงื่อนไขนี้เป็น เงื่อนไขเพียงพอ ถ้าเกินขอบเขตก็ยังอาจทันได้ ต้องตรวจละเอียดขึ้น

ตัวอย่างที่ 1 ชุด task ของตัวควบคุมการบินสมมติ

หน่วยเวลาเป็น 0.1 ms (จำนวนเต็ม เพื่อไม่ให้ทศนิยมคลาดเคลื่อน) จำลองหนึ่งวินาทีโดยให้งานคาบสั้นได้ priority สูงกว่า

def check(tasks, horizon=10_000):
    n = len(tasks)
    u = sum(c / t for _, t, c in tasks)
    bound = n * (2 ** (1 / n) - 1)
    order = sorted(tasks, key=lambda x: x[1])            # คาบสั้นได้ priority สูง
    remaining = {name: 0 for name, _, _ in order}
    missed = {name: 0 for name, _, _ in order}
    for t in range(horizon):
        for name, period, cost in order:
            if t % period == 0:
                if remaining[name] > 0:
                    missed[name] += 1                    # งานรอบก่อนยังไม่เสร็จ = พลาดเวลา
                remaining[name] = cost
        for name, _, _ in order:
            if remaining[name] > 0:
                remaining[name] -= 1
                break
    return u, bound, missed


base = [("IMU", 10, 2), ("attitude", 25, 5), ("logging", 200, 40), ("GPS", 1000, 50)]
for label, tasks in (("base", base), ("+ AI 6 ms/20 ms", base + [("AI", 2000, 600)]),
                     ("+ AI 8 ms/20 ms", base + [("AI", 2000, 800)])):
    u, bound, missed = check(tasks)
    print(f"{label:<16} U = {u:.2f}, bound = {bound:.3f}, missed deadlines = {sum(missed.values())}")
base             U = 0.65, bound = 0.757, missed deadlines = 0
+ AI 6 ms/20 ms  U = 0.95, bound = 0.743, missed deadlines = 0
+ AI 8 ms/20 ms  U = 1.05, bound = 0.743, missed deadlines = 4

ชุดพื้นฐานใช้ CPU 65% ต่ำกว่าขอบเขต 75.7% จึงทันเวลาแน่นอน เมื่อเพิ่มงาน AI จน ซึ่งเกินขอบเขต การจำลองกลับพบว่ายังทันทุกงาน เพราะคาบของงานเหล่านี้หารกันลงตัวเกือบทั้งหมด นี่คือเหตุที่เรียกว่าเงื่อนไขเพียงพอ แต่ถ้างาน AI หนักขึ้นจน เกิน 1 ก็พลาดเวลาแน่นอน ตัวเลขทั้งหมดเป็นค่าสมมติ ไม่ใช่เวลาจริงของ PX4 หรือ ArduPilot

แผนภาพเวลา 0 ถึง 10 มิลลิวินาทีของงานสี่งาน IMU ทำงานสั้น ๆ ทุก 1 มิลลิวินาที attitude ทำทุก 2.5 มิลลิวินาที logging ทำในช่วงว่างและถูกขัดเป็นช่วง ๆ และ GPS ได้ทำในช่วงท้ายเมื่องานอื่นว่าง
ภาพที่ 1 ตารางเวลาแบบ rate-monotonic ช่วง 10 ms แรก

RTOS ใน flight stack

  • PX4 ใช้ NuttX เป็น RTOS หลักบนบอร์ดควบคุมการบิน NuttX เป็นโครงการของ Apache ใช้สัญญาอนุญาต Apache 2.0
  • ArduPilot บนบอร์ด STM32 ใช้ ChibiOS ผ่านชั้น AP_HAL_ChibiOS ChibiOS/RT ใช้สัญญาอนุญาต GPL3 หรือแบบเชิงพาณิชย์ ส่วน ChibiOS/HAL ใช้ Apache 2.0
  • FreeRTOS นิยมในบอร์ด MCU ทั่วไป รวมทั้ง ESP32 ตัว kernel ใช้สัญญาอนุญาต MIT

นอกจากจัดตารางงานแล้ว ระบบฝังตัวที่ปลอดภัยต้องมี watchdog ซึ่งรีเซ็ตระบบเองถ้าโปรแกรมค้างจนไม่มาแจ้งตามเวลา

จาก MCU สู่ AI

สี่ระดับเรียงจากซ้ายไปขวา MCU ควบคุมเวลาจริง MCU กับ TinyML โมเดลขนาดกิโลไบต์ SoC Edge AI เช่น Jetson และ Pi และคลาวด์โมเดลใหญ่ ลูกศรด้านล่างจากพลังงานต่ำตอบสนองเร็วไปสู่คำนวณมากเวลาหน่วงสูง
ภาพที่ 2 จาก MCU ถึง Edge AI และคลาวด์

TinyML คือการรันโมเดล machine learning ขนาดเล็กบน MCU เช่น จำแนกเสียงผิดปกติของมอเตอร์หรือตรวจรูปแบบการสั่น Google เรียกเครื่องมือนี้ว่า LiteRT for Microcontrollers (เดิมชื่อ TensorFlow Lite for Microcontrollers) ทำงานได้โดยไม่ต้องมีระบบปฏิบัติการ และตัว runtime หลักใช้หน่วยความจำเพียงราว 16 KB บน Cortex-M3 งานที่ใหญ่กว่า เช่น ตรวจจับวัตถุในภาพ ต้องใช้คอมพิวเตอร์บนลำอย่างที่เรียนใน UAT 322 ส่วนเนื้อหาเจาะลึกเรื่อง Embedded AI และ ROS ในคลังความรู้ต่อยอดจากบทนี้

ปฏิบัติการประจำโมดูล

ปฏิบัติการ: task บน FreeRTOS

  1. สร้างโปรเจกต์ FreeRTOS บน Pico 2 (ตามคู่มือ SDK) มีสาม task: อ่านเซนเซอร์ทุก 10 ms, ส่ง frame ทาง UART ทุก 100 ms และกะพริบ LED ทุก 500 ms
  2. ตั้ง priority แบบ rate-monotonic แล้ววัดเวลาจริงของแต่ละ task ด้วยการสลับขา GPIO และ logic analyzer
  3. เพิ่มงานหนักจำลอง (วนคำนวณ) ใน task ที่ priority ต่ำ แล้วตรวจว่างานอ่านเซนเซอร์ยังตรงเวลา
  4. ใส่ค่าที่วัดได้ลงโค้ดตัวอย่างที่ 1 เทียบผลการคำนวณกับการวัด
  5. เปิด watchdog แล้วจำลองให้ task หนึ่งค้าง สังเกตการรีเซ็ต

ข้อผิดพลาดที่พบบ่อย

ระวัง

  • ให้ priority ตามความรู้สึก ไม่ใช่ตามคาบและความสำคัญด้านเวลา
  • ถือว่าเกินขอบเขต Liu–Layland คือจัดตารางไม่ได้เสมอ
  • ใช้ busy wait ใน task แทนการหน่วงเวลาของ RTOS
  • ไม่มี watchdog ในระบบที่ต้องทำงานต่อเนื่อง
  • คาดหวังให้ MCU รันโมเดลภาพขนาดใหญ่

สรุป

  • RTOS จัดลำดับ task ด้วย priority และ preemption ให้งานสำคัญทันเวลา
  • Rate-monotonic ให้งานคาบสั้นได้ priority สูง ขอบเขต เป็นเงื่อนไขเพียงพอ
  • PX4 ใช้ NuttX, ArduPilot ใช้ ChibiOS และ FreeRTOS นิยมใน MCU ทั่วไป
  • TinyML รันโมเดลขนาดเล็กบน MCU ส่วนงาน AI ใหญ่ต้องใช้คอมพิวเตอร์บนลำ

แบบฝึกตรวจความเข้าใจ

  1. งานคาบ 10 ms ใช้เวลา 2 ms และงานคาบ 20 ms ใช้เวลา 5 ms การใช้ CPU รวมเท่าใด
  2. ขอบเขต rate-monotonic สำหรับ 2 งานเท่าใด
  3. ชุดงานในข้อ 1 ทันเวลาแน่นอนหรือไม่
  4. PX4 ใช้ RTOS ใดบนบอร์ดควบคุมการบิน
  5. watchdog มีไว้ทำอะไร
เฉลย
  1. ทันแน่นอน เพราะ
  2. NuttX
  3. รีเซ็ตระบบเมื่อโปรแกรมค้างจนไม่แจ้งตามเวลา

สรุปสูตรสำคัญ

การใช้ CPU
ขอบเขตของ rate-monotonic

แหล่งอ้างอิงหลัก

  1. Liu, C. L., & Layland, J. W. (1973). Scheduling algorithms for multiprogramming in a hard-real-time environment. Journal of the ACM, 20(1), 46–61. link
  2. PX4 Autopilot. PX4 architectural overview. PX4 user guide (main). link
  3. Apache Software Foundation. Apache NuttX real-time operating system. link
  4. ArduPilot Dev Team. Porting to a new flight controller board (ChibiOS). ArduPilot developer documentation. link
  5. ChibiOS. Licensing (ChibiOS/RT and ChibiOS/HAL). link
  6. FreeRTOS. FreeRTOS kernel (MIT license). link
  7. Google. LiteRT for Microcontrollers (TensorFlow Lite for Microcontrollers). link
  8. Warden, P., & Situnayake, D. (2020). TinyML: Machine learning with TensorFlow Lite on Arduino and ultra-low-power microcontrollers. O'Reilly Media.

อ่านเพิ่มเติม

ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล

ในชั้นเรียน / ภาคสนาม

ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย

หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz

แบบทดสอบประจำโมดูล

แบบทดสอบนี้ใช้ตรวจความเข้าใจ (formative) ไม่ใช่การสอบเก็บคะแนน

โดเมนความรู้: เซนเซอร์และระบบสมองกลฝังตัว · ระบบอัตโนมัติ หุ่นยนต์ และฝูงโดรน · ปัญญาประดิษฐ์และคอมพิวเตอร์วิทัศน์