ก้าวข้าม Super Loop: เจาะลึกความต่างระหว่าง FreeRTOS บน ESP32 และ Arduino แบบดั้งเดิม
การวิวัฒนาการของแนวคิดการเขียนโปรแกรม Embedded
การใช้งาน FreeRTOS บน ESP32 มีความแตกต่างจากรูปแบบการเขียนโปรแกรม Arduino แบบดั้งเดิม (เช่น บนบอร์ด Uno หรือ Nano ที่ใช้ชิป AVR) อย่างสิ้นเชิง โดยเปลี่ยนจากระบบที่ทำงานแบบ “Super Loop” ไปสู่ระบบปฏิบัติการแบบเรียลไทม์ (RTOS) ที่ทรงพลังกว่ามาก
1. โครงสร้างการทำงาน: Super Loop vs. Multitasking
- Arduino ทั่วไป (Super Loop): โปรแกรมจะวนทำคำสั่งใน
loop()ไปเรื่อยๆ ตามลำดับ หากมีคำสั่งที่ใช้เวลานาน เช่นdelay()บอร์ดจะหยุดนิ่งและไม่สามารถทำอย่างอื่นได้จนกว่าจะครบเวลา - FreeRTOS บน ESP32 (Multitasking): ช่วยให้คุณแบ่งโปรแกรมออกเป็นงานย่อยๆ ที่เรียกว่า “Tasks” ระบบจะจัดสรรเวลาให้แต่ละ Task สลับกันทำงานอย่างรวดเร็ว (Time Slicing) จนดูเหมือนว่าทำงานพร้อมกัน หาก Task หนึ่งหยุดรอ ระบบจะสลับไปทำ Task อื่นทันทีโดยไม่เสียเวลาเปล่า
2. ความลับเบื้องหลัง: Arduino ESP32 รันบน FreeRTOS เสมอ
ความจริงที่หลายคนไม่ทราบคือ Arduino Core สำหรับ ESP32 นั้นถูกสร้างทับอยู่บน FreeRTOS มาตั้งแต่ต้น:
- loopTask: ฟังก์ชัน
setup()และloop()ของเรา แท้จริงแล้วคือ Task หนึ่งที่ชื่อว่าloopTaskซึ่งทำงานที่ Priority 1 - Smart Delay: ฟังก์ชัน
delay()บน ESP32 จะเรียกใช้งานvTaskDelay()ของ FreeRTOS ซึ่งจะสั่งให้ Task นั้น “หลับ” เพื่อคืน CPU ให้ Task อื่นทำงานแทน ไม่ได้เป็นการหยุดระบบทั้งหมดเหมือนบอร์ดรุ่นเก่า

3. การรองรับระบบซีพียูคู่ (Dual-Core SMP)
นี่คือจุดเด่นที่สุดที่แตกต่างจาก Arduino ทั่วไปอย่างชัดเจน:
- Core 0 (Protocol CPU): จัดการงานเบื้องหลัง เช่น Wi-Fi และ Bluetooth Stack
- Core 1 (Application CPU): รันโค้ด Arduino หลักของเรา
ด้วย FreeRTOS คุณสามารถใช้คำสั่ง
xTaskCreatePinnedToCore()เพื่อระบุเจาะจงได้ว่าจะให้งานไหนรันบน Core ไหน ช่วยให้คุณรีดประสิทธิภาพของฮาร์ดแวร์ออกมาได้สูงสุด
4. การจัดการลำดับความสำคัญ (Priority)
คุณสามารถกำหนด Priority ให้กับแต่ละ Task ได้ (0 ถึง 24) ระบบจัดการ (Scheduler) จะเลือก Task ที่สำคัญที่สุดมารันก่อนเสมอ หากมีงานด่วนเข้ามา (เช่น อ่านค่า Sensor วิกฤต) มันสามารถแทรกแซงการทำงานของ Task อื่นได้ทันที (Preemptive)
5. การสื่อสารระหว่างงานที่ปลอดภัย (Inter-Task Communication)
การใช้ตัวแปร Global ในระบบ Multitasking เสี่ยงต่อการเกิด Race Condition (ข้อมูลตีกัน) FreeRTOS จึงมีเครื่องมือเฉพาะทางมาให้:
- Queues: ท่อส่งข้อมูลที่ปลอดภัย (Thread-safe)
- Semaphores & Mutexes: กลไกการล็อคทรัพยากร เพื่อป้องกันไม่ให้สอง Task แย่งกันใช้ฮาร์ดแวร์ตัวเดียวกัน (เช่น I2C Bus)
- Task Notifications: วิธีการส่งสัญญาณบอก Task อื่นว่ามีเหตุการณ์เกิดขึ้น ซึ่งรวดเร็วและใช้ทรัพยากรน้อย
สรุป
การใช้ FreeRTOS บน ESP32 ช่วยให้คุณเขียนโปรแกรมที่ซับซ้อนได้ง่ายขึ้น แยกส่วนการทำงานชัดเจน และใช้ประโยชน์จากซีพียูคู่ได้อย่างเต็มที่ ในขณะที่ Arduino แบบเดิมเหมาะกับงานง่ายๆ ที่ทำงานเป็นเส้นตรงครับ