This is the mail archive of the crossgcc@cygnus.com mailing list for the crossgcc project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Roy Leonard wrote: > > The code makes use of an IAR specific type called sfr - special function > register. Does anyone know of a similar type in gcc, or an easy way to > implement a similar type? > > A special function register is something like a UART control register, which > is at a predetermined address and can read/written to as a byte or as > individual bits. > > Example: > > sfr UART_CONTROL = 0xff20; /* The address of UART_CONTROL */ > > UART_CONTROL = 0xff /* set the contents of the register to 0xff */ > > UART_CONTROL.1 = 0; /* set bit 1 to 0 */ > > Any ideas, comments.... union UartControl { unsigned char all; /* Hopefully byte-sized. */ struct { /* Beware unknown ordering of bits within byte. */ unsigned bit7:1; unsigned bit6:1; unsigned bit5:1; unsigned bit4:1; unsigned bit3:1; unsigned bit2:1; unsigned bit1:1; unsigned bit0:1; } bits; }; /* Some shortcuts to make programming simpler. */ #define bit0 bits.bit0 #define bit1 bits.bit1 #define bit2 bits.bit2 #define bit3 bits.bit3 #define bit4 bits.bit4 #define bit5 bits.bit5 #define bit6 bits.bit6 #define bit7 bits.bit7 /* The variable declaration (sort of). */ #define UART_CONTROL (*(volatile union UartControl*)0xff20) int test(void) { UART_CONTROL.all = 0xff; UART_CONTROL.bit1 = 0; return sizeof(union UartControl); /* Just to check the size of UartControl. */ } Excerpt from the generated assembly code (gcc 2.7.2.1 for 68K Amiga): _test: link a5,#0 movel #65312,a0 ;cache the register address moveb #255,a0@ ;write 0xff to register moveb a0@,d0 ;bit setting implemented with non-atomic andb #-3,d0 ;read/write, -3 == 253 => clearing bit 1 moveb d0,a0@ moveq #1,d0 ;return size of register which is expected one unlk a5 rts Hopefully this will also work for your version of gcc and your target CPU. -- Ola Liljedahl olli@enea.se Enea OSE Systems AB "OSE - Advanced but not alien"