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

Functions

int bento_buddy_request_start (void)
 นำ AIROC BLE host stack และการกระจายสัญญาณ (advertising) ของ NUS ขึ้นมาเมื่อมีการร้องขอ ใช้ได้เฉพาะใน task context เท่านั้น
void bento_buddy_request_stop (void)
 หยุดแบบ soft — ยุติการกระจายสัญญาณและตัด link แต่คง AIROC stack ไว้ในหน่วยความจำ ไม่มีสัญญาณแจ้งข้อผิดพลาด
void bento_buddy_auto_start_install (void)
 task auto-start แบบครั้งเดียวของเดิม ไม่มีผู้เรียกที่ใดเลย — ถูกแทนที่ด้วยรูปแบบ chip-power แล้ว
int ipc_bento_buddy_rx_init (void)
 เตรียมตัวรับ IPC ฝั่ง CM33_NS ให้พร้อมก่อนที่การแตะจาก CM55 ครั้งแรกจะมาถึง ยอมให้ลงทะเบียนซ้ำได้

Detailed Description

ห้า symbol: การนำ BLE ขึ้นเมื่อมีการร้องขอกับการหยุดแบบ soft ตัวช่วย auto-start ของเดิม และคู่สะพาน IPC ระหว่าง CM33 กับ CM55 คอมไพล์เฉพาะเมื่อ ENABLE_PAGE_BENTO_BUDDY=1 (ค่าตั้งต้นคือ 0, proj_cm33_ns/Makefile:64, :305) ให้ build ใหม่หลังจาก make getlibs — ดู Flag gate (อ่านก่อน)

การประกาศ: ble_nus_lazy.h (start/stop/auto_start_install) และ bento_secure_undeclared.h (ipc_bento_buddy_rx_init — prototype ที่กู้กลับมา) ส่วน ipc_bento_buddy_send ไม่มี header ที่ส่งมอบจริงตัวใดประกาศไว้ (บันทึกไว้ใน bento_secure_undeclared.h) รายการของมันด้านล่างจึงยกตัวนิยามจาก archive มาแสดง

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

ipc_bento_buddy_send

/* No shipped header declares this; archive definition, ipc_bento_buddy_bridge.c:45 */
int ipc_bento_buddy_send(uint8_t cmd, uint16_t value,
const uint8_t *data, size_t data_len);

ข้อกำหนดการเรียกใช้ เขียนลงใน ข้อความในหน่วยความจำร่วมแบบ static เพียงตัวเดียว (CY_SECTION(".cy_shared_socmem") static ipc_msg_t s_buddy_msg, ipc_bento_buddy_bridge.c:43) — จึง ไม่ reentrant ผู้เรียก 2 รายที่ทำงานพร้อมกันจะทำข้อมูลของกันและกันเสีย data_len ถูกบีบลงมาที่ IPC_DATA_MAX_LEN เงียบ ๆ (:55) ลูป retry มีขอบเขตจำกัด: vTaskDelay(pdMS_TO_TICKS(1)) 50 รอบ (:61-68) ฟังก์ชันนี้จึง อาจบล็อกได้นานถึง 50 ms และต้องเรียกจาก task ของ FreeRTOS ห้ามเรียกจาก ISR คืนค่า 0/-1 ผู้เรียกที่มีอยู่จริงในของที่ส่งมอบทุกรายแคสต์ทิ้งด้วย (void) ธรรมเนียมคือส่ง len + 1 เพื่อให้ผู้รับได้ NUL ไปด้วย และใส่จำนวนไบต์ที่ไม่นับ NUL ไว้ใน value เข้าถึงได้ผ่านมาโคร IPC_SEND ด้วย (nus_protocol.c:37, :49-50) — จุดที่ขยายจากมาโครไม่ถูกนับรวมในจำนวนผู้เรียก call site ในเทมเพลต: 0 (ใน archive: 10)

ที่มา
ยกมาจาก BENTO-TESAIoT-libraries/claw/common/ble_nus/nus_agent.c:189-204 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)
ที่มา
ยกมาจาก BENTO-TESAIoT-libraries/claw/common/ble_nus/ipc_bento_buddy_bridge.c:43-70 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)

Function Documentation

◆ bento_buddy_request_start()

int bento_buddy_request_start ( void )

นำ AIROC BLE host stack และการกระจายสัญญาณ (advertising) ของ NUS ขึ้นมาเมื่อมีการร้องขอ ใช้ได้เฉพาะใน task context เท่านั้น

