Timer Interrupt และการส่ง tick

บอร์ดพัฒนาเชื่อม debugger ข้างกราฟ log และออสซิลโลสโคปบนโต๊ะวิเคราะห์ระบบควบคุม
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ

ก่อนเริ่มฝึก

วัตถุประสงค์: อ่านการส่ง 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/การบิน

แผนผัง TIM2 เรียก ISR สั้น คัดลอก tick และ timestamp โดยคืน PRIMASK เดิม แล้วให้ main ทำ LED และส่ง log พร้อมแยก missed callback กับ dropped row

ไดอะแกรมการส่งข้อมูล ISR → main และตัวอย่างสังเคราะห์ ไม่ใช่ผลวัดบอร์ดจริง — เปิดแผนผัง Timer Interrupt ขนาดเต็ม

ขั้นตอนฝึก Timer Interrupt บน PC

  1. ดาวน์โหลด ชุด STM32 Timer Interrupt (ZIP) แตกลงโฟลเดอร์ใหม่ อ่าน README และคงชื่อ stm32_interrupt/sketch ให้ตรงกัน ตรวจ ผลคอมไพล์และ options กับ SHA manifest
  2. อ่าน callback: บันทึก micros() แล้วเพิ่ม tick เท่านั้น LED, CSV, serial และงานหนักอยู่ใน main ไม่มี delay/รอ buffer/I2C ใน ISR
  3. อ่าน main: เก็บ PRIMASK ปิด IRQ ชั่วครู่เพื่อคัดลอก tick กับ timestamp แล้วคืน mask เดิม volatile เพียงอย่างเดียวไม่ทำให้คู่ข้อมูลสอดคล้อง เมื่อมี tick ใหม่หลายตัว main ทำครั้งเดียวด้วยค่าล่าสุดและนับตัวที่ไม่ทำรายครั้ง
  4. รัน python test_analyze.py และ python analyze_interrupt.py synthetic/missed.csv เปรียบเทียบ เฉลยสังเคราะห์สี่กรณี กับ ใบงานเปล่า ใน ZIP มี normal/missed/wrap/dropped และคำสั่ง GNU C++11 host tests
  5. ใช้ 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 และกรอกตารางได้โดยไม่ต้องมีบอร์ด

แผนผัง ISR เก็บ timestamp และ tick ก่อน snapshot คู่แล้ว main ทำค่าล่าสุด แยก missed callback จาก dropped row และ service จาก IRQ latency

ใช้ 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 ข้อ เพื่อหาหัวข้อที่ควรทบทวน

หลังตรวจเฉลย ให้บันทึกคำตอบที่แก้ เหตุผล และสิ่งที่หลักฐานยังไม่ยืนยัน แล้วเลือกชุดถัดไปที่ช่วยตอบคำถามนั้น คะแนนใบงานกับแบบประเมินเป็นคนละส่วน ใช้เลือกทบทวนด้วยตนเอง

STM32timinglogไมโครคอนโทรลเลอร์