SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (ModusToolbox)
Loading...
Searching...
No Matches
ตัวนับสำหรับวินิจฉัย

Functions

uint32_t ai_engine_feeds (void)
 จำนวนตัวอย่างที่โมเดลรับเข้าไป; ให้อ่านเป็นผลต่างในช่วงอย่างน้อย 1 s
uint32_t ai_engine_dq_ok (void)
 จำนวนการดึงคิวที่สำเร็จ; ค้างนิ่งขณะที่ dq_calls ไต่ขึ้น = NPU หยุดนิ่ง
uint32_t ai_engine_dq_calls (void)
 จำนวนครั้งที่พยายามดึงคิว; ให้จับคู่กับ ai_engine_dq_ok() เพื่อตรวจการหยุดนิ่ง
uint32_t ai_engine_inits (void)
 จำนวนการเริ่มต้นโมเดลที่สำเร็จ; เป็น nibble ที่อัดไว้ในเวิร์ดของสัญญาณชีพ
uint32_t ai_engine_init_calls (void)
 จำนวนครั้งที่เข้าไปเรียก init() ของโมเดล; ให้อ่านคู่กับ ai_engine_init_returns()
uint32_t ai_engine_init_returns (void)
 จำนวนครั้งที่ init() ของโมเดล RETURNED ออกมา; ให้อ่านเป็นคู่เสมอ
int32_t ai_engine_last_init_rc (void)
 รหัสที่คืนจาก init() ของโมเดลครั้งล่าสุด: 0x7FFFFFFF = ไม่เคยถูกเรียก; 0 = ปกติ
uint32_t ai_engine_stale_drops (void)
 ผลตัดสินที่ถูกทิ้งเพราะเลยขอบเวลารอของ Ethos-U; ต้องนิ่งอยู่กับที่ขณะที่ npu_cycles เดินหน้า
uint64_t ai_engine_npu_cycles (void)
 จำนวน cycle ของ NPU ที่สะสมมาถึงตอนนี้; ไม่ใช่หลักฐานว่ามีการอนุมานใดเสร็จสิ้น

Detailed Description

การอ่านตัวนับธรรมดา 9 ตัว ทุกตัวสะสมค่าตลอดรอบการบูตเว้นแต่จะระบุไว้เป็นอย่างอื่น; ผลต่างในช่วงเวลาหนึ่งคือสัญญาณที่ต้องดู ไม่ใช่ยอดรวม ทุกตัวไม่มีความหมายตราบใดที่ ai_engine_stack_words() ยังเป็น 0 เมื่ออยู่บนคอร์เดียวกัน ตัวนับเหล่านี้ป้อนบรรทัดสถิติที่ออกวินาทีละครั้งของหน้านี้ (page_edge_ai.c:1455-1479: push/s feed/s flush/s … init N/M rc R stale S); เมื่ออยู่นอกคอร์ ตัวนับเหล่านี้เดินทางไปกับเวิร์ดของสัญญาณชีพ (nibble ที่อัดไว้, deepcraft_task.c:913-919, ตารางตัดสินใจ :886-912) และไปกับการดึงค่า Q_DIAG ที่กลายเป็น edge_ai.diag() เงื่อนไขผ่านของ engine ที่แข็งแรงตามที่ระบุไว้ (modedgeai.c:432-437): ai_engine_npu_cycles() ต้องเดินหน้า ขณะที่ ai_engine_stale_drops() นิ่งอยู่กับที่ — ml_state เพียงอย่างเดียวเชื่อถือไม่ได้ มีเพียงฟิลด์ "feed" ใน diag เท่านั้นที่รายงานปริมาณที่โมเดลรับเข้าไป

variant ที่ใช้ได้
mtb-mpy และ mtb-only

Function Documentation

◆ ai_engine_feeds()

uint32_t ai_engine_feeds ( void )

จำนวนตัวอย่างที่โมเดลรับเข้าไป; ให้อ่านเป็นผลต่างในช่วงอย่างน้อย 1 s

Samples accepted by the model, and successful model initialisations. Shown on the page while no verdict exists yet, so a stall is legible.

ข้อกำหนดการเรียกใช้
จำนวนตัวอย่างที่โมเดลรับเข้าไป ให้อ่านเป็นผลต่างในช่วงอย่างน้อย 1 s เพื่อคำนวณอัตราการป้อนข้อมูลเป็น Hz; nibble ที่อัดไว้ในสัญญาณชีพ (heartbeat) พาไปเฉพาะ 4 บิตล่างของค่านี้เท่านั้น อัตราการป้อนข้อมูลเป็น 0 ขณะที่มีโมเดลทำงานอยู่ หมายความว่าปัญหาอยู่ที่สายท่อของเซนเซอร์ ไม่ใช่ NPU
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ที่มา
ยกมาจาก page_edge_ai.c:1320-1327 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)

