« Very High Speed Integrated Circuit Hardware Description Language/Multitâche et Système temps réel sur architecture 8 bits » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 21 :
 
Voici le code source C et son commentaire qui montre qu'une interruption timer est nécessaire :
<sourcesyntaxhighlight lang="c">
//**********************************************************
// Call from tick timer interrupt routine. Assumes interrupts
Ligne 42 :
}
}
</syntaxhighlight>
</source>
Nous sommes donc prêt à réaliser quelques exemples.
 
Ligne 48 :
La ressource utile pour commencer est donnée maintenant
{{Boîte déroulante|titre=Code C de Ron Kreymborg (1999)|contenu=
<sourcesyntaxhighlight lang="c">
/********************************************************
 
Ligne 330 :
}
}
</syntaxhighlight>
</source>
}}
Prenez ce code et mettez votre interruption et votre "main()" entre les prototypes et déclarations et l'implantation des fonctions. Nous utilisons la version de 1999 du code mais une version plus récente est disponible et est décomposée avec un fichier ".h" pour les prototypes.
Ligne 337 :
Puisque le timer fait un dépassement de capacité (overflow) au rythme de 50 Hz, un appel avec un temps de 25 fera environ 0,5 s.
Voici donc le code :
<sourcesyntaxhighlight lang="c">
#include <avr/io.h>
#include <avr/interrupt.h>
Ligne 415 :
}
// AJOUTER LE RESTE DU NOYAU ICI ....
</syntaxhighlight>
</source>
L'ajout de tâches supplémentaires se ferait avant le for(;;) et nous avons omis l’ensemble des implémentations des fonctions du noyau que nous avons donné comme ressource un peu plus haut.
 
Ligne 425 :
L'écriture ou l'effacement d'un bit particulier peut se faire avec une instruction du genre "PORTC = PORTC | 0x01;". Mais si vous utilisez cette technique avec notre cœur ATMega16, cela ne fonctionnera pas. Nous avons déjà évoqué ce problème plusieurs fois. Il est lié au fait qu'écrire PORTC à droite d'une affectation veut dire qu'on lit le PORTC en question. Cela fonctionne sur une architecture du commerce mais en ce qui nous concerne nous n'avons pas implanté les PORTs comme cela. Pour passer outre ce problème il suffit d’utiliser une variable interne sur laquelle on travaille systématiquement avant de l'affecter au PORT. Regardez dans le code ci-dessous, vous voyez la déclaration de la variable vportc... qui ne sert qu’à cela.
{{Boîte déroulante|titre=Code C de clignotement de deux leds|contenu=
<sourcesyntaxhighlight lang="C">
#include <avr/io.h>
#include <avr/interrupt.h>
Ligne 763 :
}
}
</syntaxhighlight>
</source>
}}
 
Il est possible de séparer la mise à jour du PORT (ici PORTC) du calcul de la valeur des deux bits comme ceci :
<sourcesyntaxhighlight lang="c">
uint8_t vportc;
ISR(TIMER0_OVF_vect) // ISR(_VECTOR(9))
Ligne 818 :
Dispatch();
}
</syntaxhighlight>
</source>
Vous voyez apparaître une tâche supplémentaire "updatePORTC()" qui s'exécute pratiquement sans arrêt (Ne pas mettre "ReRunMe(0)" dans cette tâche de fond, cela bloque les autres tâches).
 
Ligne 843 :
=== Atomthread ===
Les problèmes de portage sont identiques, mais il est plus simple de trouver l'interruption de commutation des tâches. Nous trouvons le code :
<sourcesyntaxhighlight lang="c">
ISR (TIMER1_COMPA_vect)
{
Ligne 855 :
atomIntExit(TRUE);
}
</syntaxhighlight>
</source>
dans "atomport.c" qui nous montre que c’est l'interruption de comparaison du timer1 qui est utilisée. Régler le problème évoqué du flag peut se faire simplement en ajoutant une instruction après "atomIntExit(TRUE);" et avant l'accolade fermante. Mais, rappelons-le, ceci n'est plus nécessaire avec une version du processeur postérieure à Juillet 2015.
 
Ligne 885 :
==== Processeur 1 pour compter et processeur2 pour afficher ====
Voici la partie matérielle sans commentaire :
<sourcesyntaxhighlight lang="VHDL">
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Ligne 929 :
);
end arch;
</syntaxhighlight>
</source>
[[../Travail pratique/Projets pour ATMEL ATTiny861#ANNEXE I : les fichiers nécessaires aux TPs de ce chapitre .28Version pour Spartan 6.29|Aller ici pour trouver le reste du code]].
 
Ligne 964 :
</pre>
* et le scipt pour compiler et charger.
<sourcesyntaxhighlight lang="bash">
#!/bin/bash
#pour spartan6
Ligne 984 :
data2mem -bm attiny_2_S6.bmm -bd Affichage.elf -bt twoProcessors_rp.bit -o uh twoProcessors_rp
djtgcfg prog -d Nexys3 --index 0 --file twoProcessors_rp_rp.bit
</syntaxhighlight>
</source>
Et maintenant le carburant pour les deux processeurs :
* programme pour processeur 1
<sourcesyntaxhighlight lang="C">
//*********** Compteur/Decompteur : CmptPassage.c
#include <avr/io.h>
Ligne 1 018 :
if ((*cnt & 0xF0) == 0xF0) *cnt = 0x99;
}
</syntaxhighlight>
</source>
* Programme pour processeur 2
<sourcesyntaxhighlight lang="C">
//*********** Affichage.c pour processeur 2
#include <avr/io.h>
Ligne 1 039 :
return 0;
}
</syntaxhighlight>
</source>
On voit dans ce code qu’il n'y a aucune synchronisation : le processeur 2 ne fait que lire sans arrêt ce que le processeur 1 lui fourni et l'affiche.