ข้อกำหนดการเรียกใช้
นำ AIROC BLE host stack และการกระจายสัญญาณของ NUS ขึ้นมาเมื่อมีการร้องขอ ค่าที่คืน: 0 = เพิ่งเริ่มทำงาน, 1 = ทำงานอยู่แล้ว, -1 = init ล้มเหลวหรือ mutex หมดเวลา (ble_nus_lazy.c:152-156) ใช้ได้เฉพาะใน task context ของ FreeRTOS เท่านั้น — ห้ามเรียกจาก main() และห้ามเรียกจาก ISR: ฟังก์ชันนี้จับ mutex ด้วย timeout 1000 ms (ble_nus_lazy.c:161) WL_REG_ON ต้องถูก assert ไว้ก่อนแล้ว และระบบต้องผ่านช่วงตั้งตัวมาประมาณ 1.5 s (main.c:58, :62, :65) เจ้าของการเรียกในช่วงบูตต้องเป็น task จ่ายไฟชิปโดยเฉพาะ — การเรียก ble_nus_init จาก context อื่นใดจะล้มเหลวด้วย state=ERROR (main.c:326-334) เมื่อ stack อยู่ในสภาพหยุดแบบ soft ฟังก์ชันนี้จะไปทางเส้นทาง ble_nus_rearm_advertising() แทนการรัน init ซ้ำ (ble_nus_lazy.c:176) และยังลงทะเบียนตัวรับ IPC แบบ lazy ให้ด้วย (ipc_bento_buddy_rx_init(), ble_nus_lazy.c:183-186) call site ในเทมเพลต: 2
variant ที่ใช้ได้
mtb-mpy และ mtb-only
call site ในเทมเพลต — เส้นทางบูต
(proj_cm33_ns/main.c:55-73 มีอยู่ในทั้งสอง zip):
static void chip_power_then_ble_task(void *arg)
{
(void)arg;
vTaskDelay(pdMS_TO_TICKS(1500));
printf("[boot] Asserting WL_REG_ON (P%u.%u) for CYW55513...\r\n",
CYBSP_WIFI_WL_REG_ON_PORT_NUM, (unsigned)CYBSP_WIFI_WL_REG_ON_PIN);
Cy_GPIO_Write(CYBSP_WIFI_WL_REG_ON_PORT, CYBSP_WIFI_WL_REG_ON_PIN, 1U);
/* Murata 2FY datasheet: WL_REG_ON to module-ready ≈ 5 ms. Give 50 ms
* for the HCI controller firmware to finish its internal power-up. */
vTaskDelay(pdMS_TO_TICKS(50));
printf("[boot] WL_REG_ON asserted — bringing up BLE NUS stack\r\n");
extern int bento_buddy_request_start(void);
printf("[boot] bento_buddy_request_start rc=%d\r\n", rc);
vTaskDelete(NULL);
}
call site ในเทมเพลตแห่งที่สอง (มีเฉพาะใน zip ของ mtb-mpy ยกมาเป็นข้อความ)
bento_libs/claw/common/mpy/modbentobuddy.c:29-36 marker tag ble_bento_buddy_start_stop_mpy — ตัวเชื่อมฝั่ง MicroPython แปลง rc < 0 เป็น OSError(EIO) และคืนค่า rc (0 หรือ 1) ในกรณีอื่น ไม่ได้เรนเดอร์ไว้ที่นี่เพราะหัวข้อนี้เป็นส่วนหนึ่งของชุดเอกสาร mtb-only ด้วย ซึ่งไม่มีไฟล์นั้นอยู่

◆ bento_buddy_request_stop()

void bento_buddy_request_stop ( void )

หยุดแบบ soft — ยุติการกระจายสัญญาณและตัด link แต่คง AIROC stack ไว้ในหน่วยความจำ ไม่มีสัญญาณแจ้งข้อผิดพลาด

ข้อกำหนดการเรียกใช้
คืนค่า void — ไม่มีสัญญาณแจ้งข้อผิดพลาดใด ๆ เลย การที่ mutex หมดเวลาถูกกลืนไปเงียบ ๆ (ble_nus_lazy.c:231-234) เป็น idempotent (เรียกซ้ำแล้วผลเหมือนเดิม) และปลอดภัยเมื่อปิดอยู่แล้ว ต้องอยู่ใน task context (mutex) เป็นการหยุดแบบ soft: ble_nus_deinit() ยุติการกระจายสัญญาณและตัด link แต่ AIROC stack ยังอยู่ในหน่วยความจำและ s_init_done ยังเป็น 1 (ble_nus_lazy.c:227-245) การเรียก bento_buddy_request_start() ครั้งถัดไปจึงกลับมาเปิดการกระจายสัญญาณใหม่แทนการ init ซ้ำ call site ในเทมเพลต: 1
variant ที่ใช้ได้
mtb-mpy และ mtb-only
call site ในเทมเพลตแห่งเดียว (มีเฉพาะใน zip ของ mtb-mpy ยกมาเป็นข้อความ)
bento_libs/claw/common/mpy/modbentobuddy.c:39-44 marker tag ble_bento_buddy_start_stop_mpymp_bento_buddy_stop() เรียกฟังก์ชันนี้แล้วคืนค่า None ไม่มีอะไรให้ตรวจเพราะไม่มีค่าใดคืนกลับมา

◆ bento_buddy_auto_start_install()

void bento_buddy_auto_start_install ( void )

task auto-start แบบครั้งเดียวของเดิม ไม่มีผู้เรียกที่ใดเลย — ถูกแทนที่ด้วยรูปแบบ chip-power แล้ว

