La programmation se fait sur PC sous Windows. Utilisation de la compilation croisée Carte processeur ColdFire 5272, uCLinux
Objectif
C4.6 Assembler les éléments matériels assurant la liaison physique d’un système de Communication
C5.7 Mettre en œuvre un environnement de programmation
Exploiter les commandes console de bases de Linux.
Pré requis
Environnement Linux (uCLinux).
Programmation C, commande de base du Linux
Travail demandé
Suivre le déroulement du TP pas à pas sans sauter d’étapes
Critères d’évaluation
Démonstration au professeur
Compte-rendu papier :
Réponses des exercices fin 1er chapitre
Programme du chenillard (avec démo)
Programme des fonctions en C
But du TP :
Compilation croisée, utiliser le port parallèle (Port B) d’une carte embarquée avec processeur Motorolla ColdFire 5272 ayant comme système d’exploitation uCLinux et apprendre les commandes de base console du système d’exploitation Linux.
Remarques générales :
Sur les GoldFire, la mémoire virtuelle n’existe pas
La carte étant petite, une plateforme matérielle permet l’utilisation facile pour les tests de toutes les E/S (série, parallèle, Ethernet…)
1. Rappel général sur opérateurs logiques ET, OU, XOR et NON:
Les opérateurs logiques en C effectuent les opérations classiques de la logique des prédicats : ET (AND), OU (OR), OU exclusif (XOR) NON (NOT). Grâce à eux, il est possible de relier logiquement des instructions. Il y a quatre opérateurs logiques, trois d'entre eux sont binaires, et l'autre est unaire. Comme avec les opérateurs relationnels, l'évaluation des expressions comportant des opérateurs logiques donne un résultat de type VRAI, FAUX, exprimé en tant que grandeur de type int. Ce résultat peut prendre les valeurs 0 (FAUX) ou 1 (VRAI).
Un entier est estimé VRAI si sa valeur est différente de 0, FAUX si elle vaut 0.
Tables de vérité
OU
ET
OU exclusif
A
B
A+B
A
B
A.B
A
B
A ou Exclusif B
0
0
0
0
0
0
0
0
0
0
1
1
0
1
0
0
1
1
1
0
1
1
0
0
1
0
1
1
1
1
1
1
1
1
1
0
2. Opérateurs logiques en C :
Opérateur
En C
Exemple 1
Retour
Exemple 2
Retour
A ET B
A && B
(3‹5) && (5>2)
Vrai
(3==5) && (5>2)
Faux
A OU B
A||B
(3‹5)||(5>2)
Vrai
(3==5)||(5>2)
Vrai
NON A
!A
!(3>5)
Vrai
!(5>3)
Faux
Utilisation :if((x>3) && (x‹5))/* Vrai quand x compris entre 3 et 5 */
3. Opérateurs logiques bit à bit
Ils permettent une opération logique non plus sur la proposition, mais bit à bit :
Opérateur
En C
Exemple
Retour
A.B
A & B
0xA2 & 0xF0
0xA0
A+B
A|B
0xA2|0x0F
0xAF
A
B
A^B
0xA2^0xFF
0x5D
Complément à 1
~A
~0xA2
0x5D
Utilisation : faire des masque sur des octets
Exemple :
Après lecture d’un port parallèle sur un octet, la valeur se retrouve dans un short x. Nous désirons récupérer des bits déterminés :
short x ; // Ex de la carte ColdFire PCDATA représente Port B du kit x=*PCDATA ; // Affiche la valeur de x par exemple 5, en binaire 00000101 printf("%d",x); // Affiche le bit de poids faible 1 printf("%d",x & 1); // Affiche le bit 2 ==> 0 00000101 & 00000010 printf("%d",x & 2); // Affiche le bit 3 ==> 1 00000101 & 00000100 printf("%d",x & 4);
4. Décalage
Ils permettent les décalage à gauche ou à droite bit à bit
Opérateur
En C
Exemple
Retour
Décalage à droite
A>>B
0xA2>>3
0x14
Décalage à gauche
A‹‹B
0xA2‹‹3
0x10
Exemple d’utilisation :
On lit un port de 16 bits. Seul l’octet de poids fort nous intéresse. Nous faisons alors un décalage à droite de 8 bits
// Lecture du port x=*PCDATA ; // Récupère octet poids fort x=x>>8 ;
2 Partie : prise en main de l’environnement de développement
Pour pouvoir écrire un programme en C à partir d'un PC sous Windows sur la carte embarquée ColdFire, il faut dans un premier temps installer le compilateur de cette carte sur le PC.
Nous utiliserons Visual Studio 2010 pour développer et télécharger le programme.
Vérifier que le compilateur pour la carte ColdFire est bien installé (CodeSourcery). Le programme m68k-… doit être présent dans
C:Program FilesCodeSourcerySourcery G++bin
Vérifier que le PATH dans la variable d’environnement Système Windows est bien présent.
A partir du poste de travail, clic droit propriété/Avancé/Variables d’environnement.
Si nécessaire, modifier le PATH du bas, C:Program FilesCodeSourcerySourcery G++bin doit être présent et remplace le chemin du compilateur du poste local (C:MinGWbin).
Mettre la carte sous tension et connecter la au réseau.
Ouvrir une console Windows.
Vérifier la connexion avec la carte et votre poste. Adresse IP des cartes : 10.15.255.N°Carte.
Ouvrir une session telnet sur la carte (console ou hyperTerminal)
Modifier le .c pour écrire « Bonjour le monde » sur le PC (à partir de Visual)
Compiler
S’il n’y a pas eu d’erreur, dans la fenêtre telnet, aller dans le répertoire /tmp de la carte et lancer l’exécutable (Si le nom n’a pas été modifié : go)
3em Partie : Chenillard
Une fois la prise en main effectuée, écrire un programme qui affiche un chenillard (led allumée l’une après l’autre) sur le port B. Vous vous aiderez du prg suivant :
#include ‹unistd.h>
#include ‹asm/coldfire.h>
#include ‹asm/m5272sim.h>
int main(int argc, char * argv[])
{ int led=0;
int sens=0;
unsigned short sortie=1;
volatile unsigned short * PCDATA = (volatile unsigned short *)
(MCF_MBAR + MCFSIM_PCDAT);
* (volatile unsigned short *)(MCF_MBAR + MCFSIM_PCDDR)=0xFF00;
while(1)
{ usleep(500);
if (sens==0)
{ led++;
if (led>=7)
sens=1;
sortie‹‹=1;
}
else
{ led--;
if (led‹=0)
sens=0;
sortie>>=1;
}
*PCDATA=(unsigned short)(~sortie)‹‹8;
usleep(500);
}
}
Codage en C de fonctions spéciques
Ecrire une fonction qui permet d’allumer/éteindre une led spécifiée en argument sans interférer sur l’état des autres leds du port. void allume(unsigned short N°Led, unsigned short etat, volatile unsigned short * PCDATA);
En utilisant cette fonction, faire clignoter toutes les leds en même temps
Faire un programme qui permet à l'utilisateur de saisir la led qu'il désire et qu'il puisse l'allumer ou l'éteindre à sa guise