That's quite a lot of questions all rolled into ... I don't know how many since a) your numbering is broken and b) not all numbered items in your question are, really, questions. :)
The size will be affected by the fact that all the struct members are bitfields. It's hard to be more specific than that, but code at this level (often tailored for a very spefific combination of compiler and hardware) generally is written with some very particular outcome in mind.
In this case, I would say that the size is probably 1, since there's 8 bits being mapped out.
The extern
says "treat the memory at address 0xf92 as a value of this type". This is mapping out an absolute location, where the PIC has a hardware register. This syntax is not standard C, that's some compiler's extension. The portable way would have been to declare it like this:
// in some header
extern volatile TRISAbits_t * const TRISAbits;
// in some library or C file that you link into your app:
volatile TRISAbit_t * const TRISAbits = (volatile TRISAbits_t *) 0xf92;
This declares TRISAbits
as being a pointer to the register, rather than a variable that really is at the register's address. The pointer style means accesses have to look like this:
TRISAbits->RA0 = 0;
It also uses more memory since the global pointer variable has to "live" somwhere, whereas the magical @
-instance lives in the register space, not in memory.