|
SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (ModusToolbox)
|
แถวข้อมูลวินิจฉัย (diagnostics) บนหน้าจอมีเหมือนกันทั้งสอง variant ส่วน edge_ai.diag() และ ui._diag() เป็นการเรียกบน REPL ของ MicroPython จึงมีเฉพาะบน mtb-mpy เท่านั้น สิ่งที่เทียบเท่ากันบน mtb-only คือแถวบนหน้าจอ บวกกับการเรียก ipc_ui_platform_diag() จากฝั่ง C
อ่านพื้นผิวข้อมูลวินิจฉัยทั้งสามแหล่ง — เวิร์ดสัญญาณชีพ (heartbeat) ที่อัดรวมค่าไว้ แถวสถิติบนหน้าจอ และดิกชันนารีจาก edge_ai.diag() — แล้วใช้เงื่อนไขผ่านข้อเดียวที่สำคัญจริง: npu_cycles ต้องเดินหน้าไปเรื่อย ๆ ขณะที่ stale_drops ต้องนิ่งอยู่กับที่ และจะทราบด้วยว่าเหตุใด printf ในโค้ด CM55 จึงไม่พิมพ์อะไรออกมาโดยค่าตั้งต้น และจะเปลี่ยนได้อย่างไร
ระนาบเหตุการณ์ — สัญญาณชีพที่อัดรวมค่า ภายใน set ไม่มีการส่งเหตุการณ์เจตนา (intent) รายโมเดล เพราะไบต์เจตนาจะรายงานได้แค่ set ไม่ใช่สมาชิกที่ตรวจจับได้ (ให้อ่านสมาชิกด้วย ai_engine_snapshot_model()) สัญญาณชีพที่ส่งทุก 1 s ขณะที่โมเดลทำงานจึงพาตัวนับที่อัดรวมค่าไว้ในค่า 32 บิตค่าเดียว:
| บิต | ค่า | ความหมาย |
|---|---|---|
| [31:28] | ai_engine_init_calls() & 0xF | 0 = task ไม่เคยไปถึง init() ของโมเดล |
| [27:20] | ai_engine_last_init_rc() & 0xFF | 0 = ปกติ; ค่าอื่นคือรหัสความล้มเหลวของโมเดล |
| [19:16] | ai_engine_feeds() & 0xF | nibble ล่างของตัวนับข้อมูลที่ป้อนเข้าโมเดล |
| [15:12] | ai_engine_inits() & 0xF | จำนวนการโหลดแบบเย็นที่สำเร็จ |
| [11:0] | ai_engine_dq_ok() & 0xFFF | จำนวนผลตัดสินที่เผยแพร่แล้ว |
การอ่าน nibble ของ feeds ข้ามสัญญาณชีพที่ต่อเนื่องกัน: เป็น 0 ทุกครั้ง = ไม่มีตัวอย่าง IMU ใหม่มาถึงโมเดลเลย (การส่งข้อมูลเซนเซอร์จาก CM33 ไม่เดินหน้า); ไม่เป็น 0 แต่ค้าง = การส่งข้อมูลหยุดไปกลางทาง; เปลี่ยนไปเรื่อย ๆ และ dq_ok ไต่ขึ้น = การป้อนข้อมูลและการอนุมานปกติ หาก result() ยังเป็น None แสดงว่าจุดที่ขาดอยู่ที่เส้นทางอ่านผลลัพธ์; เปลี่ยนไปเรื่อย ๆ แต่ dq_ok == 0 = ตัวอย่างมาถึงแต่ไม่มีผลตัดสิน ซึ่งมีได้สองสาเหตุ คือ window ของโมเดลไม่เคยเต็ม (โมเดล อัตรา หรือรูปทรงข้อมูลไม่ตรง) หรือการอนุมานทุกครั้งเกินขอบเขตเวลารอของ Ethos-U จนผลถูกกันไว้ ให้อ่าน stale_drops เพื่อแยกสองกรณีนี้
ระนาบดึงข้อมูล — MODEL_LINK_Q_DIAG ตอบได้แม้ในขณะที่การอนุมานค้างอยู่ และถูกนำออกมาเป็น edge_ai.diag() คีย์ของมันตรงกับ getter ในคู่มือฟิลด์ด้านล่าง
ระนาบหน้าจอ — แถวสถิติ หน้า Edge AI เรนเดอร์ push/s feed/s flush/s … init N/M rc R stale S อัตราการป้อนข้อมูลเป็นผลต่างที่วัดในช่วงอย่างน้อยหนึ่งวินาที:
| ฟิลด์ | Getter | อ่านอย่างไร |
|---|---|---|
| npu_cycles | ai_engine_npu_cycles() | เป็น u64 ที่แยกส่งเป็นครึ่งบน/ครึ่งล่างบนสาย การที่ค่าเดินหน้า = NPU กำลังถูกใช้งาน แต่ ไม่ใช่ หลักฐานว่าการอนุมานทำจนจบ |
| stale_drops | ai_engine_stale_drops() | ต้องนิ่งอยู่กับที่ขณะที่ npu_cycles เดินหน้า นี่คือเงื่อนไขผ่าน ส่วน ml_state เพียงตัวเดียวเชื่อถือไม่ได้ |
| feeds | ai_engine_feeds() | มีเพียงฟิลด์ "feed" ในข้อมูลวินิจฉัยเท่านั้นที่รายงานปริมาณข้อมูลที่โมเดลรับเข้าไป ให้อนุมานเป็น Hz จากช่วง ≥1 s |
| dq_ok / dq_calls | ai_engine_dq_ok() / ai_engine_dq_calls() | dq_ok ค้างอยู่ขณะที่ dq_calls ไต่ขึ้น = NPU ค้าง ส่วน dq_calls ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ — มีการจับคู่ในตัวอย่างที่เขียนขึ้นเองด้านล่าง |
| init_calls / init_returns | ai_engine_init_calls() / ai_engine_init_returns() | ให้อ่านคู่กัน ค่า "2/1" = เข้าสู่ init แล้วไม่เคยออกมา |
| last_init_rc | ai_engine_last_init_rc() | 0x7FFFFFFF = ไม่เคยถูกเรียก; 0 = ปกติ |
| inits | ai_engine_inits() | เป็น nibble ที่อัดรวมอยู่ในเวิร์ดของสัญญาณชีพ |
| stack_words / stack_free_words | ai_engine_stack_words() / ai_engine_stack_free_words() | 0 เวิร์ด = เครื่องยนต์ไม่เคยเริ่มทำงาน ส่วน stack_free_words เป็นการสแกนแบบ O(stack) ให้เรียกราว 1 Hz และห้ามเรียกทุกเฟรม |
การจับคู่ dq_calls ในตัวอย่างที่เขียนขึ้นเอง:
เลือกโมเดลใดก็ได้บนหน้า Edge AI แล้วรอจนขึ้น Running
สิ่งที่ควรสังเกต แถวสถิติอัปเดตประมาณวินาทีละครั้ง ค่า feed/s ไม่เป็นศูนย์ คู่ init N/M มี N == M ค่า rc 0 และ stale คงค่าเดิมไว้ขณะที่โมเดลกำลังทำงาน
สิ่งที่ควรสังเกต ได้ (True, True) ส่วนผลลัพธ์แบบอื่นใดคือการค้าง หรือการป้อนข้อมูลที่ขาดแคลน ให้ดูคู่มือฟิลด์ประกอบ
mtb-mpy:
สิ่งที่ควรสังเกต เวิร์ด 10 ตัวที่ ipc_ui_platform_diag() คืนมา: สถานะ IRQ ของ DC, ตัวนับการ flush (flush_start_count ที่เพิ่มขึ้น = เฟรมกำลังไหลอยู่), stack HWM ของ GFX และร้อยละของเวลาว่าง ส่วน ui._diag() อยู่ที่ modui.c:1470
mtb-only: ไม่มี REPL ให้เรียก ipc_ui_platform_diag(out, max_words) จากโค้ด CM55 ที่เขียนเอง โดยต้องมี max_words >= 10 และฟังก์ชันคืนค่ามา 10 เวิร์ด ตัวเข้าถึงตัวนั้น — ไม่ใช่ struct g_tesaiot_display_diag — คือเส้นทางที่รองรับ
สิ่งที่ควรสังเกต บน mtb-mpy คอนโซลแสดง [MPY] ตอนบูต และไม่มีอะไรต่อการอนุมานแต่ละครั้ง ส่วนบน mtb-only แสดง [HB] t=lus tasks=u ทุก 10 s และไม่มีอย่างอื่น ห้ามรอบรรทัดของ Edge AI เพราะไม่มีอยู่จริง CM55 ไม่ได้เป็นเจ้าของ UART (proj_cm55/main.c:9-10)
| mtb-mpy | mtb-only | |
|---|---|---|
| ข้อมูลวินิจฉัยของเครื่องยนต์ | edge_ai.diag() บวกแถวบนหน้าจอ | แถวบนหน้าจอ และ getter ฝั่ง C จากโค้ด CM55 ที่เขียนเอง |
| ข้อมูลวินิจฉัยของ GFX | ui._diag() | เรียก ipc_ui_platform_diag() จากฝั่ง C |
| คอนโซล | มีเพียง [MPY] | มีเพียง [HB] |