按照4位大小端(即32位整数)进行转换

为了确保数据按照4位大小端(即32位整数)进行转换,我们需要在将数据写入文件之前,对每个32位整数进行大小端转换。具体来说,如果原始数据是以大端序(Big Endian)存储的,而目标系统是小端序(Little Endian),或者反之,则需要进行大小端转换。

以下是一个示例代码,展示了如何在将数据写入文件之前进行32位大小端转换:

  1. 文件打开:使用 "wb" 模式打开文件 img.bin
  2. 内存分配:使用 malloc 分配缓冲区,并检查是否分配成功。
  3. 数据获取:调用 get_data_from_fpga_ddr 函数从 FPGA DDR 获取数据。
  4. 大小端转换:对每个32位整数进行大小端转换。
  5. 数据写入:使用 fwrite 函数将转换后的数据写入文件。
  6. 错误处理:在每个关键步骤后检查是否成功,并在失败时释放资源并返回错误码。
  7. 资源释放:在完成文件操作后关闭文件并释放分配的内存。

以下是修正后的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

// 假设这是从 FPGA DDR 获取数据的函数声明
void get_data_from_fpga_ddr(void* ddr_addr, void* buffer, size_t size, void* xdma);

// 大小端转换函数
uint32_t swap_endian(uint32_t value) {
    return ((value & 0xFF000000) >> 24) |
           ((value & 0x00FF0000) >> 8)  |
           ((value & 0x0000FF00) << 8)  |
           ((value & 0x000000FF) << 24);
}

int main() {
    FILE *file = fopen("/home/NpuFtCoreAPP/img.bin", "wb"); // 使用小写的 "w" 并保存为 img.bin
    if (file == NULL) {
        printf("open file fail!\\n");
        return -1; // 返回一个错误码
    }

    long BUFFER_SIZE = 55000000; // 缓冲区大小
    char* buffer = (char*)malloc(BUFFER_SIZE);
    if (buffer == NULL) {
        printf("memory allocation failed!\\n");
        fclose(file);
        return -1; // 返回一个错误码
    }

    memset(buffer, 0, BUFFER_SIZE);

    // 假设 ddr_addr_W0 和 xdma_dma0 已经定义
    void* ddr_addr_W0 = NULL; // 替换为实际的地址
    void* xdma_dma0 = NULL;   // 替换为实际的 XDMA 句柄

    get_data_from_fpga_ddr(ddr_addr_W0, buffer, 48 * 1024 * 1024, xdma_dma0);

    // 打印前16个字节的数据进行调试
    printf("First 16 bytes of buffer before conversion: ");
    for (int i = 0; i < 16; i++) {
        printf("%02x ", buffer[i]);
    }
    printf("\\n");

    // 进行大小端转换
    uint32_t* int_buffer = (uint32_t*)buffer;
    size_t num_ints = 48 * 1024 * 1024 / sizeof(uint32_t);
    for (size_t i = 0; i < num_ints; i++) {
        int_buffer[i] = swap_endian(int_buffer[i]);
    }

    // 打印前16个字节的数据进行调试
    printf("First 16 bytes of buffer after conversion: ");
    for (int i = 0; i < 16; i++) {
        printf("%02x ", buffer[i]);
    }
    printf("\\n");

    // 直接将 buffer 中的数据写入文件
    size_t bytes_written = fwrite(buffer, 1, 48 * 1024 * 1024, file);
    if (bytes_written != 48 * 1024 * 1024) {
        printf("write to file failed!\\n");
        free(buffer);
        fclose(file);
        return -1; // 返回一个错误码
    }

    free(buffer);
    fclose(file);
    return 0;
}

关键点:

  1. 大小端转换函数swap_endian 函数用于将32位整数从大端序转换为小端序,或者反之。
  2. 数据转换:在将数据写入文件之前,对每个32位整数进行大小端转换。
  3. 调试信息:在转换前后打印前16个字节的数据,以便验证转换是否正确。

调试建议:

  1. 检查数据源:确保 get_data_from_fpga_ddr 函数正确地从 FPGA DDR 获取数据,并且数据是正确的。
  2. 打印数据:在 get_data_from_fpga_ddr 调用之后,打印部分数据以验证数据是否正确。
  3. 文件路径:确保文件路径 /home/NpuFtCoreAPP/img.bin 是正确的,并且程序有权限写入该路径。

通过这种方式,你可以确保数据在写入文件之前已经正确地进行了大小端转换。如果数据仍然不一致,问题可能出在 get_data_from_fpga_ddr 函数中,需要进一步检查该函数的实现。

posted @ 2025-03-17 10:33  Ryan9399  阅读(219)  评论(0)    收藏  举报