Pregunta

Tengo un proyecto integrado que estoy trabajando en, y actualmente estoy cifrando el conductor del LCD del carácter.

Por el momento, el conductor del LCD sólo es compatible con la escritura "tonto". Por ejemplo, digamos que la línea 1 tiene un texto sobre ella, y me hacen una llamada a la función que escribe en la línea. La función objetivo se limite a la izquierda de la línea y escribir el texto (además de suficiente espacio en blanco para borrar lo escrito fue la última).

Esto está muy bien, pero tengo la sensación de que es terriblemente ineficiente veces, ya que algunas líneas son simplemente: "Algunos lectura: algunos de valor"

En lugar de "fuerza bruta" sustitución de toda la línea, que quería desarrollar un código que averiguar la mejor manera de actualización la información en la pantalla LCD.

(justo como fondo, se necesitan 2 bytes a buscar a cualquier posición carbón. Entonces puede comenzar a escribir la cadena)

Mi idea era tener primero un bucle. Este bucle se compararía la entrada a la última escritura, y al hacerlo, cubriría dos cosas:

A: Recoge todas las diferencias entre la última escritura y la entrada. Para cada segmento contiguo (ya sea iguales o diferentes) añadir dos bytes para el número de bytes. Esto se hace referencia en B para determinar si estamos perdiendo el ancho de banda de serie.

B: El bucle sería determinar si esto es realmente una cosa elegante a hacer. Si terminamos usando más bytes para actualizar la línea que a la "fuerza bruta" de la línea, a continuación, que deberíamos volver y dejar que el método de fuerza bruta se haga cargo. Debemos salir de la función de escritura inteligente, tan pronto como esta condición se cumple para evitar la pérdida de tiempo.

La siguiente parte de la función tomaría todas las diferencias, buscará el carbón requerido en la pantalla LCD, y escribirlos.

Por lo tanto, si tenemos una cadena como esta ya en la pantalla LCD: "Temp actual: 80F" y queremos actualizarlo a "Temp actual: 79F"

La función pasará a través y ver que tomaría menos ancho de banda que simplemente buscan el "8" y escribir "79". El "7" cubrirá el "8" y el "9" cubrirá el "0". De esa manera, no pierda tiempo escribiendo toda la cadena.

¿Le parece esto como una idea práctica?

¿Fue útil?

Solución

No tiene ningún sentido para optimizar este. La transmisión de 20 bytes a 9600 baudios toma el hardware 21 milisegundos. Y toma el software de unos pocos microsegundos. Lo suficientemente rápido para poder actualizar la pantalla más rápido que el ojo humano jamás podría percibir en un factor de 2. Y no es como se necesita el "ancho de banda", no hay ningún dato adicional que se me ocurre que 'd querer multiplexar en el canal serie.

Otros consejos

Si se asume que el desplazamiento en la pantalla de auto-incrementos y es una sola escritura para dar salida a cada carácter sucesivo, me inclinaría simplemente escribir toda la línea de la pantalla cada vez que a menos que haya un problema de rendimiento específico que se está tratando de arreglar . es decir:. optimizaciones son innecesarios posibles problemas de mantenimiento futuro y su tiempo "optimización" sería mejor gastado en algo que realmente no afecta al rendimiento de la aplicación global

Nota: Si la actualización de la pantalla es en realidad una aplicación que afecta problema de rendimiento, es probable que tenga una idea de cómo mucho más rápido que tiene que ser .... entonces (y no nosotros) puede ser su propio guía a la cantidad de optimización es suficiente.

La aplicación está planeando parece ser demasiado complejo para el problema. Todo el que comparan necesita en realidad puede retrasar la operación, si el procesador no es rápido.

Si sólo necesita actualización, por ejemplo, el valor de la temperatura, sólo debe actualizar el valor de la temperatura e ignorar los textos fijos. Es necesario tener las coordenadas en la memoria para cada campo que necesita ser actualizado. A continuación, basta con mover la posición de escritura a esa ubicación y escribir el valor. Así es como normalmente lo hago.

Si la actualización de la pantalla sigue siendo demasiado lenta, se puede considerar el uso de lenguaje ensamblador. Por ejemplo, hace unos años me hicieron software para un dispositivo de tipo reloj de pulsera con pantalla LCD de matriz de puntos de visualización. La actualización de la pantalla era demasiado lento (casi un segundo para actualizar toda la pantalla, por ejemplo, cuando se desplaza), así que escribí sólo la rutina de nivel más bajo en la Asamblea (en sustitución de aproximadamente 20 líneas de C con 30 líneas de montaje). La función resultante era la mitad del tamaño y 3 veces más rápido que la función C optimizado, y ahora la velocidad de actualización de la pantalla era adecuado.

De esa manera, no pierda tiempo escribiendo a cabo toda la cadena.

No deberías estar perdiendo mucho tiempo en absoluto, sin duda menor que el tiempo que se tardaría en hacer todo esto de cheques.

¿Cuál es la conexión con la pantalla LCD? SPI / I2C / parellel?

