This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Problem with alignment of variable in memory

I'm using an AT91SAM7 uC and have inherited some C code which is giving me fits. When I run this code I get a data abort error. I've tracked down the offending line of code, and it appears to be caused by something like this:

n = (UINT8) ((UINT16*)(pObject->pVar))[0];

pObject->pVar points to an instance of a structure like this:

typedef __packed struct{
    UINT16 v1;
    UINT32 v2;
    UINT32 v3;
    UINT32 v4;
    UINT32 v5;
}OBJTYPE;

OBJTYPE xxx = {0,0,0,0,0};

When I stop the debugger on the line that causes the data abort error, I can see that pObject->pVar is pointing to 0x00200173. Is the data abort error happening because that object is not on a 32-bit boundary in memory? If so, how can I [easily] fix that? I've been going through all the online doc's reading about __packed, #pragma pack(n), adding unions to typedefs, etc.; but all the things I've been trying have not fixed the problem.

Is there an easy way (besides the __at__ attribute) to get variables like the above structure to be aligned on 32-bit boundaries?

Can anyone give me a suggestion for how to resolve this problem?

Help...
Dave.

Parents
  • > I would wager that it is on a 32-bit boundary. Packing
    > directives deal with packing structure members, not
    > the alignment of the entire structure.

    Actually the opposite is true. __packed packs all elements as well as the entire structure.

    If you'd prefer having the structure halfword aligned, you should
    write the code like this:

    typedef struct{
                 UINT16 v1;
        __packed UINT32 v2;
        __packed UINT32 v3;
        __packed UINT32 v4;
        __packed UINT32 v5;
    }OBJTYPE;
    

    All word sized elements will be packed (alignment 1) and the halfword
    element will remain unpacked (aligment 2). The entire structure will
    have the same alignment as its "most aligned" member and thus have an
    alignment of 2.

    Regards
    Marcus
    http://www.doulos.com/arm/

Reply
  • > I would wager that it is on a 32-bit boundary. Packing
    > directives deal with packing structure members, not
    > the alignment of the entire structure.

    Actually the opposite is true. __packed packs all elements as well as the entire structure.

    If you'd prefer having the structure halfword aligned, you should
    write the code like this:

    typedef struct{
                 UINT16 v1;
        __packed UINT32 v2;
        __packed UINT32 v3;
        __packed UINT32 v4;
        __packed UINT32 v5;
    }OBJTYPE;
    

    All word sized elements will be packed (alignment 1) and the halfword
    element will remain unpacked (aligment 2). The entire structure will
    have the same alignment as its "most aligned" member and thus have an
    alignment of 2.

    Regards
    Marcus
    http://www.doulos.com/arm/

Children
No data