Porting code to gcc, replacement for SFR?

Ola Liljedahl olli@enea.se
Fri Nov 7 10:54:00 GMT 1997


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"



More information about the crossgcc mailing list