◆ ai_engine_dq_ok()

uint32_t ai_engine_dq_ok ( void )

จำนวนการดึงคิวที่สำเร็จ; ค้างนิ่งขณะที่ dq_calls ไต่ขึ้น = NPU หยุดนิ่ง

ข้อกำหนดการเรียกใช้
จำนวนการดึงคิวที่สำเร็จ (ได้ผลตัดสินออกมา) ค้างนิ่งขณะที่ ai_engine_dq_calls() ไต่ขึ้น = NPU หยุดนิ่ง — เป็นลายเซ็นของการหยุดนิ่งที่ header ระบุไว้เอง 12 บิตล่างเดินทางไปกับเวิร์ดของสัญญาณชีพ
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ที่มา
ยกมาจาก deepcraft_task.c:913-917 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)

◆ ai_engine_dq_calls()

uint32_t ai_engine_dq_calls ( void )

จำนวนครั้งที่พยายามดึงคิว; ให้จับคู่กับ ai_engine_dq_ok() เพื่อตรวจการหยุดนิ่ง

ข้อกำหนดการเรียกใช้
จำนวนครั้งที่พยายามดึงคิว ไม่มีผู้เรียกอยู่ที่ใดเลยในเฟิร์มแวร์ที่ส่งมอบจริง (ไม่ปรากฏใน consumer_must_provide.txt; sim_ai_engine_stub.c:111 เป็นการนิยาม stub ไม่ใช่การเรียก) ให้จับคู่ค่านี้กับ ai_engine_dq_ok() ในเรื่องการตรวจจับการหยุดนิ่ง: calls ที่ไต่ขึ้นขณะที่ ok ค้างนิ่งตลอดช่วง >= 1 s คือ NPU ที่หยุดนิ่ง; หากค้างนิ่งทั้งคู่แปลว่า engine ไม่ได้ทำงานอยู่ — ให้ตรวจ ai_engine_stack_words() ก่อน เรียกได้จาก CM55 task ใด ๆ ที่ประมาณ 1 Hz
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ตัวอย่าง (เขียนขึ้นเอง — ไม่มี call site ในของที่ส่งมอบจริง)
static void bento_ex_ai_engine_dq_calls(void)
{
static uint32_t last_calls, last_ok;
if (ai_engine_stack_words() == 0u) {
return; /* engine never started — no data */
}
/* Call this block at >= 1 s intervals (e.g. the same 1 Hz slot as
* the watchdog); the deltas are the signal, not the totals. */
uint32_t calls = ai_engine_dq_calls();
uint32_t ok = ai_engine_dq_ok();
uint32_t d_calls = calls - last_calls;
uint32_t d_ok = ok - last_ok;
last_calls = calls;
last_ok = ok;
if (d_calls > 0u && d_ok == 0u) {
/* NPU stall signature: dequeues attempted, none succeeded over
* the whole interval. Surface it — do not silently keep polling.
* (ml_state alone is untrustworthy for this; the counters are
* the evidence.) */
}
}

◆ ai_engine_inits()

uint32_t ai_engine_inits ( void )

จำนวนการเริ่มต้นโมเดลที่สำเร็จ; เป็น nibble ที่อัดไว้ในเวิร์ดของสัญญาณชีพ

ข้อกำหนดการเรียกใช้
จำนวนการเริ่มต้นโมเดลที่สำเร็จ ค่านี้ถูกพาไปเป็น nibble ที่อัดไว้ในเวิร์ดของสัญญาณชีพ; กฎการอ่านคือตารางตัดสินใจที่ deepcraft_task.c:886-912
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ที่มา
ยกมาจาก deepcraft_task.c:916 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)

◆ ai_engine_init_calls()

uint32_t ai_engine_init_calls ( void )

จำนวนครั้งที่เข้าไปเรียก init() ของโมเดล; ให้อ่านคู่กับ ai_engine_init_returns()

MODEL_INIT_RECOVERY diagnostics. init_calls == 0 means the inference task never reached the cold-load (task absent, or no select/start landed); init_calls > 0 with last_init_rc != 0 means the model's own init() failed with that code; last_init_rc == 0x7FFFFFFF means init() was never called.

ข้อกำหนดการเรียกใช้
จำนวนครั้งที่เข้าไปเรียก init() ของโมเดล ให้อ่านคู่กับ ai_engine_init_returns(): ค่า "2/1" หมายความว่า inference task เข้าไปใน init หนึ่งครั้งแล้วไม่เคยออกมา ค่า 0 หมายความว่า task ไม่เคยไปถึงขั้น cold-load (ไม่มี task อยู่ หรือไม่มี select/start ใดมาถึง)
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ที่มา
ยกมาจาก page_edge_ai.c:1469 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)

◆ ai_engine_init_returns()

