Mais perguntas com a interface mapeada na memória

Ainda tenho alguns problemas com meu código c que lida com um dispositivo mapeado na memória. No momento, declaro o espaço de endereço dos registros que escrevo como ponteiro volátil e escrevo dados para eles, como mostrado abaixo:

volatile unsigned int *wr_register = (int *) 0x40000000;
volatile unsigned int *c_register =  (int *) 0x40000100;
...

main{

  *wr_register = 0x01234567;

  *c_register = 0x01234567;    
  *(c_register+1) = 0x89abcdef;  

}

Isso funciona mais ou menos bem. No entanto, eu gostaria de ter funções específicas de leitura e gravação que interajam com os registros mapeados na memória. Idealmente, seria algo parecido com isto:

const unsigned int wr_register = 0x40000000;
const unsigned int c_register  = 0x40000100;

function write_REG(unsigned int address, int offset, int data)
{
    (unsigned int*) (address + offset) = data;
}

main{

  *write_REG(0x40000000, 0, 0x01234567);

  *write_REG(0x40000100, 0, 0x01234567);
  *write_REG(0x40000100, 1, 0x89abcdef);  

}

Ainda não tentei ser sincero, mas estou me perguntando se alguém poderia me dizer se essa é uma maneira adequada de fazer isso.

Edição: Talvez seja útil para outra pessoa, aqui eu tenho minha função e eles parecem funcionar. Muito obrigado pelos comentários úteis!

void reg_write(unsigned int address, int offset, int data)
{
    *((volatile unsigned int*)address + offset) = data;
}

int reg_read(unsigned int address, int offset)
{
    return(*((volatile unsigned int*)address + offset));
}   

Muito Obrigado

questionAnswers(2)

yourAnswerToTheQuestion