ก่อนเริ่มฝึก
วัตถุประสงค์: ฝึก FIFO ขนาดจำกัดและนโยบาย drop-newest พื้นฐาน: ผ่าน Timer Interrupt และอ่าน counter ได้ เวลาฝึกโดยประมาณ: 60 นาที เป็นเวลาที่ผู้จัดทำเสนอ ยังไม่ได้วัดกับผู้เรียนจริง
ตรวจความเข้าใจ: แยก overflow ที่ enqueue จาก dropped ที่ส่ง Serial ไม่ได้ ใช้ผลชุดเดิมประกอบการเรียน การคอมไพล์หรือการจำลองที่ผ่านยังไม่ยืนยันบอร์ดหรือการบินจริง
ดูเส้นทางเรียนทั้งหมด · ทบทวนเซนเซอร์และการสื่อสาร
ชุด STM32: คิวข้อมูล ISR ไป main loop
ใช้ฝึกอะไร: ต่อจาก Timer Interrupt และ tick ล่าสุด มาฝึกเก็บ event ที่รับแล้วตามลำดับ FIFO จัดการคิวเต็มและอ่านอายุข้อมูล เหมาะกับผู้ที่อ่าน C/C++, serial, unsigned timestamp และ PRIMASK snapshot ได้ เป้าหมายคือเลือกนโยบายคิวให้ตรงงานก่อนต่อยอดการรับเซนเซอร์หรือออกแบบเฟิร์มแวร์โดรน
อ้างอิง NUCLEO-F446RE / MB1136, STM32duino 3.0.0, TIM2 ขอ update 100 Hz คอมไพล์ ARM target ผ่าน โปรแกรม 21,760 ไบต์ / RAM 1,736 ไบต์ ไม่มี warning พร้อม FIFO/log tests และตรวจซ้ำจาก ZIP บน Windows/Ubuntu ยังไม่มี upload หรือผล ISR/timing บอร์ดจริง ไม่ใช่ RTOS/DMA/flight controller port
แผนผังคิวและตัวอย่างสังเคราะห์ ไม่ใช่ผลวัดบอร์ดจริง เปิดแผนผังคิว ISR ขนาดเต็ม
ขั้นตอนฝึกคิวบน PC
- ดาวน์โหลด ชุด STM32 Event Queue (ZIP) แตกใหม่ อ่าน README คงชื่อ
stm32_queue/sketch ตรวจ ผลคอมไพล์และ options ของคิว กับ SHA manifest ของคิว - อ่าน
event_queue.h: ใช้ได้ครบ 4 ช่อง คิวเต็มจะ ปฏิเสธรายการใหม่และคงรายการเดิม (drop-newest) ไม่เขียนทับของเก่า ไม่รอใน ISR มี producer เดียวคือ TIM2 callback และ consumer เดียวคือ main - อ่าน callback: เก็บ tick/timestamp/overflow ณ ตอน enqueue แล้ว push ครั้งเดียว ถ้าเต็มเพิ่ม overflow main เก็บ PRIMASK ปิด IRQ ชั่วครู่รอบ pop หนึ่ง event แล้วคืน mask เดิม ก่อนทำ LED/CSV/serial นี่เป็นคิวที่ใช้ interrupt masking ไม่ใช่ lock-free หรือคิวหลาย thread
- รัน
python test_analyze.py,python analyze_queue.py synthetic/overflow.csvและ C++11test_queue.cppตาม README เทียบ เฉลยคิวสี่กรณี แล้วกรอก ใบงานคิวเปล่า Host tests ตรวจ FIFO/full/refill/wrap/payload ไม่จำลอง MCU concurrency - Verify/Compile ด้วย IDE 2/CLI, core 3.0.0, Nucleo-64 / F446RE, generic Serial, USB None, Smallest (-Os), Newlib Nano ตาม receipt ไม่มีขั้นต่อมอเตอร์/ESC หรือการ upload ในผลตรวจรอบนี้
อ่านอายุข้อมูลและคิวเต็ม
| ค่า CSV | ความหมาย |
|---|---|
| tick | หมายเลข callback ของ event ที่รับเข้า queue แบบ uint32 |
| age_us | อายุจาก callback timestamp ถึง main เริ่ม LED task หลัง pop หน่วย µs |
| work_us | เวลา LED task ไม่รวม pop/จัด CSV/ส่ง serial |
| overflow | จำนวนสะสม enqueue ที่ถูกปฏิเสธ ก่อน event นี้เข้า queue |
| dropped | จำนวนสะสมแถวที่ main ส่งไม่ได้ก่อนแถวนี้ ไม่ใช่ queue overflow |
overflow.csv เก็บ tick 1/2/3/4 ตามลำดับ ปฏิเสธ 5/6 ขณะเต็มแล้วรับ 7 เมื่อมีช่อง event 7 จึงมี overflow 2 ส่วน event เดิม 1–4 ยังคง snapshot 0 มี age สูงสุด 40,000 µs และ work 2,500 µs หนึ่งแถวเกินงบสอน 2 ms ส่วน dropped.csv มี tick 1 → 3 กับ dropped 1: task 2 ทำแล้วแต่แถวส่งไม่ได้ ทั้งสองเป็น ข้อมูลแต่งสำหรับสอน
ระหว่างแถวที่เห็น delta_tick = delta_overflow + delta_dropped + 1 ตัวตรวจปฏิเสธช่องว่างที่ counter อธิบายไม่ได้ รวมถึง tick ย้อน/ซ้ำ ค่าไม่ใช่จำนวนเต็มหรือเกินขอบเขต รองรับ tick wrap แต่ให้แยกไฟล์หลัง reset/counter wrap และจำกัด age/work น้อยกว่า 2^31 µs (ประมาณ 35.8 นาที)
overflow เป็น snapshot ตอน enqueue ไม่ใช่ค่าล่าสุดเมื่อส่งแถว จึงอาจไม่เห็นการปฏิเสธหลัง event สุดท้ายที่รายงาน Counter 0 ไม่พิสูจน์ว่าเก็บครบตั้งแต่ boot หรือไม่มีข้อมูลหายหลังแถวสุดท้าย age_us ก็ไม่ใช่ hardware IRQ latency/deadline และ callback ticks ตรวจ timer update ที่รวมระหว่าง mask IRQ ไม่ได้
แนะนำให้เลือกนโยบายตามงาน: logger อาจต้องรักษาประวัติ แต่ controller อาจต้องใช้ค่าล่าสุดและจำกัดอายุข้อมูล FIFO สี่ช่องไม่ได้รับรองว่า age สูงสุด 40 ms เพราะ main อาจหยุดนานกว่านั้น อย่าเพิ่มขนาดคิวเพื่อกลบ overload หรือใช้ข้อมูลเก่าไปควบคุม actuator โดยไม่ตรวจ freshness งาน CSV/serial อยู่นอก work_us แต่ยังทำให้ pop ถัดไปช้า LED สลับทุก 50 task ที่ main รับ จึงไม่รับรอง blink 500 ms เมื่อมี backlog
เมื่อมีบอร์ดให้ตรวจ PCB/LD2/USART2 ตาม README ก่อน capture ที่ 115200 baud เก็บรุ่น/options/ระยะเวลา/SHA ในใบงาน หากจะวัด occupancy หรือ IRQ latency ต้องกำหนด protocol และจุดวัดแยก TIM2 ต้องไม่ใช้ซ้ำกับ library อื่น ขั้นฮาร์ดแวร์ยังพักไว้ตามเดิม
อ้างอิง HardwareTimer ทางการ, implementation pin 3.0.0 และ ST UM1724 MB1136
เรียนต่อและทบทวน
ทบทวน Timer Interrupt และการส่ง tick · เรียนต่อ อายุข้อมูลและ Freshness Gate · กลับภาพรวมขั้นสูง
ฝึกไล่คิวและอ่านเหตุข้อมูลหายทีละขั้น
วัตถุประสงค์: เลือกนโยบายคิวให้ตรงงานและอธิบาย counter/อายุจากหลักฐาน พื้นฐาน: ผ่าน Timer Interrupt และ unsigned timestamp เวลาเสนอ: 45–60นาที ยังไม่ได้วัดกับผู้เรียนจริง ใช้กระดาษหรือโปรแกรมอ่านCSVได้ ไม่ต้องมีบอร์ดหรือติดตั้งเพิ่ม
ใช้ร่วมกับภาพเสมือนจริงและแผนผังคิวเดิม ตัวอย่างลำดับ12ขั้นด้านล่างประกาศเพื่ออธิบาย ไม่ใช่enqueue traceที่จับจากบอร์ด และอนุมานลำดับเดียวจากageในCSVไม่ได้
ดาวน์โหลด วิธีฝึกคิว, ใบงาน8ข้อ, ตารางคิว12ขั้นว่าง, ลำดับที่ประกาศ, ข้อมูลเดิม13แถว และ summaryเดิม ทำก่อนเปิด เฉลยเหตุผล กับ เฉลยตารางคิว ตรวจที่มา/SHA-256ได้จาก manifest
1. ไล่FIFOโดยยังไม่ดูเฉลย · Q1–Q3
เริ่มคิวว่าง4ช่อง ทำpush1..6 → popหนึ่งรายการ → push7 → popอีก4ครั้ง เขียนคิวจากเก่าสุดไปใหม่สุดหลังทุกขั้น พร้อมcounterและsnapshotของeventที่pop ลองตอบว่าทำไมpush5/6ไม่เปลี่ยนรายการเก่า และทำไมevent1–4ยังเก็บoverflow0แม้ส่งหลังcounterเพิ่มแล้ว
คำแนะนำ:payloadเก็บcounterตอนenqueue ให้แยกจากcounterล่าสุดของระบบ เลือกว่าจะรักษาประวัติหรือใช้ค่าล่าสุดตามงาน แล้วเทียบกับ บทTimer Interrupt ซึ่งใช้handoffคนละนโยบาย
2. อธิบายช่องว่างและtickวนกลับ · Q4–Q5
ใช้overflow tick4→7 และdropped tick1→3 คำนวณdeltaสามชนิดแล้วตรวจสมการที่อธิบายช่องว่าง จากนั้นใช้wrap4294967295→0→1 ลองคำนวณด้วยmod2^32 data_rowในไฟล์รวมหมายถึงแถวข้อมูลไม่รวมheader ไม่ใช่เลขบรรทัดของไฟล์ดิบที่มีบรรทัดว่าง
3. อ่านหน่วยและขอบเขตงาน · Q6–Q7
แปลงage40000usเป็นms หาแถวworkเกินงบสอน2000us แล้วระบุว่าageเริ่มจากจุดใดและworkครอบคลุมงานใด คำแนะนำ:การขอTIM2 100Hzเป็นค่าตั้ง ไม่ใช่ผลวัดความถี่จริง อย่าใช้ageแทนIRQ latency หรือใช้workแทนเวลาทั้งloop
4. สรุปสิ่งที่counterยังไม่ยืนยัน · Q8
เมื่อnormalแสดงcounter0 ให้เขียนว่าอะไรยืนยันได้และยังต้องมีหลักฐานใดก่อนอ้างcaptureครบหรือไม่มีloss ตำแหน่งsnapshot/ขอบไฟล์/resetและtimer updateที่รวมระหว่างmaskIRQยังสำคัญ หลังอธิบายได้ให้ต่อ อายุข้อมูลและFreshness Gate
ตรวจตนเอง: เกณฑ์ที่เสนอข้อละ2 (คำตอบ1+เหตุผล/หน่วย/ข้อจำกัด1) รวม16 ใช้เลือกทบทวน ไม่มีเกณฑ์รับรองพร้อมบินหรือผลผู้เรียนจริง รอบนี้ตรวจข้อมูล/คำอธิบายบนPC ไม่รันcompile/firmware/SITLหรือทดลองบอร์ดใหม่
เลือกชุดฝึกหรือทบทวนต่อ
กลับสารบัญชุดฝึก MCU 10 ชุด เพื่อเลือกโจทย์ตามเป้าหมายและพื้นฐานที่ควรรู้ หรือ ทำแบบประเมินความเข้าใจ 12 ข้อ เพื่อหาหัวข้อที่ควรทบทวน
หลังตรวจเฉลย ให้บันทึกคำตอบที่แก้ เหตุผล และสิ่งที่หลักฐานยังไม่ยืนยัน แล้วเลือกชุดถัดไปที่ช่วยตอบคำถามนั้น คะแนนใบงานกับแบบประเมินเป็นคนละส่วน ใช้เลือกทบทวนด้วยตนเอง