我正在用C语言编写适用于ECOS操作系统的mipsisa32架构的程序。这是我第一次使用 ecos 和 mips,我遇到了奇怪的问题。我使用动态分配的内存块并向其中写入一些数据。但是当我尝试将双精度值写入未与 8 字节对齐的地址时,我得到异常编号 5,它在 hal_intr.h 中声明为 CYGNUM_HAL_VECTOR_STORE_ADDRESS,后来重新定义为 CYGNUM_HAL_EXCEPTION_DATA_UNALIGNED_WRITE。
如果我将指针指向目标和源并将它们转换为 long long*,并且它们将值从一个分配给另一个,那么我不会得到异常。
从未对齐的地址读取双精度时也会发生同样的事情,但只有双精度,而不是长长。这确实有意义,因为汇编代码确实使用了不同的指令。我不知道 mips 程序集,但从我所见,我得出的结论是,在存储/读取 long long 时,它以两个 4 字节的块进行,但对于 double,它一步完成。
所以你有什么建议? 这是正常行为吗?
我最后的手段是确保自己的地址是对齐的,这会增加额外的开销,因为我写入了许多动态分配的缓冲区。