ข้ามไปยังเนื้อหา

แล็บ: เฟิร์มแวร์หลาย task ด้วย FreeRTOS

Course 1 · Module 4
Type: Hands-on lab (create tasks, then add queue / mutex)
Suggested time: 2.5–3.5 hours

Read first: Lesson · Cheatsheet · ← Table of Contents · ← M03 · M05 →

หมายเหตุ: snippet ในแล็บนี้ใช้ API ของเฟิร์มแวร์ TESAIoT Bitstream ซึ่งยังไม่เปิดซอร์ส ดูรายละเอียดและตัวอย่างเทียบใน SDK สาธารณะได้ที่หมายเหตุต้นบทเรียน เฟิร์มแวร์หลาย task ด้วย FreeRTOS

เอกสาร ใช้เมื่อ
Lesson snippets xTaskCreate, queue, mutex, event group
M03 Driver APIs LED / button / UART / I²C
TESAIoT Developer Hub ตัวอย่าง System / Real-Time
FreeRTOS xTaskCreate ตรวจพารามิเตอร์

เมื่อทำครบ คุณจะ:

  • สร้างอย่างน้อย สอง task ที่รันคาบต่างกัน
  • ใช้ vTaskDelay(pdMS_TO_TICKS(...)) แทน busy-wait
  • ส่งเหตุการณ์ผ่าน queue อย่างน้อยหนึ่งเส้นทาง
  • ใช้ mutex (หรือ cm55_i2c_manager_i2c_lock) เมื่อแชร์ทรัพยากร
  • (แนะนำ) ใช้ event group หรือ binary semaphore เป็นธงพร้อม

  • ผ่าน Lab M03 (GPIO + UART อย่างน้อย)
  • โปรเจกต์ตัวอย่างที่เรียก cm55_initialize / cm55_start_scheduler ได้
  • รู้จุดที่โปรเจกต์อนุญาตให้ xTaskCreate (หลัง init / ใน callback)

อย่าเรียก vTaskStartScheduler() ซ้ำเองถ้าโปรเจกต์ใช้ cm55_start_scheduler() แล้ว


  1. สร้าง task LAB_BLINK_SLOW กระพริบ LED ด้วยคาบ 500 ms
  2. สร้าง task LAB_BLINK_FAST กระพริบ LED อีกดวง (หรือสลับสี) ด้วยคาบ 200 ms
  3. ใช้ priority คนละค่าเล็กน้อย (เช่น idle+1 และ idle+2) แล้วสังเกตพฤติกรรม
led_controller_toggle(LED_RED);
vTaskDelay(pdMS_TO_TICKS(500));

Pass when: เห็นสองจังหวะบนบอร์ดโดยไม่ใช้ while busy-delay ยาวใน task เดียว


  1. สร้างคิวข้อความสั้น ๆ (xQueueCreate)
  2. สร้าง task ดึงคิวแล้ว printf / LOG_INFO
  3. ใน cm55_button_on_pressed (หรือจุด event ปุ่ม) ให้ xQueueSend ข้อความ เช่น btn\r\n

Pass when: กดปุ่มแล้วเห็นข้อความบน serial โดย task กระพริบจาก Lab A ยังทำงานต่อ


เลือกอย่างน้อยหนึ่งข้อ:

  • สร้าง xSemaphoreCreateMutex
  • task สองตัวแชร์การพิมพ์หรือแชร์ตัวแปรสถานะภายใต้ Take/Give
  • อ่านเซ็นเซอร์ใน task หนึ่ง
  • ห่อด้วย cm55_i2c_manager_i2c_lock / unlock (หรือ API ล็อกที่โปรเจกต์ของคุณมี)

Pass when: อธิบายได้ว่าทำไมต้องล็อก และสาธิตว่าไม่มีการแย่งบัสแบบสุ่มพัง


  1. สร้าง xEventGroupCreate
  2. task setup ตั้งบิต “READY” หลัง init เสร็จ
  3. task อื่น xEventGroupWaitBits ก่อนเริ่มงาน

หรือใช้ binary semaphore เป็นสัญญาณ “พร้อมแล้ว” ก็ได้

Pass when: task ผู้รอไม่เริ่มงานก่อนสัญญาณพร้อม


ตอบสั้น ๆ (5–8 บรรทัด):

  1. ถ้าเอา printf ใส่ ISR จะเสี่ยงอะไร
  2. ถ้า priority ของ task หนักสูงสุดตลอดเวลา ระบบจะเป็นอย่างไร
  3. depth × sizeof(item) ของคิวกระทบ RAM อย่างไร

อาการ แนวทาง
xTaskCreate คืนไม่ใช่ pdPASS heap หมด · stack ใหญ่เกิน · เรียกก่อนระบบพร้อม
Task ไม่รัน ยังไม่ cm55_start_scheduler · priority/ชื่อชน · ลูป task จบแล้วไม่ได้สร้างใหม่
HardFault เมื่อกดปุ่ม มี blocking API ใน ISR · ตรวจ FromISR
UART ปนกัน / ค้าง ขาด mutex / recursive lock รอบ printf
I²C NACK สุ่ม ขาด bus lock เมื่อมีหลาย task

  • Lab A ผ่าน
  • Lab B ผ่าน
  • Lab C ผ่าน
  • (แนะนำ) Lab D
  • Lab E ตอบครบ
  • กรอกตาราง API ใน rtos-patterns.md

Lesson · Cheatsheet · Table of Contents · M05 →

อ้างอิงบทเรียนนี้

ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน

"แล็บ: เฟิร์มแวร์หลาย task ด้วย FreeRTOS" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0

ข้อความอ้างอิงภาษาอังกฤษ: "Lab: Multi-Task Firmware with FreeRTOS" from TESA Open Knowledge by the Thai Embedded Systems Association (TESA), https://github.com/tesaiot/tesa-qualification-program, licensed under CC BY-NC 4.0

ลิงก์บทเรียน: https://tesaiot.github.io/tesa-qualification-program/courses/firmware-sdk-edge-ai/m04-rtos/l02-lab/

บทเรียนนี้ดัดแปลงจากต้นฉบับด้านล่าง เมื่ออ้างอิงให้คงเครดิตต้นฉบับไว้ด้วย
https://github.com/drsanti/TESAIoT-Courses/blob/287c21814ba8c75f693136616dcd270349a15966/C1/M04/lab.md · Original content by Asst. Prof. Dr. Santi Nuratch (ผศ.ดร.สันติ นุราช), KMUTT. Course 1 (C1/) of drsanti/TESAIoT-Courses. TESA funded the work and holds the rights; published here under CC BY-NC 4.0. The upstream repository carries no licence file. Text kept faithful; structure, front matter, quizzes and notes added by TESA Open Knowledge.

วิธีอ้างอิง TESA ฉบับเต็ม

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA