Muy bien, todos, ese título puede parecer una cantidad significativa de tecnobabble, así que déjame explicarte lo que estoy tratando de hacer.
Estoy empezando a entrar en la familia PIC32, específicamente en la serie PIC32MZ, especialmente porque estoy empezando a querer hacer cosas para las que quiero más caballos de fuerza de los que un AVR puede ofrecer. He estado leyendo un montón de documentos tutoriales y fuentes sobre el tema, pero pensé que traería esta pregunta aquí.
Lo que estoy tratando de hacer es desarrollar un conjunto de clases para las interfaces de comunicación en C ++, de manera que no sean específicas para la unidad; es decir, una clase genérica que se inicializa con el número de la unidad de interfaz de comunicación; Esencialmente "un conjunto de código para cualquier número de interfaces". Déjame darte un ejemplo.
Sabemos por la hoja de datos que la familia PIC32MZ tiene 6 módulos SPI de 4 hilos. Este ejemplo , mientras que (presumiblemente) funciona, tiene una serie de cosas que considero indeseables para mi uso:
- Está en C. Quiero usar clases para ayudarme con mi gestión de datos, así que preferiblemente estoy buscando una solución de C ++. Obviamente, me llevaría diez minutos volver a escribir este código, pero vea el siguiente punto.
- Es específico de
SPI2
. Esto significa que necesitaría una clase individual para cada una de las seis unidades SPI, incluso si solo necesito una o dos. Lo que me gustaría desarrollar es una clase unificada para SPI, de manera que pueda llamar a una clase y declarar el número de unidad (1 a 6) en el constructor y hacer que inicialice la apropiada. Basándose en el ejemplo anterior, el constructor se vería así:
SPI::SPI (uint baud, uint u_num)
{
// Some discrimination of what u_num is
// Setup
}
Cosas que he considerado, pero descartadas / decididas en contra / inseguras si son factibles o cómo hacerlo:
- If / else / switch sentencias en cada método. Esta es, obviamente, la más fácil de todas las rutas posibles, pero también la más tonta y la más subóptima. Cada vez que el método llama, debería evaluar qué unidad asignar los parámetros a los que se pierde tiempo.
- punteros de función de las funciones de Microchip en matrices para llamadas. Por lo tanto, las funciones SPI1-6 tales como configurar, enviar byte, etc. se mapearían en una matriz, cuando el método de clase lo llama, conecta el número de unidad (almacenado en una variable de clase) en la matriz y bombea los parámetros a la función a la que hace referencia por la tabla de puntero.
- Macros. Usar las macros de registro provistas por Microchip de alguna manera para mi ventaja, aunque no tengo idea (no tengo miedo de decir eso) cómo usaría eso o para mi ventaja. Nuevamente, el sentimiento es que tendría que ser algún tipo de tabla de punteros.
- Direcciones sin procesar. Me parece recordar que la hoja de datos da las direcciones de los registros en el espacio de la memoria, aunque es difícil dibujar una referencia a ellos en este momento a pedido. Creo que eran direcciones virtuales. Mi principal problema con esto es que no tengo ni idea de cómo aprovechar la memoria virtual de un contexto de alto nivel (siempre entendí que el sistema operativo y la CPU administran la memoria virtual a la asignación de direcciones físicas). , pero cómo eso se traduce en el tótem del cual no tengo idea, y por lo tanto no tendría idea de cómo hacer que la clase funcione. Esencialmente, si pudiera resolverlo (siempre que fuera factible), podría averiguar la asociación (desplazamiento) entre, por ejemplo, los registros SPI1 y los registros SPI2 y hacer que los métodos de clase apliquen automáticamente ese desplazamiento dependiendo de la variable de clase de unidad. / li>
EDITAR: Encontró el mapa de registro SPI junto con las direcciones virtuales, aparentemente comenzando en 0xBF821000
, aunque hasta el momento no es cómodo.
Gracias si alguno de ustedes puede ayudar.