ก่อนเริ่มฝึก
วัตถุประสงค์: แยก fresh/stale และอ่านขอบอายุข้อมูล 20,000 µs พื้นฐาน: เข้าใจคิว FIFO และผลต่างเวลาจาก clock เดียวกัน เวลาฝึกโดยประมาณ: 60 นาที เป็นเวลาที่ผู้จัดทำเสนอ ยังไม่ได้วัดกับผู้เรียนจริง
ตรวจความเข้าใจ: อธิบาย fresh ที่ขอบเวลา stale ที่เกินขอบ และสิ่งที่ gate ไม่รับรอง ใช้ผลชุดเดิมประกอบการเรียน การคอมไพล์หรือการจำลองที่ผ่านยังไม่ยืนยันบอร์ดหรือการบินจริง
ดูเส้นทางเรียนทั้งหมด · ทบทวนเซนเซอร์และการสื่อสาร
ชุด STM32: คัดข้อมูลเก่าก่อนนำไปใช้
ใช้ฝึกอะไร: ต่อจาก คิว ISR ไป main loop ฝึกตรวจอายุข้อมูลหลัง pop และกำหนดว่าจะทำงานต่อหรือข้ามข้อมูลที่เก่า เหมาะกับผู้ที่เข้าใจ C/C++, FIFO, timestamp และ PRIMASK เป้าหมายคือแยก รักษาลำดับข้อมูล ออกจาก ข้อมูลยังใหม่พอสำหรับงาน ก่อนออกแบบระบบรับเซนเซอร์หรือ control loop
ชุดนี้ใช้ NUCLEO-F446RE / MB1136, STM32duino 3.0.0, TIM2 ขอ 100 Hz และคิวสี่ช่อง/drop-newest เดิม คอมไพล์ ARM ผ่าน โปรแกรม 21,796 ไบต์ / RAM 1,736 ไบต์ ไม่มี warning ทดสอบ gate/FIFO/log และตรวจ ZIP ซ้ำบน Windows/Ubuntu แล้ว ยังไม่มีผลบอร์ดจริงหรือการบิน ตัวอย่างใช้ LED ไม่มี actuator failsafe
แผนผังนโยบายและตัวเลขสังเคราะห์ 20 ms เป็นเกณฑ์ฝึก ไม่ใช่ requirement โดรน เปิดแผนผังอายุข้อมูลขนาดเต็ม
ขั้นตอนฝึกอายุข้อมูลบน PC
- ดาวน์โหลด ชุด STM32 Data Freshness (ZIP) แตกใหม่ คงชื่อ
stm32_freshness/sketch/header อ่าน README พร้อม ผลคอมไพล์และ options ของ freshness และ SHA manifest ของ freshness - อ่าน
freshness.h:uint32_t(now-stamp) <= 20000เป็น fresh รวมค่าที่เท่ากับเกณฑ์ จาก clock เดียว ไม่มี reset เวลาจริงต้องต่ำกว่า 2^31 µs (ประมาณ 35.8 นาที) ใช้ unsigned subtraction ผ่าน wrap หนึ่งครั้งได้เมื่ออยู่ในสัญญานี้ ห้ามใช้อนุมานหลายรอบ wrap - อ่าน main: pop หนึ่ง event และคืน PRIMASK เดิม ตรวจอายุ ณ เวลาตัดสินใจ ถ้า fresh ทำ LED task; stale ข้าม task แต่ยังพยายามส่ง CSV ทุก event ที่ pop เพื่อเห็นเหตุผล ไม่เพิ่ม overflow/dropped เพราะตัดสินใจ stale ส่วน ISR ยังคง push ครั้งเดียว ไม่มี LED/serial/delay
- รัน C++11
test_queue.cppตาม README ตรวจ cutoff/cutoff+1, timestamp wrap, backlog และ FIFO จากนั้นpython test_analyze.pyและpython analyze_freshness.py synthetic/normal.csvทำซ้ำ overflow/wrap/dropped - กรอก ใบงานอายุข้อมูลเปล่า ก่อนเทียบ เฉลย freshness สี่กรณี ทุก CSV เป็นข้อมูลสังเคราะห์ Host tests ไม่จำลอง IRQ concurrency และค่า work ไม่ใช่ผลวัด NUCLEO
- หากมี SDK reference เดิม Verify/Compile core 3.0.0 และ F446RE ตาม receipt ตรวจ options/SHA ก่อนเทียบ ไม่มีขั้นต่อมอเตอร์/ESC หรือผล upload ในรอบนี้
อ่านผล fresh และ stale
| ช่อง CSV | ใช้ตีความอย่างไร |
|---|---|
tick |
ลำดับ callback, stale ที่ส่ง row ได้ยังนับเป็น event ที่เห็น ไม่ใช่ช่องว่าง tick |
age_us |
callback timestamp ถึงเวลาตรวจหลัง pop ไม่ใช่ sensor acquisition age หรือ hardware IRQ latency |
state |
fresh อายุ <=20,000 µs; stale อายุ >20,000 µs |
work_us |
เวลา LED task เฉพาะ fresh; stale=0 หมายถึงข้าม task ไม่ใช่ loop ใช้เวลาศูนย์ แยก gate/pop/CSV/serial ออก |
overflow |
จำนวนรายการที่ปฏิเสธ ณ enqueue ของ event ที่รับได้ ไม่ใช่ค่าส่าสุดท้าย capture |
dropped |
จำนวน rows ที่ main ส่งไม่ได้ก่อน row ปัจจุบัน อาจเป็น fresh หรือ stale จึงนับ stale ของแถวที่หายไม่ได้ |
กรณี normal มี fresh 2/stale 1 โดย 20,000 ยัง fresh และ 20,001 stale; overflow มี fresh 3/stale 2 ปฏิเสธตอน enqueue 2 และ work เกิน budget ฝึก 2,000 µs หนึ่ง row; wrap มี tick 4294967295→0→1 ส่วน timestamp wrap ตรวจแยกใน C++; dropped มี fresh 1/stale 1 ที่เห็น และ row tick 2 ส่งไม่ได้หนึ่งแถว
Analyzer ตรวจ header ตามลำดับ หกช่อง uint32 ของห้าช่องตัวเลข state ต้องตรง age และ stale work ต้องศูนย์ จำกัด 10 MB/100,000 rows ปฏิเสธ age/work >=2^31, tick ซ้ำ/ถอยและ counters reset/ถอย/wrap ระหว่าง rows ที่เห็นต้องมี delta_tick = delta_overflow + delta_dropped + 1 แบบ uint32 และ delta_tick อยู่ (0,2^31) จำนวน fresh/stale สรุปเฉพาะ rows ที่เห็น ส่วน no_reported_queue_or_log_losses ไม่ยืนยัน capture ครบหรือไม่มี stale เพราะ stale เป็นการตัดสินใจ ไม่ใช่ queue/log loss
คำแนะนำ: เลือก cutoff จาก requirement และเวลาที่วัดจริง แยก timestamp ตอนรับ callback ออกจากตอนเก็บเซนเซอร์ ตรวจใหม่ใกล้จุดใช้ถ้ามีงานระหว่างทาง เพราะ fresh ณ เวลาตรวจไม่ได้รับรองว่ายัง fresh เมื่อใช้ภายหลัง FIFO สี่ช่องไม่รับประกันอายุสูงสุด 40 ms, hardware updates อาจถูกรวมระหว่าง mask IRQ และ overflow หลัง event สุดท้ายอาจไม่ปรากฏใน log LED สลับทุก 50 fresh tasks ไม่รับรองทุก 500 ms; เมื่อ stale จะคงค่า LED เดิม ไม่ใช่ safe state สำหรับ actuator
ใช้ HardwareTimer API และ CMSIS PRIMASK กับ SDK pinned เดิม ไม่มีผล ISR/timing/serial/LED บนบอร์ดจริง sensor/RTOS/DMA/flight stack port หรือ flight safety validation
เรียนต่อและทบทวน
ทบทวน คิวข้อมูลจาก ISR · เรียนต่อ วินิจฉัย Log ของ STM32 · กลับภาพรวมขั้นสูง
อ่านข้อมูลผ่านเครื่องมือบนเว็บ
เปิดเครื่องมืออ่าน CSV และกราฟ Log เพื่อฝึกจากตัวอย่างสังเคราะห์หรือ CSV หกช่องของชุด Freshness Gate ประมวลผลในเครื่อง รองรับไม่เกิน 1 MB/10,000 แถว ขอบเขตแคบกว่า analyzer Python เดิม ใช้ผลจากทุกแถวคำนวณสถิติ ส่วนกราฟแสดงสูงสุด 1,000 จุดและอาจไม่เห็นยอดแหลมทั้งหมด
ฝึกตัดสินใจเมื่อข้อมูลเก่าทีละขั้น
วัตถุประสงค์: อ่านขอบเวลา แยกข้อมูลเก่าจากข้อมูลหาย และอธิบายว่าข้อมูลสด ณ จุดใด พื้นฐาน: เข้าใจ FIFO และ unsigned timestamp เวลาเสนอ: 45–60 นาที ยังไม่ได้วัดกับผู้เรียนจริง ใช้กระดาษหรือโปรแกรมอ่าน CSV ได้ ไม่ต้องมีบอร์ดหรือติดตั้งเพิ่ม
ใช้ร่วมกับภาพเสมือนจริงและแผนผังเดิม Log 13 แถวเป็นข้อมูลสังเคราะห์เดิม ส่วนตัวอย่าง clock และการตรวจซ้ำประกาศใหม่เพื่อคำนวณ ไม่ใช่ timestamp ที่จับจากบอร์ด
ดาวน์โหลด วิธีฝึกอายุข้อมูล, ใบงาน 8 ข้อ, ตารางคำนวณ clock ว่าง, ตัวอย่างที่ประกาศ, ข้อมูลเดิม 13 แถว และ summary เดิม ทำก่อนเปิด เฉลยเหตุผล กับ เฉลย clock ตรวจที่มา/SHA-256 จาก manifest
1. ตรวจค่าที่ขอบเวลา · Q1–Q2
เริ่มจาก normal อายุ 0, 20,000 และ 20,001 µs จัด fresh/stale พร้อมแปลงหน่วย จากนั้นคำนวณตัวอย่าง clock หกกรณีทั้งก่อนและผ่าน unsigned wrap ใช้ clock เดียวกัน ไม่มี reset และช่วงเวลาจริงต่ำกว่า 2^31 µs ระบุสัญญานี้ไว้ในใบงาน ตัวเลข clock ที่เห็นเพียงอย่างเดียวไม่ยืนยันว่าไม่มี reset หรือหลายรอบ wrap
คำแนะนำ: CSV เดิมมี tick wrap แต่ไม่มี raw timestamp จึงไม่ใช้ CSV นั้นตรวจ timestamp wrap ตัวอย่างคำนวณเป็นข้อมูลที่ประกาศแยกใน declaration
2. แยกความเก่าจากข้อมูลหาย · Q3–Q6
นับ fresh/stale ในแต่ละกรณี อ้าง data_row ซึ่งนับแถวข้อมูลไม่รวม header แยก stale ที่ข้าม LED ออกจาก overflow ที่เข้า queue ไม่ได้ และ dropped ที่ส่ง row ไม่ได้ จากนั้นคำนวณ delta ของ overflow tick4→7 และ dropped tick1→3 โดยใช้สมการของ schema เดิม
คำแนะนำ: work=0 ของ stale ยังมีต้นทุน pop/gate/CSV/Serial และ fresh ก็ยังมีงานเกินงบได้ ส่วน state ของ row ที่ส่งไม่ได้ไม่มีอยู่ในข้อมูล ให้ตอบว่าไม่ทราบพร้อมเหตุผล
3. ตรวจใหม่ใกล้จุดใช้ · Q7
ใช้ตัวอย่างที่ประกาศ stamp=100000 µs ตรวจที่119900 µs แล้วนำไปใช้ที่120100 µs คำนวณอายุทั้งสองจุดพร้อมช่วงรอระหว่างทาง อธิบายว่าการผ่านตอนตรวจบอกอะไรได้ ตัวอย่างนี้ไม่มีผลวัดงาน LED หรือผลรันเฟิร์มแวร์ใหม่
4. กำหนดสิ่งที่ต้องรู้ก่อนต่อยอด · Q8
เลือกจุด timestamp ให้สัมพันธ์กับการเก็บเซนเซอร์ กำหนด cutoff จาก requirement และหลักฐานเวลาที่วัด พร้อมพฤติกรรมเมื่อข้อมูลเก่า/ขาด LED ตัวอย่างคงค่าเดิมเมื่อ stale จึงไม่ใช่ actuator failsafe หรือการรับรองพร้อมบิน เมื่ออธิบายได้ให้ต่อ วินิจฉัย Log ของ STM32 และ เครื่องมืออ่าน CSV
ตรวจตนเอง: เกณฑ์ที่เสนอข้อละ2 (คำตอบ1+เหตุผล/หน่วย/ข้อจำกัด1) รวม16 ใช้เลือกทบทวน ไม่ใช่ผลผู้เรียนจริง รอบนี้ตรวจข้อมูลและคำอธิบาย ไม่รัน compile/firmware/SITL หรือทดลองบอร์ดใหม่
เลือกชุดฝึกหรือทบทวนต่อ
กลับสารบัญชุดฝึก MCU 10 ชุด เพื่อเลือกโจทย์ตามเป้าหมายและพื้นฐานที่ควรรู้ หรือ ทำแบบประเมินความเข้าใจ 12 ข้อ เพื่อหาหัวข้อที่ควรทบทวน
หลังตรวจเฉลย ให้บันทึกคำตอบที่แก้ เหตุผล และสิ่งที่หลักฐานยังไม่ยืนยัน แล้วเลือกชุดถัดไปที่ช่วยตอบคำถามนั้น คะแนนใบงานกับแบบประเมินเป็นคนละส่วน ใช้เลือกทบทวนด้วยตนเอง