Salut à tous.
Voici la description de la méthode que j'aurais utilisé pour faire l'acquisition en temps réel pour l'oscilloscope. Ce texte est l'embryon de ce qui aurait été la documentation de mon projet si je l'avais fini. Ce texte est un moyen de participer au partage des connaissances que le concours nous donne.
Aucun code fonctionnel n'a été écris à ce jour. Cela reste purement théorique à moins qu'un des participants au concours ait utilisé la même méthode.
Comment faire du temps réel dure avec un noyau Linux standardEt oui comment ? Pour cela on va utiliser une particularité du processeur ARM, la FIQ.
Description de la FIQLes Processeurs ARM possèdent 2 entrées d'interruption. L'IRQ (normal interrupt) et la FIQ (Fast Interrupt). Le contrôleur d'interruption qui a pour entrée toutes les interruptions en provenance des différents blocs matériel tel que SPI, ADC, USB, etc route l'interruption en cours vers IRQ ou FIQ de l'ARM en fonction de la configuration choisi pour cette interruption.
La FIQ est une interruption qui est prioritaire sur l'IRQ. De plus la FIQ n'est pas utilisé par Linux sauf par quelques rares drivers.
C'est grâce a ces deux particularités que l'on va pourvoir faire du temps réel dure. Puisque s'il n'y a qu'un seul driver qui utilise la FIQ alors il aura la priorité absolu sur tout le reste du système pour exécuter le code de sa routine d'interruption :)
Avantage de la FIQ :
* priorité de la FIQ sur IRQ.
* les registres R8 à R14 sont sauvegardés dans le contexte de la FIQ. Il est donc possible de les pré-charger avec des valeurs ce qui améliore les performance de la routine de gestion de la FIQ.
* le vecteur d'interruption de la FIQ est le dernier de la table des vecteurs à l'adresse 0x1C. Ce qui permet de mettre le code de la routine directement à l'adresse du vecteur de la FIQ ce qui évite un saut.
Inconvénients de la FIQ :
* Linux ne fournit pas de framework en C pour gérer la fonction FIQ il faut écrire la fonction en assembler.
* impossible d'utiliser les mécanismes de la MMU quand on est dans le contexte de la FIQ. A cause de cela il faut que le code de gestion de la FIQ soit dans le kernel et non dans un module. Et il n'est pas possible d'utiliser de la mémoire alloué par vmalloc. Par contre la mémoire alloué par kmalloc est autorisé.
l'ADC Les 8 entrées analogiques du S3C2440 dont 4 sont dédiés à l'écran tactile sont multiplexées se qui permet de n'utilisé qu'un seul ADC (voir figure 16-1 de la doc du CPU).
L'ADC n'est pas de type à convertion direct. Il utilise un horloge pour échantillonner le signal d'entrée en plusieurs étapes.
L'ADC met 5 périodes de son horloge pour réaliser une acquisition compléte du signal.
Fréquence de l'horloge de l'ADC : 2.5MHz. C'est la fréquence max à laquelle il peut fonctionner.
Cette horloge définit le temps que met l'ADC pour échantillonner un signal. Cela n'a rien à voir avec la fréquence d'échantillonnage du signal de notre signal.
Formule pour calculer la valeur de prescale de l'ADC (déduite de la doc) :
<code>
prescale = pclk / 2.5MHz - 1
</code>
Dans notre cas pclk = 50Mhz ce qui donne une valeur de 19.
Le principeOn utilise le mode normal (sans it) de l'ADC. L'acquisition n'est pas automatique. Il faut la lancer à la main.
Le timer 0 ou 1 est utilisé comme base de temps. Il est configuré pour générer une interruption de type FIQ.
Afin de pouvoir gérer plusieurs entrés analogiques on divise le temps d'acquisition par le nombre d'entrés analogiques. Ce qui nous donne un nombre de n slots de temps qui chacun sera utilisé pour échantillonner une entrées analogique.
Pour les 4 entrées analogique on utilise tout simplement une horloge qui est 4 fois plus rapide que la fréquence à laquelle on veut échantillonner les signaux.
| sample périod | sample périod |
| slot 1 | slot 2 | ... | slot n | slot 1 | slot 2 | ... | slot n |Algorithme de la routine d'interruption :
On lit le résultat de la conversion initié précédemment.
La données lut est stocké dans le buffer du canal correspondant.
On lance l'acquisition suivante sur l'entrée analogique suivante.
Gestion du cas particulier de l'écran tactile.
La gestion de l'écran tactile On rajoute tout simplement un slot de temps soit 5 au lieu de 4. Durant le slot de temps alloué à l'écran tactile on échantillonne X puis au coup suivant Y.
L'écran tactile est de type résistif. L'acquisition ce fait en 2 étapes :
* Acquisition de la coordonnée X. Pour cela on fait la mesure entre YP et XM :
* YP est relié à AVDD
* XM est relié à GND
* Acquisition de la coordonnée Y. Pour cela on fait la mesure entre XP et YM :
* XP est relié à AVDD
* YM est relié à GND
AVDD est la tension d'alimentation de l'écran tactile. GND est la masse.
Attention il faut évité que la fréquence d'échantillonnage soit trop basse sinon le nombre de point remonté par le driver touchscreen va être faible dans le temps ce qui entraîne une mauvaise réactivité de l'écran tactile. Pour résoudre le problème on définit une limite basse de la fréquence d'échantillonnage et on sous échantillonne logiciellement les entrées analogiques A[3:0].
Références *
http://www.riveywood.com/fiqvsirq.html *
http://www.csie.nctu.edu.tw/~wjtsai/EmbeddedSystemDesign/Ch3-1.pdf *
http://fr.wikipedia.org/wiki/%C3%89cran_tactile#Technologie_r.C3.A9sistive_analogique