ก่อนเริ่มฝึก
วัตถุประสงค์: อ่านการส่ง tick จาก callback ไป main loop และข้อจำกัด latest-value พื้นฐาน: ผ่านบทงบเวลาและเข้าใจ polling เวลาฝึกโดยประมาณ: 45 นาที เป็นเวลาที่ผู้จัดทำเสนอ ยังไม่ได้วัดกับผู้เรียนจริง
ตรวจความเข้าใจ: อธิบายเหตุที่ tick ถูกข้ามกับเหตุที่สังเกตไม่ได้จาก log ใช้ผลชุดเดิมประกอบการเรียน การคอมไพล์หรือการจำลองที่ผ่านยังไม่ยืนยันบอร์ดหรือการบินจริง
ดูเส้นทางเรียนทั้งหมด · ทบทวนเซนเซอร์และการสื่อสาร
ชุด STM32: ฝึก Timer Interrupt และส่ง tick
ใช้ฝึกอะไร: ต่อจากชุด polling ไปสู่การแบ่งงานระหว่าง timer interrupt (ISR) กับ main loop เหมาะกับผู้ที่อ่าน C/C++, GPIO/serial และ unsigned timestamp ได้ เป้าหมายคือทำ ISR ให้สั้น รับข้อมูลร่วมเป็นคู่ที่สอดคล้อง และแยกงานที่รับไม่ทันออกจาก log ที่ส่งไม่ทัน ก่อนต่อยอดโครงสร้างเฟิร์มแวร์โดรน
อ้างอิง NUCLEO-F446RE / MB1136, STM32duino 3.0.0, TIM2 Timer Interrupt ขอ update 100 Hz (10 ms) คอมไพล์ ARM target ผ่าน โปรแกรม 21,652 ไบต์ / RAM 1,688 ไบต์ ไม่มี warning พร้อม host arithmetic tests และตัวตรวจ log บน Windows/Ubuntu ยังไม่ได้ upload หรือวัด ISR/timing บนบอร์ดจริง ไม่ใช่ flight controller port หรือผล RTOS/DMA/การบิน
ไดอะแกรมการส่งข้อมูล ISR → main และตัวอย่างสังเคราะห์ ไม่ใช่ผลวัดบอร์ดจริง — เปิดแผนผัง Timer Interrupt ขนาดเต็ม
ขั้นตอนฝึก Timer Interrupt บน PC
- ดาวน์โหลด ชุด STM32 Timer Interrupt (ZIP) แตกลงโฟลเดอร์ใหม่ อ่าน README และคงชื่อ
stm32_interrupt/sketch ให้ตรงกัน ตรวจ ผลคอมไพล์และ options กับ SHA manifest - อ่าน callback: บันทึก
micros()แล้วเพิ่ม tick เท่านั้น LED, CSV, serial และงานหนักอยู่ใน main ไม่มี delay/รอ buffer/I2C ใน ISR - อ่าน main: เก็บ PRIMASK ปิด IRQ ชั่วครู่เพื่อคัดลอก tick กับ timestamp แล้วคืน mask เดิม
volatileเพียงอย่างเดียวไม่ทำให้คู่ข้อมูลสอดคล้อง เมื่อมี tick ใหม่หลายตัว main ทำครั้งเดียวด้วยค่าล่าสุดและนับตัวที่ไม่ทำรายครั้ง - รัน
python test_analyze.pyและpython analyze_interrupt.py synthetic/missed.csvเปรียบเทียบ เฉลยสังเคราะห์สี่กรณี กับ ใบงานเปล่า ใน ZIP มี normal/missed/wrap/dropped และคำสั่ง GNU C++11 host tests - ใช้ IDE 2/CLI กับ core 3.0.0 เลือก Nucleo-64 / F446RE, generic Serial, USB None, Smallest (-Os), Newlib Nano แล้ว Verify/Compile ตาม README ไม่ใช้ compile success แทนผล concurrency หรือ timing บนบอร์ด
อ่านผล Interrupt และคำแนะนำเบื้องต้น
| ค่า CSV | ความหมาย |
|---|---|
| tick | callback ที่ถูกเรียกตั้งแต่ boot แบบ uint32 ไม่ใช่ hardware update events ทั้งหมด |
| service_us | เวลาจาก timestamp ที่ ISR ล่าสุดบันทึกถึง main เริ่ม LED task หลัง snapshot/handoff หน่วย µs |
| work_us | เวลา LED task ไม่รวม snapshot/handoff, จัด CSV และส่ง serial |
| missed | callback ที่ main ไม่ทำงานแยกรายครั้ง เช่น tick 1 → 4 มี missed 2 |
| dropped | จำนวนสะสมแถว log ที่ส่งไม่ได้ ไม่ใช่จำนวน callback ที่พลาด |
service_us ไม่ใช่ IRQ latency จาก hardware deadline: ชุดนี้ไม่ได้วัดเวลาที่ timer ควร update ถึง ISR เข้า หลาย update ระหว่างปิด IRQ อาจรวมเป็น callback เดียว tick/missed ตรวจเหตุการณ์ที่ถูกรวมแบบนั้นไม่ได้ จึงห้ามสรุปจาก service ต่ำหรือ missed 0 ว่า timer ไม่พลาด
missed.csv มี tick 1 → 4 → 5, missed รวม 2, service สูงสุด 500 µs และ work สูงสุด 2,500 µs เกินงบตัวอย่าง 2 ms หนึ่งแถว ส่วน dropped.csv มี tick 1 → 3 และ dropped 1: task 2 ทำแล้วแต่ไม่มีแถวส่ง ค่าเหล่านี้เป็น ข้อมูลแต่งสำหรับสอน เมื่อแถวหาย analyzer รวม missed ได้เฉพาะแถวที่เห็น ค่าตัวนับ 0 ไม่พิสูจน์ว่าเริ่มเก็บตั้งแต่ boot หรือไม่มีข้อมูลหายหลังแถวสุดท้าย
แนะนำให้เปลี่ยนงาน main ทีละอย่าง ใช้ availableForWrite() และไม่รอพื้นที่ serial การจัด/ส่ง log ยังมีผลต่อการรับ tick ถัดไป แม้ไม่อยู่ใน work_us ขอบเขต work_us ต่างจากชุด polling จึงเทียบเป็น benchmark ตรง ๆ ไม่ได้ LED สลับทุก 50 ครั้งที่ main ทำงาน จึงประมาณ 500 ms เมื่อรับครบ ไม่รับรองคาบเมื่อมี backlog
TIM2 ต้องไม่ถูกใช้ซ้ำโดย library อื่น แยกไฟล์เมื่อ reset/drop counter wrap และรักษา service/work ให้น้อยกว่า 2^31 µs (ประมาณ 35.8 นาที) ใช้ unsigned delta สำหรับ tick wrap; host tests ตรวจเลข/ขอบเขต ไม่จำลอง ISR concurrency เมื่อมีบอร์ดจึงทำ capture/logic analyzer ตาม README แยกต่างหาก ยังไม่ต่อ ESC/มอเตอร์/IMU/radio ในแบบฝึกนี้
อ้างอิง HardwareTimer ทางการ, implementation pin 3.0.0 และ ST UM1724 สำหรับ MB1136
เรียนต่อและทบทวน
ทบทวน STM32 และงบเวลา · เรียนต่อ คิวข้อมูลจาก ISR · กลับภาพรวมขั้นสูง
ฝึกอ่าน tick และแยก missed กับ dropped
วัตถุประสงค์: อ่าน snapshot และ latest-value handoff แยก callback ที่ main ไม่ทำรายครั้งจากแถว Log ที่ส่งไม่ได้ พื้นฐาน: C/C++, unsigned integer และบท Polling Timing เวลาเสนอ: 45–60 นาที ยังไม่ได้วัดกับผู้เรียน อ่าน CSV/JSON และกรอกตารางได้โดยไม่ต้องมีบอร์ด
ใช้ CSV สังเคราะห์เดิมสี่กรณีรวม 11 แถว ลำดับ handoff เก้า calls อ่านจาก host test แล้วคำนวณ ไม่มีผลรันหรือวัดบอร์ดใหม่ คงภาพและแผนผังประกอบเดิม
ดาวน์โหลด วิธีฝึก Timer Interrupt, ใบงาน Interrupt 8 ข้อ, ข้อมูลเดิมและโจทย์ที่ประกาศ, ตารางคู่แถวว่าง, ตาราง handoff ว่าง และ แบบรายงานว่าง ก่อนเทียบ เฉลยพร้อมเหตุผล, เฉลยคู่แถว และ เฉลย handoff ตรวจที่มา/SHA-256 จาก manifest
1. อ่าน callback และ snapshot · I1–I2
แยกงานที่อยู่ ISR กับ main แล้วอ่านลำดับ savedMask → disable IRQ → copy tick/timestamp → restore mask คำแนะนำ: volatile อย่างเดียวไม่รับรอง snapshot สองช่อง และควรคืนสถานะ IRQ เดิมที่ผู้เรียกมี การอ่าน source ยังไม่ใช่ผลทดสอบ concurrency บนบอร์ด
2. ไล่ handoff และคู่แถว · I3–I5
กรอกเก้า calls โดยแยก initial ของ normal กับ wrap แล้วคำนวณคู่แถวทั้งเจ็ด แยก missed รายแถวกับ dropped สะสม คำแนะนำ: Ready ทำงานค่าล่าสุดครั้งเดียว Idle/Invalid ไม่ออก missed ใหม่ จึงเว้นช่องผลไว้ งานที่ส่ง row ไม่ได้ยังอาจทำแล้ว แต่ service/work ในแถวที่ไม่อยู่ใน CSV ให้ตอบว่าไม่ทราบ
3. Wrap และจุดวัดเวลา · I6–I7
คำนวณ tick 4,294,967,294→1 ด้วย uint32 แล้วตรวจ delta ที่ขอบ 2^31 ของ handoff เทียบโจทย์ work 1,999/2,000/2,001 µs กับงบ 2,000 คำแนะนำ: ใช้เครื่องหมาย > ค่าเท่าขอบไม่เกินงบ และ service จาก ISR timestamp ถึง main เริ่ม LED ไม่ใช่ IRQ latency จาก hardware deadline ขอบ work ต่างจาก polling จึงไม่เทียบ benchmark ตรง ๆ
4. เขียนรายงานตามขอบสังเกต · I8
เลือกกรณีหนึ่งอ้างไฟล์ แถว คู่ และหน่วย แยก สิ่งที่เห็น → สิ่งที่ยังไม่ทราบ → หลักฐานเพิ่ม คำแนะนำ: tick นับ callback ที่ถูกเรียก หลาย hardware updates อาจรวมเป็น callback เดียวขณะปิด IRQ จึงไม่ใช้ missed 0 รับรอง timer ครบทุกเหตุ ผล compile เดิมยืนยัน build target ส่วน upload/LED/Serial/timing บนบอร์ดต้องตรวจแยก
ตรวจตนเอง: เสนอข้อละ 2 (คำตอบ 1 + เหตุผล/หน่วย/ขอบ 1) รวม 16 เพื่อเลือกทบทวน แยกจากใบงานเดิมและไม่ใช่ผลผู้เรียน รอบนี้ตรวจที่มา ไบต์ ตัวเลข และคำอธิบาย ไม่มีรัน analyzer/host tests/compile/upload/SITL ใหม่ เมื่ออธิบายได้ให้ต่อ คิวข้อมูลจาก ISR
เลือกชุดฝึกหรือทบทวนต่อ
กลับสารบัญชุดฝึก MCU 10 ชุด เพื่อเลือกโจทย์ตามเป้าหมายและพื้นฐานที่ควรรู้ หรือ ทำแบบประเมินความเข้าใจ 12 ข้อ เพื่อหาหัวข้อที่ควรทบทวน
หลังตรวจเฉลย ให้บันทึกคำตอบที่แก้ เหตุผล และสิ่งที่หลักฐานยังไม่ยืนยัน แล้วเลือกชุดถัดไปที่ช่วยตอบคำถามนั้น คะแนนใบงานกับแบบประเมินเป็นคนละส่วน ใช้เลือกทบทวนด้วยตนเอง