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

elements of XHUGE structs

Hi Folks,

I do have some trouble with huge memory model and xhuge structures.

I wonder, how is it with structures of type xhuge, which constists of a lot of sub- structure types:

struct big
{
char amem[65000];
char bmem[65000];
char cmem[65000];
} xhuge st;

I do have functions get passed pointers to the substructures like this:

void dothat(char * pcStr) {}

I call the function like this:
dothat(&st.amem[8]);

Because of some strange errors in my system I wonder whether I should call the function with this cast:

dothat((char*)&st.amem[8]);

do get the xhuge type of struct st out of the way.

In common: how is it with assignments of a variable of type xhuge to one of type huge? I do this often in my code and the compiler gives no warning when doing that.

A little bit confused.
Mike

Parents
  • Hi Folks,

    the Situation is like this:

    Keil doc says about huge pointers:
    32-bit pointer; 16-bit address calculation supports objects of up to 64 KB.
    huge is the optimum memory type on the C167/C165 CPU for accessing the
    16MB address space.

    Thats half of the truth. "16-bit address calculation" means: Only the 16 least significant bits of the pointer are calculated. So the pointer can only be used with objects up to 64 KB size when the object was placed by the linker to the start of a 64 KB segment.

    Objects, which are manualy placed at fixed adresses, for instance in a 1 MB external flash, can be at a boundary between two 64 KB segments. So the access to the end of the structure does access in reality to the begin of the first segment.

    Keep in mind:
    huge pointer objects must not cross a 64 KB segment border.

    Mike

Reply
  • Hi Folks,

    the Situation is like this:

    Keil doc says about huge pointers:
    32-bit pointer; 16-bit address calculation supports objects of up to 64 KB.
    huge is the optimum memory type on the C167/C165 CPU for accessing the
    16MB address space.

    Thats half of the truth. "16-bit address calculation" means: Only the 16 least significant bits of the pointer are calculated. So the pointer can only be used with objects up to 64 KB size when the object was placed by the linker to the start of a 64 KB segment.

    Objects, which are manualy placed at fixed adresses, for instance in a 1 MB external flash, can be at a boundary between two 64 KB segments. So the access to the end of the structure does access in reality to the begin of the first segment.

    Keep in mind:
    huge pointer objects must not cross a 64 KB segment border.

    Mike

Children