ข้อกำหนดการเรียกใช้
สร้าง task แบบครั้งเดียวที่นำ BLE ขึ้นมาประมาณ 3 s หลัง scheduler เริ่มทำงาน เรียกจาก main() ก่อน vTaskStartScheduler ได้ ไม่มีผู้เรียกที่ใดเลย เส้นทางบูตที่ส่งมอบจริงแทนที่ฟังก์ชันนี้ไปแล้วอย่างชัดเจน (proj_cm33_ns/main.c:344-347): "the legacy task skipped the WL_REG_ON / WCM init step, which CYW55513 needs for BLE controller bring-up" — ตัวช่วยนี้นำ host stack ขึ้นมาทั้งที่ controller ยังไม่ได้รับไฟ ให้ใช้ install_chip_power_then_ble() (รูปแบบที่แสดงไว้ใต้ bento_buddy_request_start()) แทน
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ตัวอย่าง (เขียนขึ้นเอง — ไม่มี call site ในของที่ส่งมอบจริง)
static void bento_ex_chip_power_then_ble_task(void *arg)
{
(void)arg;
vTaskDelay(pdMS_TO_TICKS(1500)); /* let the rest of boot settle */
/* Power the CYW55513 first — the step the legacy helper skipped. */
Cy_GPIO_Write(CYBSP_WIFI_WL_REG_ON_PORT, CYBSP_WIFI_WL_REG_ON_PIN, 1U);
/* WL_REG_ON to module-ready ≈ 5 ms; give the HCI controller firmware
* 50 ms to finish its internal power-up. */
vTaskDelay(pdMS_TO_TICKS(50));
int rc = bento_buddy_request_start(); /* 0 new, 1 running, -1 failed */
(void)rc;
vTaskDelete(NULL); /* one-shot */
}
static void bento_ex_bento_buddy_auto_start_install(void)
{
/* DO NOT: bento_buddy_auto_start_install();
* (superseded — no WL_REG_ON, controller never powered)
*
* DO — install the chip-power-then-BLE one-shot, pre-scheduler: */
static StackType_t task_stack[1536];
static StaticTask_t task_tcb;
(void)xTaskCreateStatic(bento_ex_chip_power_then_ble_task,
"bento_chip_pwr",
(uint16_t)(sizeof(task_stack) /
sizeof(task_stack[0])),
NULL, tskIDLE_PRIORITY + 1,
task_stack, &task_tcb);
}

◆ ipc_bento_buddy_rx_init()

int ipc_bento_buddy_rx_init ( void )
extern

เตรียมตัวรับ IPC ฝั่ง CM33_NS ให้พร้อมก่อนที่การแตะจาก CM55 ครั้งแรกจะมาถึง ยอมให้ลงทะเบียนซ้ำได้

ข้อกำหนดการเรียกใช้
ฝั่ง CM33_NS เป็น wrapper บาง ๆ ครอบ Cy_IPC_Pipe_RegisterCallback(CM33_IPC_PIPE_EP_ADDR, ..., CM33_IPC_BENTO_BUDDY_CLIENT_ID) คืนค่า 0/-1 (ipc_bento_buddy_bridge.c:166-173) ต้องรัน ก่อนที่การแตะจาก CM55 ครั้งแรกจะมาถึง และหลังจากที่ปลายทางของ IPC pipe มีอยู่แล้ว — ตัวรับทำหน้าที่แปลปุ่ม Start/Stop บน CM55 ให้เป็น bento_buddy_request_start() ตัวรับที่ยังไม่พร้อมจึงหมายความว่าการแตะนั้นไม่มีผู้ใดรับไว้ (คอมเมนต์เรื่องไก่กับไข่ mpy_main.c:572-576) ฟังก์ชันนี้ ยังลงทะเบียนตัวเองแบบ lazy อยู่ภายใน bento_buddy_request_start() ด้วย (ble_nus_lazy.c:183-186 มี static bool s_rx_registered เป็นตัวกัน) การลงทะเบียนซ้ำจากเส้นทางบูตจึงเป็นสิ่งที่บันทึกไว้แล้วและยอมรับได้ ผู้ใช้ไลบรารีประกาศ extern ไว้ในไฟล์ของตนเอง — ไม่มี header ที่ส่งมอบจริงตัวใดประกาศฟังก์ชันนี้นอกจาก bento_secure_undeclared.h call site ในเทมเพลต: 1
variant ที่ใช้ได้
mtb-mpy และ mtb-only
call site ในเทมเพลตแห่งเดียว (มีเฉพาะใน zip ของ mtb-mpy ยกมาเป็นข้อความ)
bento_libs/claw/common/mpy/mpy_main.c:564-583 marker tag ble_ipc_bento_buddy_rx_init_boot — ภายใต้ BENTO_HAS_BLE_NUS == 1 มี extern int ipc_bento_buddy_rx_init(void); ประกาศไว้ในไฟล์นั้นเอง ตามด้วยการเรียก และ printf("[MPY] bento_buddy IPC RX init: s\r\n", rc == 0 ? "OK" : "FAIL") คำนำหน้า [MPY] เป็นสิ่งที่สังเกตได้จริง (ไฟล์นี้ไม่ได้ถูกปิดเสียง printf)