Pregunta adicional con la interfaz asignada de memoria
Todavía tengo algunos problemas con mi código c que trata con un dispositivo mapeado de memoria. En este momento declaro el espacio de direcciones para los registros que escribo como puntero volátil y les escribo datos como se muestra a continuación:
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;
}
Esto funciona más o menos bien. Sin embargo, me gustaría tener funciones específicas de lectura y escritura que interactúen con los registros mapeados en memoria. Entonces, idealmente, se vería así:
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);
}
No lo he probado aún para ser honesto, pero me pregunto si alguien podría decirme si esta es una forma adecuada de hacerlo.
EDITAR: Tal vez sea útil para otra persona, aquí tengo mi función y parece que funcionan. ¡Muchas gracias por los útiles comentarios!
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));
}
Muchas gracias