|
SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (ModusToolbox)
|
archive (ไฟล์ไลบรารีแบบสแตติก .a) ที่คอมไพล์มาแล้วทุกตัวใต้ template/lib/<module>/ มี manifest ที่เครื่องสร้างขึ้น 2 ไฟล์วางอยู่ข้าง header ของตัวเอง ได้แก่ consumer_must_provide.txt — symbol ที่ archive เรียกกลับออกมา และผู้ใช้ไลบรารีต้องนิยามเอง — และ overridable.txt — symbol ชนิด WEAK ที่ผู้ใช้ไลบรารี อาจเขียนทับด้วย strong definition ได้ ทั้ง 2 รายการไม่ใช่ API ที่ไว้เรียกใช้ จำนวนบรรทัดที่ระบุด้านล่างอ่านจากไฟล์ที่ส่งมอบจริงเมื่อ 2026-08-28
consumer_must_provide.txt (182 symbol) มีสามตระกูลที่สำคัญ
overridable.txt: ว่างเปล่า ส่วนที่ export ออกมาแต่ไม่มีการประกาศ (bento_secure_undeclared.h): ผู้ใช้ไลบรารีต้องเขียน extern เองสำหรับ calculate_idle_percentage, disp_touch_i2c_controller_context, g_tesaiot_display_diag, rtos_cm55_gfx_task_handle, tesaiot_display_ready — เหมือนที่ผู้เรียกจริงทำ (proj_cm55/main.c:132-147, cm55_sensor_poll.c:42-54, lv_conf.h:1011-1017) หมายเหตุ: bento_secure_undeclared.h ที่ส่งมอบมาเก่าเกินจริงในส่วนของ g_tesaiot_display_diag และ rtos_cm55_gfx_task_handle เพราะ tesaiot_display.h ในไดเรกทอรีเดียวกันประกาศทั้ง 2 ตัวไว้แล้ว
consumer_must_provide.txt (58 symbol): RTOS และ ML runtime ที่ engine เรียกกลับออกมา ความสัมพันธ์ด้านกลับเป็นด้านที่ใช้ประโยชน์ได้ — cm55_core/consumer_must_provide.txt ระบุ symbol ai_* ไว้ 35 ตัว ซึ่งตรงกับชุดฟังก์ชัน API ของ edge_ai ที่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบพอดี ส่วนฟังก์ชัน API 2 ตัวที่ไม่อยู่ในรายการนั้น คือ ai_engine_dq_calls และ ai_engine_resume_sensor ไม่มีผู้เรียกที่ใดเลย ตัวอย่างของทั้งสองจึงเป็นตัวอย่างที่เขียนขึ้นเอง overridable.txt: ว่างเปล่า ส่วน printf/puts เป็น no-op stub ที่ export ออกมา (ภาคผนวก X #1)
overridable.txt มีชื่ออยู่เจ็ดชื่อพอดี และทุกชื่อเป็นสิ่งที่ผู้ใช้ไลบรารีต้อง เขียนขึ้นเอง ไม่ใช่สิ่งที่มีไว้เรียก
| Hook | การเขียนทับในเทมเพลต | ข้อกำหนดการเรียกใช้ |
|---|---|---|
| cm55_controls_snapshot | cm55_sensor_poll.c:342 | เติมข้อมูลบล็อก controls ให้ snapshot ของ sensorhub |
| game_sprite_create | game_sprite_engine.c:16 | รอยต่อของ sprite engine |
| game_sprite_set | game_sprite_engine.c:25 | รอยต่อของ sprite engine |
| game_sprite_lookup | game_sprite_registry.c:52 | รอยต่อของ registry ป้อนข้อมูลให้ ui_widget_mgr_set_sprite_image |
| ipc_ui_ext_dispatch | ipc_ui_ext_chain.c:41 | ทำงานใน GFX-task context และแตะจอแสดงผลได้ (ipc_ui.h:40-41) |
| ipc_ui_ext_clear_all | เป็น W ใน libbento_ipc.a | จุดเขียนทับของ ext chain |
| ipc_ui_platform_diag | strong definition อยู่ใน archive, tesaiot_display.c:593-609 | max_words >= 10 และคืนค่า 10 เปิดออกมาให้ใช้ในชื่อ ui._diag() |
consumer_must_provide.txt (302 symbol): LVGL, IPC pipe ของ PDL, FreeRTOS และรอยต่อของ page manager อันตรายจาก archive: PROVENANCE.txt ฝังค่า PAGE_ID_PLAYGROUND == 7 ไว้ตายตัว
overridable.txt: ว่างเปล่า — ไม่มีอะไรที่เป็น weak อยู่ใน archive consumer_must_provide.txt (71 symbol): อ็อบเจ็กต์ของ MQTT, ฟังก์ชันพื้นฐานของ OPTIGA (optiga_util_*, optiga_crypt_*), IPC ของการสัมผัส (touch), base64 และ optiga_util_callback ซึ่งผู้ใช้ไลบรารีเป็นผู้จัดหาให้ optiga_manager_init() นอกจากนั้น ฟังก์ชัน API 6 ตัวจากทั้งหมด 18 ตัว มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบใช้ในรูป weak symbol ภายใต้ ENABLE_OPTIGA_CLM=1 และต้องตรวจ NULL ที่พอยน์เตอร์ฟังก์ชันก่อนเรียก (ภาคผนวก X #19)
overridable.txt: app_wifi_connect_direct, app_wifi_disconnect, app_wifi_get_ipv4, lfs_load_wifi_creds, lfs_save_wifi_creds โดย strong definition ในเทมเพลตอยู่ที่ proj_cm33_ns/wifi_init.c บรรทัด :193, :248, :256, :261, :304 ตามลำดับ (การจับคู่นี้ตัดสินไว้ในการตรวจแบบ RED รอบที่ 1) การที่จำนวนจุด เรียก ในเทมเพลตเป็นศูนย์นั้นถูกต้องแล้ว — ให้เขียนขึ้นเองไม่ใช่ให้เรียก lfs_save_wifi_creds ไม่ได้จับ wifi_creds_lock (ภาคผนวก X #18) consumer_must_provide.txt (61 symbol): WCM/WHD, IPC pipe, FreeRTOS และฟังก์ชันช่วยเรื่องลายนิ้วมือ (fingerprint) ของ OPTIGA
หากชื่อหนึ่งอยู่ใน overridable.txt หน้าคู่มืออ้างอิงที่บอกว่า "ให้เรียกฟังก์ชันนี้" คือหน้าที่ผิด และหากชื่อหนึ่งอยู่ใน consumer_must_provide.txt archive จะเชื่อม (link) ไม่ผ่านจนกว่าผู้ใช้ไลบรารีจะนิยามชื่อนั้นเอง — ซึ่งเทมเพลตที่ส่งมอบมานิยามไว้ให้แล้ว นั่นคือเหตุผลที่รายการทั้งสองอ่านได้เหมือนแผนที่ของสิ่งที่ผู้ใช้ไลบรารีต้องรับผิดชอบเอง