ZBLOG

char data[16][1024]; // 16 = 0x4000 / 1024, kDmaRecvSize / 帧长 int i = 0; int error = 0; for(i = 0; i < 16; i++){ // 逐帧校验 // 1. 分帧 int offset = i * 1024; data[i] = pdata + offset; // 2. 帧头校验 auto result = Indexof() }

你的代码片段看起来是想实现 分帧处理帧头校验,但存在一些问题(比如 data 的类型不匹配直接赋值为指针)。以下是优化后的零拷贝分帧方案,同时加入帧头校验逻辑:


修正后的代码(C++11)

constexpr size_t kFrames = 16;      // 总帧数
constexpr size_t kFrameSize = 1024; // 每帧大小

// 1. 定义指针数组(零拷贝关键)
const char* frames[kFrames];        // 每帧指向原始数据的起始地址

// 2. 分帧并校验
int error = 0;
for (size_t i = 0; i < kFrames; ++i) {
    size_t offset = i * kFrameSize;
    
    // --- 分帧:直接引用原数据地址 ---
    frames[i] = pdata + offset;     // pdata是原始数据指针
    
    // --- 帧头校验(假设帧头为0xAABB)---
    if (offset + sizeof(uint16_t) > len) {
        error = -1; // 超出数据范围
        break;
    }
    
    uint16_t header = *reinterpret_cast<const uint16_t*>(frames[i]);
    if (header != 0xAABB) {         // 示例:检查魔数
        error = -2; // 帧头无效
        break;
    }
}

关键改进点

  1. 零拷贝实现

    • frames数组存储的是const char*,直接指向原始数据(pdata)的分段地址,无内存复制
  2. 安全的类型转换

    • 使用reinterpret_cast读取帧头时,确保原始数据长度足够(通过offset + sizeof(uint16_t) <= len校验)。
  3. 错误处理

    • error=-1: 数据长度不足
    • error=-2: 帧头不符合预期
  4. 性能优化

    • frames连续内存布局,CPU缓存友好。

使用示例

// 假设原始数据(含0xAABB的帧头)
char pdata[16384]; 
init_dma_data(pdata, sizeof(pdata)); 

// 调用分帧校验
if (error == -1) {
    printf("Error: Data incomplete\n");
} else if (error == -2) {
    printf("Error: Invalid frame header\n");
} else {
    printf("All %zu frames validated!\n", kFrames);
}

扩展建议

  • 动态分帧:若帧数不固定,可改用std::vector<const char*>
  • 异步处理:结合DMA完成中断通知分帧。
  • 更复杂的协议解析:替换header !=0xAABB为协议解码函数。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8159

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?