13 votos

Clases de C++ para el pin de e/S de abstracción

Estoy buscando C++ abstracción para el hardware de puntos de e/S o alfileres. Cosas como in_pin, out_pin, inout_pin, tal vez open_collector_pin, etc.

Yo sin duda puede venir para arriba con un conjunto de abstracciones de mí mismo, así que no estoy en busca de 'hey, usted puede hacerlo de esta manera" tipo de respuestas, sino más bien el 'mira esta biblioteca que se ha utilizado en este y este y este proyecto".

Google no devuelve nada, tal vez porque no sé cómo otros llamarían a esto.

Mi objetivo es la construcción de e/S de las bibliotecas que se basan en esos puntos, sino que también proporcionan puntos de referencia, por lo que sería fácil, por ejemplo, conectar un LCd HD44780 a cualquiera de los pines del chip, o I2C (o SPI) I/O extender, o cualquier otro punto que de alguna manera puede ser controlado, sin ningún cambio en la pantalla LCD de la clase.

Sé que esto es en la electrónica/software de borde, lo siento si no pertenece aquí.

@leon: cableado Que es una bolsa grande de software, tendré que mirar más de cerca. Pero parece que no utilice un pin de la abstracción como yo quiero. Por ejemplo, en el teclado de la implementación veo

digitalWrite(columnPins[c], LOW);   // Activate the current column.

Esto implica que hay una función (digitalWrite) que sabe cómo escribir un pin I/O. Esto hace que sea imposible para agregar un nuevo tipo de pin de e/S (por ejemplo, uno que está en una MCP23017, así que tiene que ser por escrito a través de I2C) sin tener que reescribir la función digitalWrite.

@Oli: busqué en google un Arduino IO ejemplo, pero al parecer a utilizar sobre el mismo enfoque que el Cableado de la biblioteca:

int ledPin = 13;                 // LED connected to digital pin 13
void setup(){
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}

5voto

Nate Puntos 1

Me permite descaradamente conectar mi proyecto de código abierto Kvasir https://github.com/porkybrain/Kvasir/. El Kvasir::Io porción proporciona pin funciones de manipulación. Primero debe definir su pin con Kvasir::Io::PinLocation así:

constexpr PinLocation<0,4> led1;    //port 0 pin 4
constexpr PinLOcation<0,8> led2;

Aviso que este no es realmente el uso de la memoria RAM debido a que estos son constexpr variables.

Todo el código que usted puede utilizar estas localizaciones de las clavijas en la acción de la fábrica de' funciones como makeOpenDrain, conjunto, claro, makeOutput y así sucesivamente. Una "acción de fábrica' en realidad no ejecutar la acción, sino que devuelve un Kvasir::Register::Acción que se ejecuta con Kvasir::Register::apply(). La razón de esto es que se aplican() combina las acciones que pasa cuando actúan en uno y el mismo registro, de modo que hay un aumento de la eficiencia.

apply(makeOutput(led1),
    makeOutput(led2),
    makeOpenDrain(led1),
    makeOpenDrain(led2));

Desde la creación y combinación de acciones se realiza en tiempo de compilación que este debe producir el mismo código ensamblador como el típico mano codificados equivalente:

PORT0DIR |= (1<<4) | (1<<8);
PORT0OD |= (1<<4) | (1<<8);

Para más información sobre lo que Kvasir::Register::Acciones que pueden hacer, echar un vistazo a https://github.com/porkybrain/Kvasir/tree/master/Kvasir/src/Register

3voto

delliottg Puntos 345

Respuesta corta: lamentablemente, no hay ninguna biblioteca para hacer lo que quieres. Yo lo he hecho en numerosas ocasiones, pero siempre en no en proyectos de código abierto. Estoy pensando en poner algo en github pero no estoy seguro de cuando puedo.

Por Qué C++?

  1. El compilador es de libre uso dinámica de la palabra-el tamaño de la evaluación de la expresión. C se propaga a int. Su byte de la máscara/shift se puede hacer más rápido/más pequeño.
  2. Inline.
  3. El uso de plantillas de operaciones permite variar el tamaño de palabra y otras propiedades, con el tipo de seguridad.

3voto

Mark Biek Puntos 41769

El Cableado proyecto utiliza la abstracción como que:

http://wiring.org.co/

y el compilador está escrito en C++. Usted debe encontrar un montón de ejemplos en el código fuente. El software de Arduino está basado en el Cableado.

2voto

Alex Andronov Puntos 178

En C++, es posible escribir una clase de modo que usted puede utilizar puertos de e/S como si fueran variables, por ejemplo,

 PORTB = 0 x 12; /* Escribir en un puerto de 8 bits */
 si (RB3) LATB4 = 1; /* Lectura de uno de e/S bits y condicionalmente escribir otro */

sin tener en cuenta para la implementación subyacente. Por ejemplo, si uno está usando una plataforma de hardware que no es compatible con bits operaciones de nivel, pero no apoyo a nivel de byte de registro de operaciones, uno podría (probablemente con la ayuda de algunas macros) definir una clase estática IO_PORTS con una línea de propiedades de lectura y escritura llama bbRB3 y bbLATB4, de tal manera que la última declaración anterior se convertiría en

 si (IO_PORTS.bbRB3) IO_PORTS.bbLATB4 = 1;

lo que a su vez se convierten en algo así como:

 si (!!(PORTB & 8)) (1 ? (PORTB |= 16) : (PORTB &= ~16));

Un compilador debe ser capaz de notar la expresión de la constante en el ?: operador y simplemente incluir la "verdadera" forma parte. Podría ser posible reducir el número de propiedades creadas por tener las macros ampliar algo como esto:

 si (IO_PORTS.ppPORTB[3]) IO_PORTS.ppPORTB[4] = 1;

o

 si (IO_PORTS.bb(addrPORTB,3)) IO_PORTS.bbPORTB(addrPORTB,4) = 1;

pero no estoy seguro de que un compilador sería capaz de en-línea el código como muy bien.

Yo no deseo dar a entender que el uso de puertos de e/S como si fueran variables es necesariamente una buena idea, pero ya que usted menciona que C++ es un truco útil para saber. Mi preferencia en C o C++, si la compatibilidad con el código que utiliza el mencionado estilo no era necesario, que probablemente sería definir algún tipo de macro para cada e/S bits y, a continuación, definir macros para "readBit", "writeBit", "setBit", y "clearBit" con la salvedad de que los bits de identificación de argumento que se pasa a los macros debe ser el nombre de un puerto de e/S diseñado para su uso con dichas macros. El ejemplo de arriba, por ejemplo, debería ser escrita como

 si (readBit(RB3)) setBit(LATB4);

y se traduce como

 si (!!(_PORT_RB3 & _BITMASK_RB3)) _PORT_LATB4 |= _BITMASK_LATB4;

Que sería de un poco más de trabajo para el preprocesador de lo que sería el estilo de C++, pero sería menos trabajo para el compilador. Asimismo, permitiría una óptima generación de código para muchos de e/S de las implementaciones, y decente para la implementación del código para casi todos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X