SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (MTB & µPython)
Loading...
Searching...
No Matches
อันตรายตอน link ของ printf/puts

dist/edge_ai/api.txt แสดงรายการ symbol ที่ส่งออกไว้ 39 ตัว ในจำนวนนั้นมี 2 ตัว — printf และ puts — ที่ ไม่ใช่ API ไม่ใช่สัญญาณรบกวนจากการสกัดรายการ และห้ามเรียกใช้โดยตั้งใจเด็ดขาด ทั้ง 2 ตัวถูกบันทึกไว้ที่นี่เพราะการลิงก์ archive (ไฟล์ไลบรารีแบบสแตติก .a) ตัวนี้เข้าไปเปลี่ยนพฤติกรรมของโค้ดที่ผู้อ่านเขียนขึ้นเอง

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

printf

int printf(const char *fmt, ...); /* defined in the archive as a no-op */

ข้อกำหนดการเรียกใช้ — อันตราย (hazard) libbento_edge_ai.a นิยาม printf เป็น no-op stub โดยเจตนา (ai_engine.c:276-288: (void)fmt; return 0;) nm -S บน archive รายงาน T printf ขนาด 8 ไบต์ ใน bento_core_0.o — ซึ่งคือ stub ไม่ใช่ newlib ผลที่ตามมาสำหรับผู้ใช้ไลบรารีฝั่ง CM55 มีดังนี้:

  • printf ใด ๆ ในโค้ด CM55 ที่เขียนขึ้นเองจะไม่พิมพ์อะไรออกมาเลยอย่างเงียบ ๆ ทันทีที่ลิงก์ archive ตัวนี้เข้าไป ไม่มีคำเตือน ไม่มีผลลัพธ์ ไม่มีข้อผิดพลาด — การเรียกสำเร็จและคืนค่า 0
  • ลิงก์ stdio ของ newlib เข้ากับคอร์นี้ไม่ได้ CM55 ไม่มี retarget-io; UART เป็นของ CM33_NS (proj_cm55/main.c:9-10) newlib stdio บน CM55 จะไปจับ lock ที่ไม่ใช่ของตนแล้ว panic (ai_engine.c:270-275) ซึ่งเป็นเหตุผลตรง ๆ ที่ archive ดักจับ printf ที่หลุดออกมาจาก ML middleware ที่นำเข้ามาใช้และจาก TFLite-Micro ทุกตัว
  • สิ่งที่สังเกตได้บน CM55 จึงเป็นรหัส LED และหน้าจอ ซึ่งมีทั้งสอง variant บวกกับ ui._diag() บน mtb-mpy (หรือ ipc_ui_platform_diag() จาก C บน mtb-only) — ไม่ใช่คอนโซลอนุกรม (serial console) เลย

    dist/edge_ai/include/bento_secure_undeclared.h:10-11 บันทึก symbol ตัวนี้ไว้ว่า "exported, but no declaration found in the tree": ไม่มี header ที่ส่งมอบจริงตัวใดประกาศมันไว้ เพราะไม่มีสิ่งใดที่ตั้งใจจะเรียกมัน

puts

int puts(const char *s); /* defined in the archive as a no-op */

ข้อกำหนดการเรียกใช้ — อันตราย เหมือนกับ printf: เป็น no-op T puts ขนาด 4 ไบต์ (ai_engine.c:283-288) ที่กลืน puts ทุกตัวในอิมเมจของ CM55 รวมถึงตัวที่คอมไพเลอร์สังเคราะห์ขึ้นจาก printf("literal\n") ห้ามพึ่งพาสองตัวนี้เพื่อให้ CM55 แสดงผล; ให้ส่งข้อมูลวินิจฉัยผ่านเส้นทาง platform-diag ของ IPC แทน