ARM9上使用C的未对齐内存访问异常的解决方法是什么?

时间:2009-03-23 15:51:33

标签: c++ c embedded arm

架构ARM9。编程语言C。

我们有第三方堆栈,其中一个调用将指针(pBuffer)带到内存位置。在堆栈中,它们可以自由地绕过传递的指针并按照自己的意愿访问它。不幸的是,它们偏移传入的指针并将其传递给另一个试图从奇数/未计数内存位置执行此操作的函数

         ((uint16 *)pBuffer)[index] = value;

其中value的类型为uint16index的边界已经过检查,索引为pBuffer。这会导致未对齐的内存访问异常。 pBuffer指向堆上的char *

如上所述,即使我们可以查看第三方堆栈,我们也无法正式更新代码。因此,我们通知提供商,他们在下一版本中提供更新。

我想了解是否有解决方法。如何在不违反未对齐访问的情况下执行上述分配?解决此类问题的最佳方法是什么。

3 个答案:

答案 0 :(得分:7)

逐字节复制值。将其转换为(无符号)字符指针,然后一次复制一个字节。

它不漂亮,但听起来并不像你有很多选择。

答案 1 :(得分:1)

有三种可能性,到目前为止我无法从你的问题中确定是哪种情况。

案例1:索引总是奇数。解决方案:memmove()pBuffer超过1个字节 案例2:索引有时是奇数,你可以预先预测它。解决方案:当你知道索引将是奇数时,memmove()pBuffer超过1个字节。 案例3:索引有时很奇怪,你无法预测它何时会出现。这很不幸,因为代码错误。

答案 2 :(得分:1)

如果您控制pBuffer,作为一种解决方法,您可以将其声明为uint32_t数组(或者与您的体系结构对齐的任何内容)。通过将缓冲区声明为uint32_t,编译器将选择正确的对齐方式。您可以在调用目标函数时将其强制转换为uint8_t *。

这应该与您发布的示例代码一起使用,但如果第三方代码将任何未对齐的偏移量应用于缓冲区,则可能仍会失败。