อายุข้อมูลและ Freshness Gate

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

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

วัตถุประสงค์: แยก 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

แผนผัง main pop event จาก FIFO แล้วตรวจอายุ callback ถ้าไม่เกิน 20 ms ทำงาน LED ถ้าเกินข้ามงาน ทั้งสองกรณียังพยายามส่ง CSV และแยก stale ออกจาก overflow และ dropped

แผนผังนโยบายและตัวเลขสังเคราะห์ 20 ms เป็นเกณฑ์ฝึก ไม่ใช่ requirement โดรน เปิดแผนผังอายุข้อมูลขนาดเต็ม

ขั้นตอนฝึกอายุข้อมูลบน PC

  1. ดาวน์โหลด ชุด STM32 Data Freshness (ZIP) แตกใหม่ คงชื่อ stm32_freshness/sketch/header อ่าน README พร้อม ผลคอมไพล์และ options ของ freshness และ SHA manifest ของ freshness
  2. อ่าน freshness.h: uint32_t(now-stamp) <= 20000 เป็น fresh รวมค่าที่เท่ากับเกณฑ์ จาก clock เดียว ไม่มี reset เวลาจริงต้องต่ำกว่า 2^31 µs (ประมาณ 35.8 นาที) ใช้ unsigned subtraction ผ่าน wrap หนึ่งครั้งได้เมื่ออยู่ในสัญญานี้ ห้ามใช้อนุมานหลายรอบ wrap
  3. อ่าน main: pop หนึ่ง event และคืน PRIMASK เดิม ตรวจอายุ ณ เวลาตัดสินใจ ถ้า fresh ทำ LED task; stale ข้าม task แต่ยังพยายามส่ง CSV ทุก event ที่ pop เพื่อเห็นเหตุผล ไม่เพิ่ม overflow/dropped เพราะตัดสินใจ stale ส่วน ISR ยังคง push ครั้งเดียว ไม่มี LED/serial/delay
  4. รัน 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
  5. กรอก ใบงานอายุข้อมูลเปล่า ก่อนเทียบ เฉลย freshness สี่กรณี ทุก CSV เป็นข้อมูลสังเคราะห์ Host tests ไม่จำลอง IRQ concurrency และค่า work ไม่ใช่ผลวัด NUCLEO
  6. หากมี 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 ได้ ไม่ต้องมีบอร์ดหรือติดตั้งเพิ่ม

ภาพนำทางตรวจอายุที่ขอบ20ms แยกfresh/staleจากqueue overflowและSerial dropped พร้อมตัวอย่างข้อมูลเก่าระหว่างตรวจและใช้

ใช้ร่วมกับภาพเสมือนจริงและแผนผังเดิม 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 ข้อ เพื่อหาหัวข้อที่ควรทบทวน

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

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