uint32_t ai_engine_init_returns ( void )

จำนวนครั้งที่ init() ของโมเดล RETURNED ออกมา; ให้อ่านเป็นคู่เสมอ

How many model init() calls RETURNED. Less than ai_engine_init_calls() means the inference task went into one and did not come out.

ข้อกำหนดการเรียกใช้
จำนวนครั้งที่ init() ของโมเดล RETURNED ออกมา ค่าที่น้อยกว่า ai_engine_init_calls() หมายความว่า inference task เข้าไปในการเรียกหนึ่งแล้วไม่ได้ออกมา เช่นเดียวกัน — ให้อ่านเป็นคู่เสมอ
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ที่มา
ยกมาจาก page_edge_ai.c:1470 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)

◆ ai_engine_last_init_rc()

int32_t ai_engine_last_init_rc ( void )

รหัสที่คืนจาก init() ของโมเดลครั้งล่าสุด: 0x7FFFFFFF = ไม่เคยถูกเรียก; 0 = ปกติ

ข้อกำหนดการเรียกใช้
รหัสที่คืนจาก init() ของโมเดลครั้งล่าสุด: 0x7FFFFFFF = ไม่เคยถูกเรียก; 0 = ปกติ; ค่าอื่นใดคือรหัสความล้มเหลวของตัวโมเดลเอง และ ai_engine_requested() จะตกลงไปเป็น -1 ภายใน tick เดียวกัน
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ที่มา
ยกมาจาก deepcraft_task.c:376 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)

◆ ai_engine_stale_drops()

uint32_t ai_engine_stale_drops ( void )

ผลตัดสินที่ถูกทิ้งเพราะเลยขอบเวลารอของ Ethos-U; ต้องนิ่งอยู่กับที่ขณะที่ npu_cycles เดินหน้า

Verdicts discarded because their dequeue ran past the Ethos-U wait bound and so could only be carrying the previous frame's output tensor.

Read it as "how often a verdict was withheld", not as an NPU health meter. The measurement is wall clock, which cannot separate "the NPU did not answer" from "this task did not run": ai_task sits below the GFX task, and a long render frame or an XIP stall on the shared SMIF can push a perfectly good dequeue past the threshold. It also stops counting once a stall wedges the driver, because dequeue then fails outright and never reaches the check.

The signature of a stalling NPU remains ai_engine_dq_ok() frozen while ai_engine_dq_calls() climbs. Cumulative for the boot — deliberately not cleared on a model switch, unlike the pipeline counters.

ข้อกำหนดการเรียกใช้
ผลตัดสินที่ถูกทิ้งเพราะการดึงคิวของมันกินเวลาเลยขอบเวลารอของ Ethos-U ให้อ่านค่านี้ว่า "ผลตัดสินถูกระงับบ่อยแค่ไหน" ไม่ใช่มาตรวัดสุขภาพของ NPU — การวัดนี้ใช้เวลานาฬิกาจริง จึงแยกไม่ออกระหว่าง NPU ที่ไม่ตอบกับ ai_task ที่ถูกแย่งทรัพยากรจนอดอยาก (การเรนเดอร์ของ GFX หรือการหยุดค้างของ XIP บน SMIF ที่ใช้ร่วมกัน) ค่านี้ต้องนิ่งอยู่กับที่ขณะที่ ai_engine_npu_cycles() เดินหน้า — นั่นคือเงื่อนไขผ่าน และโดยเจตนาแล้วค่านี้จะไม่ถูกล้างเมื่อสลับโมเดล
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ที่มา
ยกมาจาก deepcraft_task.c:375 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)

◆ ai_engine_npu_cycles()

uint64_t ai_engine_npu_cycles ( void )

จำนวน cycle ของ NPU ที่สะสมมาถึงตอนนี้; ไม่ใช่หลักฐานว่ามีการอนุมานใดเสร็จสิ้น

NPU cycles accumulated so far. A coarse "is the NPU working" reading only — the middleware adds to it on the timeout path as well, so it does NOT prove any particular inference completed. Use ai_engine_stale_drops() for that.

ข้อกำหนดการเรียกใช้
จำนวน cycle ของ NPU ที่สะสมมาถึงตอนนี้ เป็นค่าอ่านหยาบ ๆ ว่า "NPU ทำงานอยู่หรือไม่" — middleware บวกค่านี้เพิ่มในเส้นทาง timeout ด้วย จึงไม่ใช่หลักฐานว่ามีการอนุมานใดเสร็จสิ้น; ให้ใช้ ai_engine_stale_drops() สำหรับเรื่องนั้น เป็น u64 ที่ถูกแยกเป็นครึ่งสูงกับครึ่งต่ำเมื่อส่งผ่านสาย IPC
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ที่มา
ยกมาจาก deepcraft_task.c:371 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)