cmicrocontrolleravrwinavr

pointers in C with a #define


The function:

#define ASSOC(port) (*(volatile bit_field *) (&port))

The function call:

#define SCLK ASSOC(PORTC).bit0

bit_field defined as a struct like this:

typedef struct {
 unsigned char bit0 :1, bit1 :1, bit2 :1, bit3 :1, bit4 :1, bit5 :1,
   bit6 :1, bit7 :1;
} bit_field;

I don't know where &port is defined.

Can someone please explain how the function is read and how it works please? I am not very good with pointers and this example in particular is very confusing with "*" in the front and at the end and the "&" with the port.

Thank you


Solution

  • port is not defined. It is the argument to ASSOC as you can see here:

    #define ASSOC(port) /* etc. */
    

    Also, I assume it is supposed to be a char, because the bit_field has 8 bits. The & in &port simply serves to get its address in memory.

    ASSOC in turn casts &port to a volatile bit_field * and then there is the extra * at the beginning to point directly to the contents of the resulting pointer.

    Therefore, once you call ASSOC(port), you can use it as a bit_field type structure. For example, the SCLK macro will give the first bit of PORTC.