Sea lo que sea, si DMA está soportado por el SOC en la interfaz, lo utilizan.

Si no es así, no se debe esperar a que entre TX bytes, especialmente si el reloj de instrucciones del procesador es mucho más alto que el reloj del enlace de datos. Esto es probablemente cierto ya que la mayoría de visualización de caracteres es que he trabajado dispone de las especificaciones bajas de reloj máx.

El uso ya sea una rutina de interrupción para manejar el envío de cada byte o utilizar un enfoque 'híbrido' si se puede controlar rutas de interrupción (se está haciendo esto para el ahorro de energía). Theres una escritura interesante subiendo aquí

Para una pantalla de caracteres, este tipo de optimización de actualización es lo que la biblioteca curses trataba. De vuelta en el día, cuando hablamos con grandes ordenadores con terminales tontas y las líneas telefónicas a 1200 baudios o menos, a menudo era difícil para actualizar la pantalla lo suficientemente rápido como para hacer sentir programas interactivos a través del enlace de módem lenta. La biblioteca maldiciones hace que sea práctico, manteniendo un caché de lo que debería estar en la pantalla del usuario y el envío de una cerca de número óptimo de comandos de movimiento y borrado intercalados con caracteres normales para su visualización. Se requería que el soporte del terminal algún tipo de posicionamiento del cursor.

El maldice vidas biblioteca en un par de formas, y ncurses , por ejemplo, , es bien sabido, de código abierto, y con licencia bajo el GPL.

En principio, se podría adaptar ncurses para hablar con su controlador de pantalla y deja que haga todo el trabajo duro.

La cuestión abierta es si vale la pena el esfuerzo. En 9600 baudios, puede enviar 960 caracteres por segundo. Eso es lo suficientemente rápido para volver a pintar por completo una línea de 4 por 20 columnas LCD de 12 veces por segundo. Por lo menos que esté ejecutando en un PIC o ATtiny donde puede que tenga que poner en práctica esa UART en el software y la necesidad de los ciclos para realmente hacer algo útil, no es probable que sea pequeña ventaja de ser demasiado inteligente.

Dicho esto, todavía por lo general tiene sentido para pintar su texto fijo una vez, y simplemente actualizar los valores que se muestran a medida que cambian.

texto Modo LCD

Estoy de acuerdo con los demás, si usted está escribiendo en modo texto, no hay realmente ninguna razón para hacer esto en el nivel del personaje. El tiempo de procesamiento requerido para realizar los cálculos es probable que tome tanto tiempo como el tiempo para escribir realmente las cosas.

Por otra parte, a nivel de cada personaje va a masticar a través de un poco de memoria, ya que necesitará para amortiguar lo que se muestra actualmente (es decir, lo que estaba escrito por última vez).

Se puede simplificar el proceso de división de la pantalla en secciones (líneas tienden a ser los más convenientes) y luego cuando flagging que los cambios en la formación. Esto es especialmente útil si desea escribir en un búfer de memoria de la pantalla, y sincronizarlo más adelante (en una interrupción temporizada por ejemplo).

Reducción por diseño

En lugar de dejar esto al conductor alcanzar, usted podría disminuir el tiempo de escritura a nivel de aplicación, garantizando sólo escribir las cosas que los cambios. Esto podría conseguirse mediante la designación de las células valor específico, esencialmente haciendo lo siguiente:

char text[50];
int val;
...
lcd_print("The count is ", 0, 0); // Print static text at the coords (0,0)
sprintf(text, "%d", val);
lcd_print(text, 0, 13); // Print changing text at (0,13)
...
sprintf(text, "%d", val);
lcd_print(text, 0, 13); // Print changing text at (0,13)

Y no:

char text[50];
int val;
...
sprintf(text, "The count is %d", val);
lcd_print(text, 0, 0); // Print all text at the coords (0,0)
...
sprintf(text, "The count is %d", val);
lcd_print(text, 0, 0); // Print all text at the coords (0,0)

Gráficos modo LCD

Por otro lado, si su proceso de escritura es bastante caro, como el mío (~ 20 bytes, escribir un carácter en modo gráfico), el tiempo a continuación, guardar en una base de carácter serían útiles. Hay dos esquemas se pueden utilizar. La primera es que usted describe, pero que puede que al igual que tener en cuenta (si se utiliza el modo gráfico) el concepto de memoria intermedia de una línea de píxeles horizontales a través de la línea de texto.

Escribir cada personaje en una base por carácter requiere mover manualmente el cursor de escritura a la línea de píxeles, asumiendo que su dibujo horizontal, y luego de arriba a abajo. Este paso podría ser eliminado por escrito todas las líneas superiores de todos los caracteres en una línea de texto, o mejor aún un subconjunto cambiada (es decir, "ABC" y luego por separado "I" en "XXXDEFGHX" -> "ABCDEFGHI").

Por supuesto, el ahorro exacto mediante el último método dependerá de la cantidad de líneas de píxeles formados por la altura de un carácter. Los más líneas, mayor será el ahorro (porque usted está obligado a mover el cursor más veces).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top