|
SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (MTB & µPython)
|
บล็อกการ bring-up BLE ใน proj_cm33_ns/main.c ไม่ขึ้นกับ BENTO_HAS_MPY ส่วนตัวกันและ binding ฝั่ง MicroPython ที่แสดงไว้เป็นข้อความนั้นเป็น mtb-mpy เท่านั้น
ยก BLE NUS stack ขึ้นตามลำดับ 2 ชั้นที่เฟิร์มแวร์ใช้ เข้าใจว่าเหตุใด task ที่จ่ายไฟให้ชิปจึงต้องเป็นเจ้าของ ble_nus_init และได้เห็นกฎการใช้วิทยุเดียวปฏิเสธ WiFi จากฝั่ง Python — พร้อมกับ build เดียวที่ข้ามกฎนั้นไป
ชั้นที่ 1 — task ที่จ่ายไฟให้ชิป ยก WL_REG_ON ขึ้นหลังรอให้นิ่ง 1.5 s จากนั้นรออีก 50 ms ให้ตัวควบคุม HCI จ่ายไฟขึ้น แล้วจึงเรียก bento_buddy_request_start():
bento_buddy_request_start คืนค่า 0 = เพิ่งเริ่มทำงาน, 1 = ทำงานอยู่แล้ว, −1 = init ล้มเหลวหรือ mutex หมดเวลา (ble_nus_lazy.c:152-156) ฟังก์ชันนี้จับ mutex ด้วย timeout 1000 ms (:161) — เรียกได้จาก FreeRTOS task เท่านั้น ห้ามเรียกจาก main() หรือจาก ISR เจ้าของ ble_nus_init ตอนบูตต้องเป็น task เฉพาะตัวนี้ การเรียกจาก context อื่นล้มเหลวด้วย state=ERROR (main.c:326-334)
ชั้นที่ 2 — ตัวจัดคิววิทยุ init หลังจากที่จัดคิว auto-start แล้ว เพื่อไม่ให้ชิงกับ init ของ AIROC set_on_state เป็นการกำหนดค่าเปล่า ๆ และต้องมาก่อน init ซึ่งเป็นตัวจุดการเปลี่ยนสถานะครั้งแรก (radio_scheduler.c:319):
radio_scheduler_init เรียกได้ก่อน scheduler เริ่มทำงาน (ใช้ mutex และคิวแบบ static กับ xTaskCreate) คืนค่า true เมื่อสำเร็จหรือเมื่อ init ซ้ำ และคืน false เฉพาะเมื่อ xTaskCreate ล้มเหลว persist_boot_mode/load_boot_mode เป็น NULL ได้ (ค่าสำรองคือ RADIO_BOOT_AUTO) ตัวทำงานของมันหน่วง 3000 ms ก่อนเริ่มให้บริการคิว nus_radio_emit_state_event ใช้เป็นพอยน์เตอร์ฟังก์ชันเท่านั้น ห้ามเรียกโดยตรง
ตัวรับ IPC ฝั่ง CM33 ต้องพร้อมก่อนการแตะจาก CM55 ครั้งแรก บน mtb-mpy มีการลงทะเบียนตอนบูตที่ mpy_main.c:604-623 (ipc_bento_buddy_rx_init() ซึ่งพิมพ์ [MPY] bento_buddy IPC RX init: OK) และยังลงทะเบียนตัวเองแบบ lazy ภายใน bento_buddy_request_start ด้วย (ble_nus_lazy.c:183-186) — การลงทะเบียนซ้ำสองครั้งมีบันทึกไว้และยอมรับได้
การหยุดเป็นแบบนุ่ม bento_buddy_request_stop() (ble_nus_lazy.c:227-245) เป็น void และไม่มีสัญญาณบอก error ตัว AIROC stack ยังคงอยู่ในหน่วยความจำ การเริ่มครั้งต่อไปจึงใช้เส้นทาง ble_nus_rearm_advertising() (:176) แทนการ init ใหม่ binding ฝั่ง MicroPython อยู่ที่ modbentobuddy.c:29-44 (bento_buddy.start() โยน OSError เมื่อได้ −1 ส่วน stop() คืน None)
กฎวิทยุเดียว CYW55513 มีเส้นทาง RF เพียงเส้นเดียว ตัวกันฉบับหลักคือช่วง marker [ble_radio_scheduler_single_rf_guard] ที่ modwifi.c:54-81 (mtb-mpy) ยกมาที่นี่โดยตัดออกหนึ่งช่วงและกำกับไว้:
(modwifi.c:54-81 โดยตัดคอมเมนต์ช่วงที่ระบุออก แสดงเป็นข้อความเพราะไฟล์นั้นไม่ได้ส่งมาในแพ็กเกจ mtb-only สังเกต #include "../ble_nus/radio_scheduler.h" ที่ modwifi.c:70 ด้วย — โค้ดที่ลอกตัวกันนี้ไปใช้ต้องมีบรรทัดนั้น) radio_scheduler_get_mode() เป็นการอ่าน enum ตัวเดียวแบบไม่ใช้ lock เรียกได้จากทุก context และคืนค่า RADIO_MODE_UNKNOWN ก่อน init ข้อยกเว้น: ภายใต้ BENTO_HAS_DUAL_BAND == 1 ตัวกันนี้คอมไพล์ออกไป เพราะตัวจัดสรร COEX บนไดแบ่งเวลาให้ WiFi และ BLE
สิ่งที่ควรสังเกต หากไม่ได้ทำ getlibs build จะหยุดที่ $(error) ที่ยกมาข้างบน หากทำแล้วทั้ง 3 คอร์จะรายงานว่าเสร็จสมบูรณ์
แฟลช ตัดไฟแล้วจ่ายไฟใหม่ เปิดคอนโซลที่ 115200
สิ่งที่ควรสังเกต ตามลำดับนี้ และเป็นสตริงเหล่านี้พอดี:
บน mtb-mpy บรรทัด [MPY] bento_buddy IPC RX init: OK มาก่อนทั้ง 3 บรรทัดนี้ ส่วน glyph BLE บนแถบบนตามการวนถาม (polling) ble_nus_get_state() ทุก 500 ms (บท I2)
สิ่งที่ควรสังเกต OSError: WiFi unavailable: BLE is active. Use the Desktop Buddy or call bento_buddy.stop() to switch radio mode first. และไม่มีบรรทัด [wifi-glue] ปรากฏ — การปฏิเสธเกิดขึ้นก่อน app_wifi_init()
สิ่งที่ควรสังเกต ฝั่งเดสก์ท็อปได้รับ event bento.radio.state (บท I2 แสดงรูปร่างของมัน) ขณะที่ตัวจัดคิวเปลี่ยนสถานะ จากนั้น wifi.connect() ครั้งถัดไปจะทำงานต่อได้ และบรรทัดลองใหม่ [wifi-glue] จะปรากฏ (wifi_init.c:225-242) การเรียก bento_buddy.start() หลังจากนั้นจะไปเส้นทาง rearm และคืนค่า 1 หาก stack ยังคงอยู่ในหน่วยความจำ
| mtb-mpy | mtb-only | |
|---|---|---|
| บล็อกการ bring-up | main.c:325-357 เหมือนกัน | เหมือนกัน |
| การ start/stop จากโค้ดผู้ใช้ | bento_buddy.start()/stop() | task ที่เขียนเองเรียก bento_buddy_request_start()/stop() หรือปุ่มบนหน้า CM55 ผ่าน IPC |
| การปฏิเสธด้วยกฎวิทยุเดียว | OSError ฝั่ง Python | ไม่มีเส้นทางฝั่ง Python การเขียนทับ app_wifi_* ฝั่ง C ใน wifi_init.c ไม่มีตัวกันจากตัวจัดคิว — โค้ดที่เขียนเองต้องถาม radio_scheduler_get_mode() เอง |
| คอนโซล | บรรทัด RX-init ของ [MPY] กับบรรทัด [boot] | บรรทัด [boot] กับ [HB] |