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
  • "pObject->pVar points to an instance of a structure like this..."

    It probably doesn't. What is the code that sets the value of pObject->pVar?

    "Is the data abort error happening because that object is not on a 32-bit boundary in memory?"

    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.

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

    I'd go back and take a look at how pObject->pVar gets set.

Reply
  • "pObject->pVar points to an instance of a structure like this..."

    It probably doesn't. What is the code that sets the value of pObject->pVar?

    "Is the data abort error happening because that object is not on a 32-bit boundary in memory?"

    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.

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

    I'd go back and take a look at how pObject->pVar gets set.

Children