c - 具有多个设备的板上的 Little 和 Big Endian 访问 - 嵌入式软件架构

标签 c embedded-linux endianness vxworks

我们有几 block 板,可以将它们视为主板。 这些主板包含来自微处理器、ASIC 和 FPGA 的不同设备...... 到目前为止,所有设备都是基于 16 位 Big endian 的。 目前的问题是我们使用的是基于 32 小端的新 ASIC,而主板上的所有其他设备都是大端。 我们已经创建了特定的 api 来读/写 32 位小端。 将来我们可能会拥有可以混合使用 16/32 大/小端字节序的设备的主板。这些相同的设备可用于不同的新旧主板。

我们使用嵌入式 C(在 Vxworks 中)作为语言,我们的软件被模块化以使用通用代码和主板特定代码。 使用#defines 和检查#ifdef 的解决方案已经出现,但我不完全确定如何使用它们。 我们不能真正在处理器类型上使用#ifdef,因为同一个处理器可以用在具有不同访问要求的不同主板上。

如果可能的话,我将非常感谢在示例 C 代码示例方面的架构和技术方面的帮助。

最佳答案

为您的设备编写 API。

API 将保证它将以微处理器的字节顺序从微处理器接收数据,并以微处理器的字节顺序将数据返回给微处理器。然后 API 执行 LE->BE 或任何转换。

例如,至少,您有 asic_read32fpga_read16。您的 asic_read32() 函数将如下所示:

/* asic is little endian */
asic_read32(...)
    if microprocessor is big endian  /* do this at compile time with #if */
        le_data = read32_le(...)
        return to_big_endian(le_data)
    else
        return read32_le(...)

并且您的微处理器应用程序愉快地忽略了任何正在发生的事情:

uin32_t num_bytes_frobbed = asic_read32(BYTES_FROBBED_REG);
printf("Frobbed %u bytes so far.\n", num_bytes_frobbed);

作为奖励,对您设备的所有访问都将通过一个 API,因此您可以在必要时锁定以确保设备访问多线程安全。

如果您对它感到满意并且合适,您可以抽象出设备本身并实现更高级别的功能,例如 get_frobbing_statistics(struct frobbing_stats *stats)

关于c - 具有多个设备的板上的 Little 和 Big Endian 访问 - 嵌入式软件架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20055120/

相关文章:

c - 我的图像解码程序出了什么问题?

c++ - 如何在嵌入式设备上的 Qt/X11 中渲染 "Video"

c - 如何将一个文件的内容复制到另一个文件

在 IAR ARM V8 编译器中更改 DWARF elf 格式

c - 在 32 位整数中交换字节 2 和 4

c - 在 ARM Cortex-R4 上运行无 MMU Linux

c - 为什么在尝试从我的内核模块访问共享内存时得到 "Unhandled fault: imprecise external abort"?

c++ - 句柄的可移植位字段

c++ - 将 QByteArray 从大端转换为小端

c++ - 如何在 C++ 中将 little-endian 64 转换为主机字节顺序