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
  • Is there an easy way (besides the __at__ attribute) to get variables like the above structure to be aligned on 32-bit boundaries?

    That's roughly equivalent to asking if there's an easy way to make triangular wheels roll smoothly, short of making the road a sequence of perfectly shaped arcs fitting triangular wheels of just that size.

    The answer to both questions is: "Don't do that, then!". Packing structures and pointer gymnastics like those in the OP are two concepts that just don't mix, period. For the pointer voodoo to work, the standard semantics of C have to be in action. Stuff like __packed breaks that premise.

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

    That's roughly equivalent to asking if there's an easy way to make triangular wheels roll smoothly, short of making the road a sequence of perfectly shaped arcs fitting triangular wheels of just that size.

    The answer to both questions is: "Don't do that, then!". Packing structures and pointer gymnastics like those in the OP are two concepts that just don't mix, period. For the pointer voodoo to work, the standard semantics of C have to be in action. Stuff like __packed breaks that premise.

Children