本指南介绍如何在不同平台(STM32, Linux, Zephyr)中集成 RPL 库。
1. 获取 RPL
方法 A: CMake FetchContent (推荐)
在你的 CMakeLists.txt 中添加:
include(FetchContent)
FetchContent_Declare(
rpl
GIT_REPOSITORY https://github.com/RoboMaster-DLMU-CONE/rpl.git
GIT_TAG main
)
FetchContent_MakeAvailable(rpl)
target_link_libraries(your_target PRIVATE rpl::rpl)
方法 B: 子模块 (Submodule)
git submodule add https://github.com/RoboMaster-DLMU-CONE/rpl.git libs/rpl
然后在 CMake 中:
add_subdirectory(libs/rpl)
target_link_libraries(your_target PRIVATE rpl::rpl)
2. 嵌入式平台集成 (STM32/GD32)
在嵌入式平台上,推荐使用 零拷贝 (Zero-Copy) 模式配合 DMA 使用。
核心代码模式
#include "MyPackets.hpp"
void start_dma_receive() {
auto span = parser.get_write_buffer();
HAL_UART_Receive_DMA(&huart1, span.data(), span.size());
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
size_t received_len = ...;
parser.advance_write_index(received_len);
start_dma_receive();
}
}
void main() {
start_dma_receive();
while(1) {
auto pkt = deserializer.
get<PacketA>();
}
}
反序列化器类
定义 Deserializer.hpp:36
T get() noexcept
获取指定类型的数据包
定义 Deserializer.hpp:51
3. Linux 集成
在 Linux 上,通常处理串口 (/dev/ttyUSB0) 或 SocketCAN。
void read_thread() {
std::vector<uint8_t> temp_buf(1024);
while(running) {
int n = read(fd, temp_buf.data(), temp_buf.size());
if (n > 0) {
parser.push_data(temp_buf.data(), n);
}
}
}
你也可以使用我们开发的[HySerial]("https://github.com/RoboMaster-DLMU-CONE/HySerial")或者[HyCAN]("https://github.com/RoboMaster-DLMU-CONE/HyCAN")。请参考`samples`文件夹下的`real_comm`示例。
4. Zephyr RTOS 集成
RPL 提供了 west.yml,可以作为 Zephyr 模块导入。
- 在
west.yml 中添加项目: projects:
- name: rpl
repo-path: https://github.com/RoboMaster-DLMU-CONE/rpl
path: modules/lib/rpl
revision: main
- 更新 west:
- 在
prj.conf 中启用: CONFIG_CPP=y
CONFIG_STD_CPP20=y
- 在代码中使用:
你也可以直接在[one-framework]("https://github.com/RoboMaster-DLMU-CONE/one-framework")里直接使用RPL。