erpc/erpc设计文档.md

39 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 协议设计
### 指令通讯
1. 指令发送方法:<br>
采用send-ack模式即主机发送指令后等待目标设备的ack确认确认后才认为指令发送成功。
2. notify-noreply模式<br>
接口:<br>
```c
u32 erpc_sand(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len)
```
描述:<br>
主机对目标设备发送一条指令,并不期待回复。其本质就是发送一次指令。
![](./picture/1.jpg)
3. notify-reply模式<br>
接口:<br>
```c
//主机:
u32 erpc_send_wait_reply(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len, u8 *reply_data, u16 *reply_len, u32 timeout);
//目标设备:
u32 erpc_replay(u8 hw, u8 dest_id, u16 port, u8 *data_out, u16 len);
```
描述:<br>
本质由2条指令组成。<br>
主机发送req指令从机直接回复。主机开始等待从机指令。<br>
从机处理完成后向主机发送rep指令并附带回复数据。<br>
主机收到rep指令后开始等待rep指令的ack确认。<br>
![](./picture/2.jpg)
4. 指令工作在单线程模式下:<br>
指令发送后等待ack确认直到确认后才认为指令发送成功。如果确认超时则认为指令发送失败。
可以在上述的接口中发现 cmd 并不定义为cmd而是用了port的称呼。port的取值范围为0~65535可以用来表示不同的指令。<br>
4. 多device通讯方法<br>
每个port工作是单线程的这就意味着如果有多个device需要同时发送指令则需要多线程或多进程。也就意味着需要定义不同的port号来区分不同的线程哪怕他是相同的指令。<br>
例如节点0x03中挂在了3个电机需要这3个电机同时运动此时理论上指令是相同的但是device不同的。通讯库没有做device id的区分。为此需要将port号划分为cmd + device id的形式。cmd相同的指令device id不同这样就可以实现多device通讯。<br>
u16(port) = u8(cmd) + u8(device_id);<br>
这样一个cmd号需要链接到多个port上。此时的cmd可叫做cmd组
![](./picture/3.jpg)