一、RPMsg-lite與端點機制回顧
在RPMsg協議框架中:
- Endpoint(端點) 是一個邏輯通信端口,由本地地址(local addr)、遠程地址(remote addr)和回調函數組成。
- 每個消息都會發送到特定的端點地址,端點負責接收并處理對應地址的消息。
- rpmsg-lite庫提供了輕量級API用于RTOS或裸機端實現,降低資源占用。
RPMsg端點創建的一般步驟為:
- 創建端點(提供本地地址、回調函數)。
- 向名字服務注冊端點名(可選)。
- 通知遠端核自動完成綁定。
二、rpmsg_lite_create_ept
的詳細實現
函數原型與含義:
struct rpmsg_lite_endpoint *rpmsg_lite_create_ept(struct rpmsg_lite_instance *rpmsg_dev, // rpmsg-lite 實例uint32_t addr, // 本地端點地址(可以填 RPMSG_ADDR_ANY 自動分配)rpmsg_ept_rx_cb_t rx_cb, // 消息接收回調函數void *rx_cb_data // 回調函數用戶數據(上下文)
);
執行流程與機制:
1. 創建端點結構體(endpoint):
- 在內部分配一個
struct rpmsg_lite_endpoint
,包含端點地址、本地回調函數、回調數據等:
struct rpmsg_lite_endpoint {struct rpmsg_lite_instance *rpmsg_dev;uint32_t addr; // 本地地址rpmsg_ept_rx_cb_t cb; // 回調函數void *cb_data; // 回調數據struct rpmsg_lite_endpoint *next;
};
2. 地址分配機制:
- 如果用戶指定地址為
RPMSG_ADDR_ANY (0xFFFFFFFF)
,RPMsg-lite會自動從地址池分配未占用的地址。 - 如果指定了明確地址,則直接使用該地址。
3. 回調函數的注冊:
- 接收到的消息會通過RPMsg-lite庫的中斷/virtqueue機制接收后,解析目標地址,將消息分發給對應端點,調用注冊的回調函數:
// 接收消息流程示意
rpmsg_rx_callback(endpoint, payload, payload_len, src_addr);
實例代碼示例:
// 創建端點示例
struct rpmsg_lite_endpoint *my_ept = rpmsg_lite_create_ept(rpmsg_instance, RPMSG_ADDR_ANY, // 自動地址分配my_endpoint_rx_cb, // 回調函數NULL // 回調上下文
);
三、rpmsg_ns_announce
實現詳解(名字服務機制)
RPMsg名字服務用于遠端核自動發現端點并建立端到端通信通道。
函數原型與含義:
int32_t rpmsg_ns_announce(struct rpmsg_lite_instance *rpmsg_lite_dev, struct rpmsg_lite_endpoint *new_ept, const char *ept_name, uint32_t flags
);
rpmsg_lite_dev
:RPMsg實例句柄。new_ept
:需要注冊的端點句柄。ept_name
:端點名稱,遠端用此名稱發現服務。flags
:標志位,目前通常為0。
內部實現流程:
rpmsg_ns_announce
本質是向一個特殊端點(地址為RPMSG_NS_ADDR=53
)發送一個特殊消息,這個消息稱為名字服務公告消息(announce)。
消息結構定義為(偽代碼):
struct rpmsg_ns_msg {char name[32]; // 端點名uint32_t addr; // 端點地址uint32_t flags; // 屬性標記
};
發送方式:
- 將
name
、addr
、flags
組成payload,發送到特殊端點(地址53)。 - 遠端的RPMsg名字服務(Linux端的rpmsg_core、rpmsg_ctrl)會監聽地址53的消息,收到此消息后自動執行相應端點綁定和設備節點創建操作。
示例:
// 發送名字服務公告消息
rpmsg_ns_announce(rpmsg_instance, my_ept, "rpmsg-channel-1", 0);
四、協議交互過程詳細示意圖解
RTOS/裸機端(M4)與Linux端(A53)交互過程如下:
M4端 共享內存(VRing) Linux端| | |
rpmsg_lite_create_ept(...) | |+--創建端點,自動分配地址 | || | |
rpmsg_ns_announce(...) | |+---向RPMSG_NS_ADDR發送端點公告--------->| || |--------VRing傳輸名字服務消息----------->|| | || | Linux RPMsg Core| | || |<-----接收到名字服務公告(端點名+地址)--+| | || |----自動創建/dev/rpmsgX設備文件(rpmsg_char)| | || | || | ||<---遠端核打開/dev/rpmsgX,并綁定到端點地址------| | | ||<-------遠端通過/dev/rpmsgX發送消息到地址(端點)|| | |
my_endpoint_rx_cb(...) | |+----回調被調用,處理接收到的消息 | |
五、關鍵注意事項與高級技巧:
-
自動綁定機制
名字服務公告消息本質是一種特殊的RPMsg消息,因此遠端核必須啟動RPMsg Core服務才能接收公告消息,實現自動綁定。 -
多端點支持
使用RPMsg-lite時可創建多個端點,每個端點可以獨立注冊名字服務,Linux端會對應創建多個/dev/rpmsgX
設備節點。 -
資源表配置
resource_table中的VDEV資源定義了vring共享內存和VirtIO隊列配置,必須與RPMsg-lite實例初始化參數保持一致。
六、小結與應用場景推薦
- rpmsg_lite_create_ept負責本地端點的地址申請與回調注冊。
- rpmsg_ns_announce通過特殊消息完成遠程核端點發現與自動設備綁定。
典型應用場景包括:
- Linux核調用RTOS側傳感器數據采集。
- M4核主動向Linux核推送實時數據。
- 多核系統啟動時自動建立通訊鏈路。