首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写双精度浮点时用ecos处理未对齐写入

写双精度浮点时用ecos处理未对齐写入
EN

Stack Overflow用户
提问于 2015-08-07 13:18:03
回答 1查看 135关注 0票数 2

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

如果我将指向目的地和源的指针转换为long*,并且将值从一个分配到另一个,那么我就没有异常。

同样的情况发生在从未对齐地址读取double时,但只使用double,而不长long。这是有意义的,因为汇编代码确实使用了不同的指令。我不知道mips程序集,但据我所见,我得出的结论是,在长时间存储/读取long时,它是以两块4字节为单位存储/读取的,但是对于double,它是在一步内完成的。

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

我的最后一招是确保地址是对齐的,这将增加额外的开销,因为我写入了许多动态分配的缓冲区。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-07 13:40:48

IIRC MIPS不支持非对齐内存访问。您可能违反了要求 for malloc,以返回针对任何数据类型正确对齐的块。

double作为单个64位字获取。因此,它需要对齐8字节(此处:8位)。很长一段时间:在32位( word )架构上,使用具有32位内存访问的两个寄存器进行模拟(加载双字指令,因为ARM上的LDRD基本上是两个字加载指令)。因此,4字节是足够的(但可能不是最优的)对齐。

我想你现在是在与字词的界限保持一致。为了安全起见,您应该与max_align_t (C11)或类似的(pre-C11)对齐。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31878750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档