写入双精度浮点时处理ecos中的未对齐写入

Handle unaligned write in ecos when writed double precision floating point

我正在用 C 语言为 mipsisa32 架构编写程序,该架构可与 ECOS 配合使用操作系统。这是我第一次使用 ecos 和 mips,我遇到了一个奇怪的问题。 我使用动态分配的内存块并向其中写入一些数据。 但是当我尝试将双精度值写入未对齐到 8 字节的地址时,我得到异常编号 5,它在 hal_intr.h 中声明为 CYGNUM_HAL_VECTOR_STORE_ADDRESS,后来重新定义为 CYGNUM_HAL_EXCEPTION_DATA_UNALIGNED_WRITE.

如果我获取指向目标和源的指针并将它们转换为 long long*,并且它们将值从一个赋值给另一个,那么我不会得到异常。

从未对齐的地址读取双精度时会发生同样的事情,但仅限于双精度,而不是 long long。这确实有道理,因为汇编代码确实使用了不同的指令。我不知道 mips 程序集,但根据我所见,我得出结论,当 storing/reading long long 时,它会分两块 4 字节执行,但对于 double,它会一步完成。

那么你有什么建议呢? 这是正常行为吗?

我最后的办法是自己确保地址对齐,这会增加额外的开销,因为我写入许多动态分配的缓冲区。

IIRC MIPS 不支持未对齐的内存访问。您可能违反了 requirement for malloc to return blocks properly aligned for any datatype.

double 作为单个 64 位字提取。所以它需要对齐8个字节(这里:8位)。 对于 long long:在 32 位(字)架构上,使用具有 32 位内存访问的两个寄存器进行模拟(ARM 上的 LDRD 加载双字指令基本上是两个字加载指令)。所以 4 个字节是足够的(但可能不是最佳的)对齐方式。

我假设您目前正在对齐单词边界。为了安全起见,您应该对齐 max_align_t (C11) 或类似的(C11 之前的版本)。