แล็บ: เฟิร์มแวร์หลาย 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
Useful references during the lab
หัวข้อที่มีชื่อว่า “Useful references during the lab”| เอกสาร | ใช้เมื่อ |
|---|---|
| Lesson snippets | xTaskCreate, queue, mutex, event group |
| M03 Driver APIs | LED / button / UART / I²C |
| TESAIoT Developer Hub | ตัวอย่าง System / Real-Time |
| FreeRTOS xTaskCreate | ตรวจพารามิเตอร์ |
Lab Goals
หัวข้อที่มีชื่อว่า “Lab Goals”เมื่อทำครบ คุณจะ:
- สร้างอย่างน้อย สอง task ที่รันคาบต่างกัน
- ใช้
vTaskDelay(pdMS_TO_TICKS(...))แทน busy-wait - ส่งเหตุการณ์ผ่าน queue อย่างน้อยหนึ่งเส้นทาง
- ใช้ mutex (หรือ
cm55_i2c_manager_i2c_lock) เมื่อแชร์ทรัพยากร - (แนะนำ) ใช้ event group หรือ binary semaphore เป็นธงพร้อม
Prerequisites
หัวข้อที่มีชื่อว่า “Prerequisites”- ผ่าน Lab M03 (GPIO + UART อย่างน้อย)
- โปรเจกต์ตัวอย่างที่เรียก
cm55_initialize/cm55_start_schedulerได้ - รู้จุดที่โปรเจกต์อนุญาตให้
xTaskCreate(หลัง init / ใน callback)
อย่าเรียก
vTaskStartScheduler()ซ้ำเองถ้าโปรเจกต์ใช้cm55_start_scheduler()แล้ว
Lab A — Two blink rates (required)
หัวข้อที่มีชื่อว่า “Lab A — Two blink rates (required)”- สร้าง task
LAB_BLINK_SLOWกระพริบ LED ด้วยคาบ 500 ms - สร้าง task
LAB_BLINK_FASTกระพริบ LED อีกดวง (หรือสลับสี) ด้วยคาบ 200 ms - ใช้ priority คนละค่าเล็กน้อย (เช่น idle+1 และ idle+2) แล้วสังเกตพฤติกรรม
led_controller_toggle(LED_RED);vTaskDelay(pdMS_TO_TICKS(500));Pass when: เห็นสองจังหวะบนบอร์ดโดยไม่ใช้ while busy-delay ยาวใน task เดียว
Lab B — Button → Queue → UART task (required)
หัวข้อที่มีชื่อว่า “Lab B — Button → Queue → UART task (required)”- สร้างคิวข้อความสั้น ๆ (
xQueueCreate) - สร้าง task ดึงคิวแล้ว
printf/LOG_INFO - ใน
cm55_button_on_pressed(หรือจุด event ปุ่ม) ให้xQueueSendข้อความ เช่นbtn\r\n
Pass when: กดปุ่มแล้วเห็นข้อความบน serial โดย task กระพริบจาก Lab A ยังทำงานต่อ
Lab C — Shared resource lock (required)
หัวข้อที่มีชื่อว่า “Lab C — Shared resource lock (required)”เลือกอย่างน้อยหนึ่งข้อ:
C1 Mutex ของคุณเอง
หัวข้อที่มีชื่อว่า “C1 Mutex ของคุณเอง”- สร้าง
xSemaphoreCreateMutex - task สองตัวแชร์การพิมพ์หรือแชร์ตัวแปรสถานะภายใต้ Take/Give
C2 I²C lock ของ SDK
หัวข้อที่มีชื่อว่า “C2 I²C lock ของ SDK”- อ่านเซ็นเซอร์ใน task หนึ่ง
- ห่อด้วย
cm55_i2c_manager_i2c_lock/unlock(หรือ API ล็อกที่โปรเจกต์ของคุณมี)
Pass when: อธิบายได้ว่าทำไมต้องล็อก และสาธิตว่าไม่มีการแย่งบัสแบบสุ่มพัง
Lab D — Ready flag (recommended)
หัวข้อที่มีชื่อว่า “Lab D — Ready flag (recommended)”- สร้าง
xEventGroupCreate - task setup ตั้งบิต “READY” หลัง init เสร็จ
- task อื่น
xEventGroupWaitBitsก่อนเริ่มงาน
หรือใช้ binary semaphore เป็นสัญญาณ “พร้อมแล้ว” ก็ได้
Pass when: task ผู้รอไม่เริ่มงานก่อนสัญญาณพร้อม
Lab E — Timing notes (short write-up)
หัวข้อที่มีชื่อว่า “Lab E — Timing notes (short write-up)”ตอบสั้น ๆ (5–8 บรรทัด):
- ถ้าเอา
printfใส่ ISR จะเสี่ยงอะไร - ถ้า priority ของ task หนักสูงสุดตลอดเวลา ระบบจะเป็นอย่างไร
depth × sizeof(item)ของคิวกระทบ RAM อย่างไร
Troubleshooting
หัวข้อที่มีชื่อว่า “Troubleshooting”| อาการ | แนวทาง |
|---|---|
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 |
Submit checklist
หัวข้อที่มีชื่อว่า “Submit checklist”- 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 Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0
เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA