Question

J'ai un projet intégré que je travaille, et je suis codage actuellement le pilote LCD de caractères.

À l'heure actuelle, le pilote LCD prend en charge que l'écriture « muet ». Par exemple, supposons que la ligne 1 a un texte à ce sujet, et je fais un appel à la fonction qui écrit à la ligne. La fonction va simplement chercher au début de la ligne et écrire le texte (plus assez d'espaces pour effacer tout ce qui a été écrit en dernier).

Ceci est bien beau, mais je reçois le sentiment qu'il est parfois horriblement inefficace, car certaines lignes sont tout simplement: "Certains de lecture: une-valeur"

Au lieu de « force brute » en remplaçant la ligne, je voulais développer un code qui figurerait la meilleure façon de mise à jour les informations sur l'écran LCD.

(comme arrière-plan, il faut 2 octets de chercher à ne importe quelle position char. Je peux alors commencer à écrire la chaîne)

Mon idée était d'abord une boucle. Cette boucle comparerait l'entrée à la dernière écriture, et ce faisant, il couvrirait deux choses:

A: Collectez toutes les différences entre la dernière écriture et l'entrée. Pour chaque segment contigu (que ce soit identique ou différent) ajouter deux octets au nombre d'octets. Ceci est référencé dans B pour déterminer si nous perdons la bande passante série.

B: La boucle serait de déterminer si cela est vraiment une chose à faire. Si nous finissons par utiliser plusieurs octets de mettre à jour la ligne que de « force brute » la ligne, nous devrions revenir et laisser la méthode de la force brute prendre en charge. Nous devons sortir de la fonction intelligente d'écriture dès que cette condition est remplie pour éviter de perdre du temps.

La partie suivante de la fonction prendrait toutes les différences, chercher à l'omble chevalier nécessaire sur l'écran LCD, et de les écrire.

Ainsi, si nous avons une chaîne comme celui-ci déjà sur l'écran LCD: "Courant Temp: 80F" et nous voulons le mettre à jour "Courant Temp: 79F"

La fonction passera par et voir que cela prendrait moins de bande passante simplement chercher à « 8 » et d'écrire « 79 ». Le « 7 » couvrira le « 8 » et « 9 » couvrira le « 0 ». De cette façon, nous ne perdez pas de temps à écrire sur la chaîne entière.

Est-ce sembler une idée pratique?

Était-ce utile?

La solution

Il ne fait pas de sens pour optimiser cela. 20 octets à transmission 9600 bauds prend le matériel 21 millisecondes. Et prend le logiciel quelques microsecondes. assez rapide pour être en mesure de mettre à jour l'affichage plus rapide que l'œil humain ne pourrait jamais percevoir par un facteur de 2. Et ce n'est pas comme vous avez besoin de la « bande passante », il n'y a pas de données supplémentaires que je peux penser que vous « d veulent multiplexer sur le canal série.

Autres conseils

En supposant que le décalage dans les incréments d'affichage automatique et il est une seule écriture à la sortie de chaque caractère successif, je serais enclin à écrire simplement la ligne d'affichage en entier à chaque fois, sauf si il y a un problème de performance spécifique que vous essayez de fixer . à savoir:. optimisations inutiles sont des maux de tête d'entretien futurs potentiels et votre temps « l'optimisation » serait mieux dépensé sur quelque chose qui ne fait affecter les performances de l'application globale

Remarque: Si la mise à jour d'affichage est en fait une application affectant problème de performance, vous avez probablement une idée de la façon beaucoup plus rapide, il a besoin d'être .... alors vous (et pas nous) peut être votre propre guide combien l'optimisation est suffisant.

La mise en œuvre que vous prévoyez semble être trop complexe pour le problème. Toutes les comparer nécessaires peut effectivement ralentir l'opération, si le processeur n'est pas rapide.

Si vous ne devez mettre à jour par exemple la valeur de température, vous devez simplement mettre à jour la valeur de température et d'ignorer les textes fixes. Vous devez avoir les coordonnées en mémoire pour chaque champ qui doit être mis à jour. Ensuite, il suffit de déplacer la position d'écriture à cet emplacement et écrire la valeur. Voilà comment je le fais habituellement.

Si la mise à jour de l'écran est encore trop lent, vous pouvez envisager d'utiliser la langue de l'Assemblée. Par exemple, il y a quelques années j'ai fait un logiciel pour un dispositif de type montre-bracelet avec affichage à matrice de points à cristaux liquides. La mise à jour d'affichage était trop lent (près d'une seconde mise à jour de l'affichage entier par exemple lors du défilement), donc je l'ai écrit juste la routine de bas niveau à l'Assemblée (le remplacement d'environ 20 lignes de C avec 30 lignes de montage). La fonction résultante est la moitié de la taille et 3 fois plus rapide que la fonction optimisée C, et maintenant la vitesse de mise à jour d'affichage était adéquat.

  

De cette façon, on ne perd pas de temps à écrire   la chaîne entière.

Vous ne devriez pas perdre beaucoup de temps, certainement moins que le temps qu'il faudrait pour faire tout ce contrôle.

Quelle est la connexion à l'écran? SPI / I2C / parellel?

Quoi qu'il en soit, si le DMA est pris en charge par le SoC sur l'interface, l'utiliser.

Dans le cas contraire, vous ne devriez pas être en attente autour entre tx octets, surtout si l'horloge d'instructions du processeur est beaucoup plus élevé que l'horloge de la liaison de données. Cela est probablement vrai que l'affichage le plus de caractère est que j'ai travaillé ont de faibles caractéristiques d'horloge max.

Utilisez soit une routine d'interruption pour gérer l'envoi de chaque octet ou utiliser une approche « hybride » si vous pouvez contrôler le routage d'interruption (sont faites cela pour des économies d'énergie). Theres une écriture intéressante jusqu'à

Pour un affichage de caractères, ce type d'optimisation de mise à jour est ce que la bibliothèque curses était. Retour dans la journée, lorsque nous avons parlé de gros ordinateurs avec des terminaux muets et les lignes téléphoniques à 1200 bauds ou moins, il était souvent difficile de mettre à jour l'écran assez rapide pour faire des programmes interactifs se sentent sur le lien modem lent. La bibliothèque curses fait pratique en gardant un cache de ce qui devrait être sur l'écran de l'utilisateur et l'envoi d'un proche nombre optimal de déplacer et d'effacer les commandes entrecoupées de caractères normaux pour l'affichage. Il ne nécessite que le support de terminal une certaine forme de positionnement du curseur.

La vie maudit bibliothèque dans deux formes, et ncurses , par exemple , est bien connu, open source et sous licence GPL.

En principe, vous pouvez adapter ncurses parler à votre contrôleur d'affichage et laissez-le faire tout le travail.

La question ouverte est de savoir s'il vaut la peine. A 9600 bauds, vous pouvez envoyer 960 caractères par seconde. C'est assez rapide pour repeindre complètement une ligne 4 de 20 colonne LCD 12 fois par seconde. Donc, à moins que vous utilisez dans un PIC ou ATtiny où vous pourriez avoir à mettre en œuvre que dans le logiciel UART et besoin des cycles pour réellement faire quelque chose d'utile, il est susceptible d'être peu d'avantage d'être trop intelligent.

Cela dit, il est encore le plus souvent le sens de peindre votre texte une fois fixe et simplement mettre à jour les valeurs affichées comme ils changent.

Mode texte LCD

Je suis d'accord avec les autres, si vous écrivez en mode texte, il n'y a pas vraiment de point de le faire au niveau du caractère. Le temps de traitement nécessaire pour effectuer les calculs seront probablement prendre aussi longtemps que le temps d'écrire réellement les choses.

En outre, un par niveau personnage mâchouiller un peu de mémoire, que vous aurez besoin de tampon ce qui est actuellement affiché (à savoir ce qui a été écrit en dernier).

Vous pouvez simplifier le processus en se divisant l'écran en plusieurs sections (lignes ont tendance à être les plus pratiques) et que les changements quand le signalement en ligne. Ceci est particulièrement utile si vous voulez écrire dans un tampon de mémoire de votre écran, et le synchroniser plus tard (dans une interruption chronométrée par exemple).

Réduction de création

Au lieu de laisser cette place au conducteur pour atteindre, vous pouvez réduire le temps d'écriture au niveau de l'application en vous assurant que les choses écrivez que les changements. Cela pourrait se faire en désignant des cellules de valeur spécifique, faisant essentiellement les éléments suivants:

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)

Et pas:

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)

Mode graphique LCD

D'autre part, si votre processus d'écriture est assez cher, comme le mien (~ 20 octets, le dessin d'un caractère en mode graphique), puis de gagner du temps sur une base de caractères seraient utiles. Il existe deux schémas que vous pouvez utiliser. La première est que vous décrivez, mais vous pourriez aussi à envisager (si vous utilisez le mode graphique), le concept de mise en mémoire tampon une ligne de pixel horizontale à travers la ligne de texte.

écriture de chaque caractère sur une base par caractère exige de déplacer manuellement le curseur d'écriture sur la ligne de pixels, en supposant que le tirant horizontalement, puis de haut en bas. Cette étape pourrait être supprimée en écrivant toutes les premières lignes de tous les caractères sur une ligne de texte, ou encore mieux un sous-ensemble modifié ( « ABC » puis séparément « I » dans « XXXDEFGHX » -> « ABCDEFGHI »).

Bien sûr, l'économie exacte en utilisant la dernière méthode dépendra de combien de lignes de pixels composent la hauteur d'un caractère. Plus de lignes, plus l'économie (parce que vous êtes obligé de déplacer le curseur plusieurs fois).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top