我们有几 block 板,可以将它们视为主板。 这些主板包含来自微处理器、ASIC 和 FPGA 的不同设备...... 到目前为止,所有设备都是基于 16 位 Big endian 的。 目前的问题是我们使用的是基于 32 小端的新 ASIC,而主板上的所有其他设备都是大端。 我们已经创建了特定的 api 来读/写 32 位小端。 将来我们可能会拥有可以混合使用 16/32 大/小端字节序的设备的主板。这些相同的设备可用于不同的新旧主板。
我们使用嵌入式 C(在 Vxworks 中)作为语言,我们的软件被模块化以使用通用代码和主板特定代码。 使用#defines 和检查#ifdef 的解决方案已经出现,但我不完全确定如何使用它们。 我们不能真正在处理器类型上使用#ifdef,因为同一个处理器可以用在具有不同访问要求的不同主板上。
如果可能的话,我将非常感谢在示例 C 代码示例方面的架构和技术方面的帮助。
最佳答案
为您的设备编写 API。
API 将保证它将以微处理器的字节顺序从微处理器接收数据,并以微处理器的字节顺序将数据返回给微处理器。然后 API 执行 LE->BE 或任何转换。
例如,至少,您有 asic_read32
或 fpga_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/