feat: 添加CM3/4/7的硬件与软件浮点单元构建矩阵,变更api接口为dr_*

This commit is contained in:
2026-07-26 23:34:11 +08:00
parent e8ee92110b
commit 7ba20659b2
16 changed files with 773 additions and 440 deletions
+71 -71
View File
@@ -2,14 +2,14 @@
## 1. 设计目标
轻量级 C 语言数据路由库。发送与接收能力分开声明,端口绑定 `send_type` 和外设 handler 列表。调用 `datarouter_send_<id>(data, len)` 时自动遍历端口表,广播到所有 `send_type` 匹配的端口。
轻量级 C 语言数据路由库。发送与接收能力分开声明,端口绑定 `send_type` 和外设 handler 列表。调用 `dr_send_<id>(data, len)` 时自动遍历端口表,广播到所有 `send_type` 匹配的端口。
### 核心设计
```
DATAROUTER_SEND_CAPABILITIES DATAROUTER_RECV_CAPABILITIES
DATAROUTER_SEND(sensor, ...) DATAROUTER_RECV(rtcm, ...)
DATAROUTER_SEND(status, ...) DATAROUTER_RECV(command, ...)
DR_SEND_CAPABILITIES DR_RECV_CAPABILITIES
DR_SEND(sensor, ...) DR_RECV(rtcm, ...)
DR_SEND(status, ...) DR_RECV(command, ...)
│ │
▼ ▼
send_sensor(data, len) on_recv_rtcm(port, data, len)
@@ -28,7 +28,7 @@ DATAROUTER_SEND_CAPABILITIES DATAROUTER_RECV_CAPABILITIES
| 原则 | 说明 |
|------|------|
| 收发分离 | 发送/接收能力在配置中分开声明,按需组合 |
| 编译期确定能力 | 所有能力在 `datarouter_config.h` 中声明,库自动生成代码 |
| 编译期确定能力 | 所有能力在 `dr_config.h` 中声明,库自动生成代码 |
| 运行期绑定外设 | 端口创建后,通过 `add_handler` 注册物理外设发送函数 |
| 自动广播 | `send_<id>(data, len)` 遍历所有端口,自动匹配 send_type |
| 不关心物理外设 | 库不依赖任何外设 API,只调用用户提供的 handler |
@@ -46,7 +46,7 @@ left to right direction
rectangle "用户代码" as User {
component "应用逻辑\n调 send_<id>(data, len)" as App
component "datarouter_config.h\n声明能力" as Cfg
component "dr_config.h\n声明能力" as Cfg
component "外设 handler\nUART / TCP / CAN" as Handlers
component "接收回调\non_recv_<id>()" as Callbacks
}
@@ -68,7 +68,7 @@ Callbacks --> Impl : 实现 on_recv_<id>
| 文件 | 职责 |
|------|------|
| `datarouter_config.h` | 声明 `SEND_CAPABILITIES` 和 `RECV_CAPABILITIES` |
| `dr_config.h` | 声明 `SEND_CAPABILITIES` 和 `RECV_CAPABILITIES` |
| `datarouter.h` | 公共 API + X-macro 展开 |
| `datarouter.c` | 端口表 + send 遍历 + 弱符号回调 |
| `example.c` | 使用示例 |
@@ -81,29 +81,29 @@ Callbacks --> Impl : 实现 on_recv_<id>
### 3.1 配置声明
```c
#define DATAROUTER_SEND_CAPABILITIES \
DATAROUTER_SEND(sensor, "Sensor data report") \
DATAROUTER_SEND(status, "Device status report")
#define DR_SEND_CAPABILITIES \
DR_SEND(sensor, "Sensor data report") \
DR_SEND(status, "Device status report")
#define DATAROUTER_RECV_CAPABILITIES \
DATAROUTER_RECV(rtcm, "RTCM correction data") \
DATAROUTER_RECV(command, "Remote control command")
#define DR_RECV_CAPABILITIES \
DR_RECV(rtcm, "RTCM correction data") \
DR_RECV(command, "Remote control command")
```
### 3.2 展开产物
```
DATAROUTER_SEND_CAPABILITIES 展开:
DR_SEND_CAPABILITIES 展开:
enum: sensor = 0, status = 1, SEND_CAP_COUNT = 2
发送函数: int datarouter_send_sensor(const void *data, size_t len);
int datarouter_send_status(const void *data, size_t len);
发送函数: int dr_send_sensor(const void *data, size_t len);
int dr_send_status(const void *data, size_t len);
元数据: send_names[] = {"sensor", "status"}
send_descs[] = {"Sensor data report", "Device status report"}
DATAROUTER_RECV_CAPABILITIES 展开:
DR_RECV_CAPABILITIES 展开:
enum: rtcm = 0, command = 1, RECV_CAP_COUNT = 2
接收回调: void datarouter_on_recv_rtcm(uint32_t port, const void*, size_t);
void datarouter_on_recv_command(uint32_t port, const void*, size_t);
接收回调: void dr_on_recv_rtcm(uint32_t port, const void*, size_t);
void dr_on_recv_command(uint32_t port, const void*, size_t);
弱符号默认: 空实现,用户覆盖
元数据: recv_names[] = {"rtcm", "command"}
recv_descs[] = {"RTCM correction data", "Remote control command"}
@@ -127,18 +127,18 @@ DATAROUTER_RECV_CAPABILITIES 展开:
@startuml
== datarouter.h ==
-> datarouter_config.h: 获得两组宏列表
-> dr_config.h: 获得两组宏列表
datarouter.h -> "1": #define DATAROUTER_SEND(id,desc) DATAROUTER_SEND_##id,
datarouter.h -> "1": #define DR_SEND(id,desc) DR_SEND_##id,
note right: 发送 enum
datarouter.h -> "2": #define DATAROUTER_RECV(id,desc) DATAROUTER_RECV_##id,
datarouter.h -> "2": #define DR_RECV(id,desc) DR_RECV_##id,
note right: 接收 enum
datarouter.h -> "3": #define DATAROUTER_SEND(id,desc) int send_##id(data, len);
datarouter.h -> "3": #define DR_SEND(id,desc) int send_##id(data, len);
note right: 发送函数声明
datarouter.h -> "4": #define DATAROUTER_RECV(id,desc) void on_recv_##id(...);
datarouter.h -> "4": #define DR_RECV(id,desc) void on_recv_##id(...);
note right: 接收回调声明
== datarouter.c ==
@@ -159,17 +159,17 @@ datarouter.c -> "7~8": send_names[] / send_descs[] / recv_names[] / recv_descs[]
@startuml
skinparam classAttributeIconSize 0
enum "datarouter_send_cap" as S { SENSOR, STATUS, SEND_CAP_COUNT }
enum "datarouter_recv_cap" as R { RTCM, COMMAND, RECV_CAP_COUNT }
enum "dr_send_cap" as S { SENSOR, STATUS, SEND_CAP_COUNT }
enum "dr_recv_cap" as R { RTCM, COMMAND, RECV_CAP_COUNT }
class "port_entry_t" as Entry {
- int send_type
- datarouter_send_handler_t handlers[]
- dr_send_handler_t handlers[]
- int count
- uint8_t in_use
}
class "datarouter_send_handler_t" as Handler {
class "dr_send_handler_t" as Handler {
+ void (*)(uint32_t port_id, const void *data, size_t len)
}
@@ -193,11 +193,11 @@ Recv --> Entry : 用户根据业务调对应回调
### 5.2 `port_entry_t`
```c
#define DATAROUTER_MAX_HANDLERS_PER_PORT 4
#define DR_MAX_HANDLERS_PER_PORT 4
typedef struct {
int send_type;
datarouter_send_handler_t handlers[DATAROUTER_MAX_HANDLERS_PER_PORT];
dr_send_handler_t handlers[DR_MAX_HANDLERS_PER_PORT];
int count;
uint8_t in_use;
} port_entry_t;
@@ -206,8 +206,8 @@ typedef struct {
### 5.3 端口表
```c
#define DATAROUTER_MAX_PORTS 64
static port_entry_t ports[DATAROUTER_MAX_PORTS];
#define DR_MAX_PORTS 64
static port_entry_t ports[DR_MAX_PORTS];
static uint8_t initialized;
```
@@ -218,30 +218,30 @@ static uint8_t initialized;
### 6.1 初始化
```c
void datarouter_init(void); // 幂等初始化
void datarouter_reset(void); // 重置全部状态
void dr_init(void); // 幂等初始化
void dr_reset(void); // 重置全部状态
```
### 6.2 端口管理
```c
datarouter_port_t datarouter_port_create(void);
void datarouter_port_delete(datarouter_port_t port);
dr_port_t dr_port_create(void);
void dr_port_delete(dr_port_t port);
void datarouter_port_set_send_type(port, int cap_id);
int datarouter_port_get_send_type(port);
void dr_port_set_send_type(port, int cap_id);
int dr_port_get_send_type(port);
int datarouter_port_add_handler(port, handler);
int datarouter_port_remove_handler(port, handler);
void datarouter_port_clear_handlers(port);
int datarouter_port_handler_count(port);
int dr_port_add_handler(port, handler);
int dr_port_remove_handler(port, handler);
void dr_port_clear_handlers(port);
int dr_port_handler_count(port);
```
### 6.3 发送触发函数(每个 SEND 能力生成一个)
```c
int datarouter_send_sensor(const void *data, size_t len);
int datarouter_send_status(const void *data, size_t len);
int dr_send_sensor(const void *data, size_t len);
int dr_send_status(const void *data, size_t len);
```
返回值:0 成功 / -1 未初始化 / -2 无端口匹配该 send_type
@@ -249,8 +249,8 @@ int datarouter_send_status(const void *data, size_t len);
### 6.4 接收回调(每个 RECV 能力生成一个声明)
```c
void datarouter_on_recv_rtcm(uint32_t port_id, const void *data, size_t len);
void datarouter_on_recv_command(uint32_t port_id, const void *data, size_t len);
void dr_on_recv_rtcm(uint32_t port_id, const void *data, size_t len);
void dr_on_recv_command(uint32_t port_id, const void *data, size_t len);
```
库提供弱符号默认空实现。
@@ -258,13 +258,13 @@ void datarouter_on_recv_command(uint32_t port_id, const void *data, size_t len);
### 6.5 能力元数据
```c
int datarouter_send_cap_count(void);
const char *datarouter_send_cap_name(int cap_id);
const char *datarouter_send_cap_desc(int cap_id);
int dr_send_cap_count(void);
const char *dr_send_cap_name(int cap_id);
const char *dr_send_cap_desc(int cap_id);
int datarouter_recv_cap_count(void);
const char *datarouter_recv_cap_name(int cap_id);
const char *datarouter_recv_cap_desc(int cap_id);
int dr_recv_cap_count(void);
const char *dr_recv_cap_name(int cap_id);
const char *dr_recv_cap_desc(int cap_id);
```
---
@@ -276,7 +276,7 @@ const char *datarouter_recv_cap_desc(int cap_id);
```plantuml
@startuml
actor "应用" as App
participant "datarouter_send_sensor()" as Send
participant "dr_send_sensor()" as Send
participant "端口表 ports[]" as Table
participant "handlers[]" as HList
participant "外设" as Dev
@@ -349,16 +349,16 @@ Idle --> Created : 复用 ID
### 场景 1:sensor 广播到 UART + TCP + CAN
```c
datarouter_port_t p1 = datarouter_port_create();
datarouter_port_set_send_type(p1, DATAROUTER_SEND_sensor);
datarouter_port_add_handler(p1, uart_send);
datarouter_port_add_handler(p1, tcp_send);
dr_port_t p1 = dr_port_create();
dr_port_set_send_type(p1, DR_SEND_sensor);
dr_port_add_handler(p1, uart_send);
dr_port_add_handler(p1, tcp_send);
datarouter_port_t p2 = datarouter_port_create();
datarouter_port_set_send_type(p2, DATAROUTER_SEND_sensor);
datarouter_port_add_handler(p2, can_send);
dr_port_t p2 = dr_port_create();
dr_port_set_send_type(p2, DR_SEND_sensor);
dr_port_add_handler(p2, can_send);
datarouter_send_sensor("temp:25.3", 9);
dr_send_sensor("temp:25.3", 9);
// → uart_send(p1, "temp:25.3", 9)
// → tcp_send(p1, "temp:25.3", 9)
// → can_send(p2, "temp:25.3", 9)
@@ -367,16 +367,16 @@ datarouter_send_sensor("temp:25.3", 9);
### 场景 2:仅接收
```c
void datarouter_on_recv_rtcm(uint32_t port_id, const void *data, size_t len) {
void dr_on_recv_rtcm(uint32_t port_id, const void *data, size_t len) {
apply_rtcm_correction(data, len);
}
// 外设收到后:datarouter_on_recv_rtcm(port, data, len);
// 外设收到后:dr_on_recv_rtcm(port, data, len);
```
### 场景 3:运行时移除 handler
```c
datarouter_port_remove_handler(p1, tcp_send);
dr_port_remove_handler(p1, tcp_send);
// 下次 send_sensor 不再触发 tcp
```
@@ -415,17 +415,17 @@ Weak ..> Result : 后备
## 11. 配置扩展
```c
#define DATAROUTER_SEND_CAPABILITIES \
DATAROUTER_SEND(sensor, "Sensor data") \
DATAROUTER_SEND(debug, "Debug log") /* 新增 */
#define DR_SEND_CAPABILITIES \
DR_SEND(sensor, "Sensor data") \
DR_SEND(debug, "Debug log") /* 新增 */
#define DATAROUTER_RECV_CAPABILITIES \
DATAROUTER_RECV(rtcm, "RTCM data") \
DATAROUTER_RECV(ota, "OTA firmware") /* 新增 */
#define DR_RECV_CAPABILITIES \
DR_RECV(rtcm, "RTCM data") \
DR_RECV(ota, "OTA firmware") /* 新增 */
```
```bash
cmake -DCMAKE_C_FLAGS="-DDATAROUTER_MAX_PORTS=128 -DDATAROUTER_MAX_HANDLERS_PER_PORT=8"
cmake -DCMAKE_C_FLAGS="-DDR_MAX_PORTS=128 -DDR_MAX_HANDLERS_PER_PORT=8"
```
---