为什么atmel处理器上的mono不能与LayoutKind.Explicit一起使用?

时间:2012-12-30 11:15:56

标签: mono arm atmel layoutkind.explicit

我创建了一个像bellow一样的结构:

[StructLayout(LayoutKind.Explicit, Pack = 1)]
    public class NodRecord
    {
        [FieldOffset(0)]
        public ushort Driver;


        [FieldOffset(2)]
        public ushort BaudRate;

        [FieldOffset(4)]
        public ushort EnquiryInterval;

        [FieldOffset(6)]
        public byte Protocol;

        [FieldOffset(7)]
        public ushort Delay;

        [FieldOffset(9)]
        public NodIPAddress IP_Addr_Other;

        [FieldOffset(13)]
        public ushort IP_Port_Other;

        [FieldOffset(15)]
        public ushort IP_Port_Own;

        [FieldOffset(17)]
        public ushort Application;
    }

然后我用下面的代码阅读了它:

 readBuffer = reader.ReadBytes(sizeType);
 handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
 nodes = (NodRecord)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NodRecord));
 handle.Free();

我想知道x86,x64和cortex arm处理器一切正常但是对于ushort变量,Atmel ARM9 AT91SAM9G20我得到了错误的值,例如第一个和第三个下一个字节值替换而不是第一个和第二个下一个字节,但是对于字节值,一切都很好

1 个答案:

答案 0 :(得分:2)

一些旧的ARM处理器(以及一些新的,取决于它们的配置和操作系统)在涉及任何未对齐的地址时都有一个破碎的概念:它们没有故障,并且它们不会在指定的地址加载值。他们所做的是(我忘了细节)某种无意识的旋转或地址对齐,以便数据出来,不像你(或其他任何人)期望的那样。 Mono不能很好地处理这种情况(这意味着减慢了所有表现良好的情况下的代码,所以我们做出了折衷,让几乎每个人都享受速度,一些人处理边缘情况)。 您有两种可能的解决方案:查看您使用的操作系统是否具有使内核处理此类情况的配置选项,或者通过逐字节加载并在您具有未对齐数据时移动以组合值来自行实现编组。 / p>