Syst Embake
Syst Embake
IINFO 741
FI4 IAI
Guillaume Ginolhac
Avec Yajing Yan, Sébastien Monnet, Jean
Jacques Curtelin
Polytech Annecy-Chambéry
Structure du module
• 5*1.5h CM :
• langage C
• systèmes embarqués
• 2*1.5h TD :
• 1.5h TD : programmation langage C
• 1.5h TD : exercices
• 6*4h TP :
• 4 TP Arduino
• 2 TP Rasbperry
• 1 ET
Plan du Cours
I. Introduction au langage C
IV. Entrées/Sorties
V. Arduino
Langage C : structure d’un programme
// librairies int main()
#include<stdio.h> {
#include<stdlib.h> // declarations variables
int vars;
// constantes float var2;
#define PI 3.1415 // saisie
scanf("%f",&var2);
// declarations fonctions
int MaFct(int,float); // appel fonction
vars=MaFct(var1,var2);
// declarations variables globales
int var1=1; // affichage
printf("\n vars : %d",vars);
return(0);
}
// definition fonctions
int MaFct(int a,float b)
{
…
}
Traitement d’un programme
source C
Types de variables
• char (%c) ou unsigned char (%u) : 1 octet ([-128,127] ou [0,255])
• int (%d ou %u), long int (%ld), float (%f), double
(%lf)
• Exemple dans un processeur 32 bits :
- short int : 2 octets
- long int : 4 octets
- float : 4 octets
- double : 8 octets
Note : Il n’existe pas de type Booléen en C (un alias est disponible en Arduino)
• Exemples :
int x;
float x1, x2,
char rep;
• Exemples :
#define MAX 50
int main(){
int tab1[100];
float xtab2[10];
char rep[MAX];
• Portée :
- locale: déclaration variable à l’intérieur d’une
fonction et valable uniquement à l’intérieur
- static : permet à une variable locale de conserver sa
valeur lors d’appels successifs de la fonction
- global : déclaration au dessus du main. Elle est
connue par tous les programmes du fichier
- extern : permet de spécifier que la variable est
déclarée dans un autre fichier
• Qualificateur :
- const : valeur ne doit pas changer
- volatile : peut être modifiée par une source externe
du programme
Opérateurs
• Mathématiques : +, -, *,/,% (modulo)
• Affectation : = (a = 5;)
• Comparaison : ==, !=, >,>=,<,<=
• Logique : &&, ||
Exemple :
rep=(c>=5) && (c<=10) ; // rep égal à 1 si c
compris entre 5 et 10 sinon 0
• Conversion explicite :
new_var=(<type>) <nom_var>;
Exemple :
float x=3.2;
int a=(int)x; // a vaudra alors 3
Manipulations sur les bits
• Manipulations de bits beaucoup utilisées dans les SE car on doit souvent modifier
/ tester un seul bit dans une variable 1/2 octets
- Mettre à 1 le bit 4 de a :
unsigned a = 0x000F; /* 0b 0000 0000 0000 1111 */
unsigned b = 0x0010; /* 0b 0000 0000 0001 0000 */
unsigned a = a | b; /* 0b 0000 0000 0001 1111 soit 0x001F */
- Mettre à 0 le bit 3 de a :
unsigned a = 0x000F; /* 0b 0000 0000 0000 1111 */
unsigned b = 0xFFF7; /* 0b 1111 1111 1111 0111 */
unsigned a = a & b; /* 0b 0000 0000 0000 0111 soit 0x0007 */
• Masques très utiles aussi dans les tests (if ou while) pour tester certains bits d’un
registre
• On utilise aussi souvent << et >> pour décaler des bits à gauche ou à droite.
Exemple : 5<<3
5 = 0b00000101 et donc 5<<3 = 0b00101000 =40 (5*23)
Structures de contrôle
• If : sélection • While : répétition
if (condition) while (condition)
{ {
… …
} }
else ou
{ do
… {
} …
• Switch : sélection multiple }while(condition);
switch (condition) • For : répétition
{ for(i=0;i<ValFinale;i=i+1)
case ?: {
… …
break; }
…
}
px 1AE 4 int x = 4 ;
boolean test;
etudiant f1;
Fonctions et sous programmes
• Fonction : (d1,d2) : entrées (ou données) ; R : sortie (résultat)
type NomFonction(type d1,type d2, …){
type R;
…
return(R);
}
• Sous programme : (d1,d2) : entrées (ou données) ; (R1,R2) : sorties (résultats)
void NomSousProg(type d1,type d2, type *R1,type R2[])
{
*R1 = … ;
}
Exemple :
void echange (int *px,int *py);
int main(){
int a=4,b=3;
echange(&a,&b);
}
void echange (int *px,int *py){
int temp;
temp=*px;
*px=*py;
*py=temp;
}
Bibliothèques : affichage (stdio.h)
• printf(“\n N=%d”,N); :
• Chaine de format pouvant contenir des indicateurs
(%c,%d,%f,%s) (mais pas de tableau d’entiers et de réels)
• Arguments : les variables dont on veut afficher les valeurs et
qui viendront s’afficher à la place de l’indicateur
• Exemple :
• printf(“\n la tempéature est de %f C°”,
temperature);
• Exemple :
• scanf(“%f”, &temperature);
nbnotes : entier
notes : tab[] d’entiers
moyenne Moy : réel
Coder l’algorithme du sous programme et du programme principal dans les deux cas
suivants : la commande return et le passage par adresse
Plan du Cours
I. Introduction au langage C
IV. Entrées/Sorties
V. Arduino
Définition
• Système électronique et informatique autonome
• Interagit avec l’extérieur
• Pas ou peu d’interface utilisateur (systèmes enfouis)
• Spécialisé dans une tâche bien précise
• SOC : System On Chip
– Système complet
– En général SOC = 1 ou + processeur+ROM+ E/S
Motivations : Systèmes Embarqués
• Miniaturisation processeurs
• Dans tous les objets de la vie courante
– Électroménager : cafetière, lave-vaiselle, …
– Consoles de jeux vidéos, photos, télévisions
– Transports : systèmes de navigation aérien et pour voiture (+ de
100 processeurs)
– Outils de communications de l’information : téléphonie
– Santé: implants, aide personnes handicapées, etc.
– Bâtiment : ascenseurs, surveillance, éclairage, accès
– Production : automate, commande d’énergie, stockage, robot
– Spatial : satellites, …
Différences SE / système classique
• Basse consommation.
– exemple : téléphonie, santé, …
• Il faut trouver le bon compromis entre vitesse et
consommation d ’énergie
– Le SE le plus rapide n’est pas obligatoirement = recherché
• Système temps réel (Real Time RT):
– La plupart des SE sont RT, Le système doit réagir dans un
temps déterminé (deadline).
– Les SE sont principalement des RT
– Vitesse liée aux performances RT.
– Certaines applications ont « plusieurs Deadline »
• exemple : Synchronisation dans les applications Multimedia (arrivée
image et son), airbag, ....
Résumé
Un système informatique embarqué
est un système de contrôle-commande
ASIC Mémoire
(application specific Logiciel
integrated circuit)
ou OS
Capteurs Convertisseur CPU Convertisseur Acteurs
A/N N/A
Sauvegarde
et sécurité
du système
Résumé
MEMOIRE
RAM + EEPROM
ADRESSES
μP DONNEES
Processeur
R/W*
... CONTROLE
• ordonnanceur intégré
• driver intégré
- Avantages :
flexibles permettant des évolutions, plus performants qu’un
logiciel, moins chers que des ASICs
- Inconvénients :
Développement long pour des applications compliquées,
gourmands, moins fiables (???)
Exemples de SE
DSP : Digital Signal Processing
- SE conçu pour les applications en Traitement Signal / Images /
Vidéo
- Exemples : Télévision, amplificateur HiFi, Routeurs,
Radar/Sonar, …
I. Introduction au langage C
IV. Entrées/Sorties
V. Arduino
Principes d’un processeur
• Un processeur exécute des programmes.
• Un programme exprime la solution d’un problème
(décrit par un algo.) par une suite d’instructions.
• Les programmes exécutables et les données traitées
sont stockés (en binaire) en mémoire principale.
La Mémoire Principale
Représentation schématique Mémoire
n°0
n°1
n° …
n° 65535
Représentation schématique Mémoire (suite)
n° 1 1 1 1 . . . 1 1 1 1
Organisation de la mémoire
adresses
Zone de programmes
Zone de données
Organisation de la mémoire – Zone Programmes
Cas des processeurs CISC
debut Instruction n°1
Instruction n°2
Instruction n°3
Instruction n°4
OCTET
Instruction n°1
Instruction n°2
Instruction n°3
entier_court
complexe
OCTET
MEMOIRE
RAM + EEPROM
ADRESSES
μP
Processeur
DONNEES
registres R/W*
= 1 Ordre de lecture CONTROLE
périphériques
.
Accès en Ecriture
MEMOIRE
RAM
ADRESSES
μP
Processeur
DONNEES
registres R/W*
= 0 ordre d’écriture CONTROLE
périphériques
Exemple à Traiter
PC
SP
Bus de données de Y « fils »
SR (bidirectionnel)
IR
MDR
Décodeur AS*
R/W* Sous ensemble
TA* de « fils » du
Horloge Séquenceur
IRQ* bus de contrôle
IACK*
Processeur : horloge
main
PILE
SP
Organisation de la Mémoire
PC CODE adresses
(Program Counter)
DONNEES croissantes
SP PILE
(Stack Pointer)
Exemple sous-programme : diviser
main :
quot = diviser (1234, 56, &rem)
push(1234,54)// parametres fct
SP ← SP – 4 // taille résultat rem
BSR diviser
pop rem // recupere ds un registre rem
SP ← SP + taille parametres
diviser :
push registres internes // sauvegarde
contexte
…
pop registres internes // restitue
contexte
registres internes
• push x : sauvegarde x dans la pile
et décrémente automatiquement SP PC
• pop x : récupère x dans la pile et résultat
incrémente automatiquement SP
paramètres
SP
PROCESSEUR (µP ) Espace adressable
ZONE
R0 des
Rn-1 PROGRAMMES
Bus d’adresses
(unidirectionnel)
ALU ZONE
MAR des
DONNEES
I. Introduction au langage C
IV. Entrées/Sorties
Traitement Informatique
CAN et CNA / Liaison Série / Timer
V. Arduino
Généralités sur les coupleurs d’Entrées/Sorties
MEMOIRE
RAM + EEPROM
ADRESSES
μP DONNEES
Processeur
R/W*
... CONTROLE
RxD TxD.
périphériques
Lecture port d’entrée
MEMOIRE
RAM + EEPROM
ADRESSES
μP
Processeur
DONNEES
registres R/W*
=…?
Port d’Entrée
périphériques
Ecriture sur le port de sortie
MEMOIRE
RAM + EEPROM
ADRESSES
μP
Processeur
DONNEES
registres R/W*
=…?
Port de Sortie
périphériques
Synchronisation des accès E/S
- µC et périph. traitent les données à des cadences très
différentes.
D
D0 O
N
Bus de Données N
DONNEES
E
Dn E
R/W*
E
T
A synchro
T
IRQ*
E/S Programmables : Modèle
Logique C
adresses de CS* O
M
décodage M
A
PERIPH.
A0 N
adresses A1 sélection D
E
D
D0 O
N
Bus de Données N
DONNEES
E
Dn E
R/W*
E
T
A synchro
T
IRQ*
E/S Programmables : Utilisation
Le MODE de FONCTIONNEMENT
écrit par le µP dans le registre de Commande à l’initialisation
(analogie avec une rangée d’interrupteur).
• PARTICULARITES :
L’adresse de cette « variable » (du circuit) est figée.
µP adresses
PERIPH
Reg. d’Entrée
Reg.d’Etat
Exemple : Synchronisation de sortie
µP PERIPH
adresses
Reg. de Sortie
R/W*
V
R. de Sortie Vide
Reg. d’Etat
Annexe : Fonctionnement du µP avec IT
t
Prog IT1
• Remarque :
– sauvegarde et restitution faite implicitement en C mais à faire en assembleur
– en C, mettre une déclaration spéciale pour permettre au compilateur de placer
une instruction de type RTI à la place de RTS (dans le cas d’une fonction
normale)
PROCESSEUR (µP ) Espace adressable
Table des vecteurs
R0
Rn-1 PROGRAMMES
Bus d’adresses
(unidirectionnel) ISR_IRQ i
ALU
MAR ZONE
des
DONNEES
PC Bus de données
SP ZONE
SR IT (bidirectionnel) de la
IR PILE
MDR R*/W
Décodeur
IRQi* ZONE
des
Horloge Séquenceur IACKi* E/S
Rôle des priorités dans un programme avec IT
IT2 IT2
T2
T1 t
Priorité T1 > priorité T2
donc T1 n’est pas
interrompu
t
IT2 IT2
T2
T1 t
Priorité T1 < priorité T2
donc T1 est interrompu
t
Gestion des E/S par Interruption
• But : éviter au µP les boucles d’attente.
Logique
Bus Adresses de
Décodage Data Reg
Processor Status Reg.
im
interrupt mask Bus de Données Command Reg
EI
R/W*
Status Reg
IRQ* it
IACK*
µP PERIPH
adresses R. émission
TxD
Bus de Données
R/W*
EV
IRQ*
IT
R. état
Exemple : synchronisation de sortie
µP PERIPH
adresses R. réception
RxD
Bus de Données
R / W* RP
IRQ*
IT
R. état
Liaison série
Principe liaison série asynchrone
Horloge
D
Données
1 0 0 1
Horloge
Données
1 0 0 1
REMARQUES :
- les horloges de réception et d’émission sont déphasées
- l’horloge de réception est créée par le récepteur lui même
- on choisit D = N Tck avec N > 1 (horloge peu stable)
Mise en Œuvre d’une Liaison Série
• Les données émises sont englobées dans une TRAME
TxD RxD
EMETTEUR RECEPTEUR
TxCLK RxCLK
H
B Horloge récepteur
D 1 1 0 0 1 0 1 0 P A
b0 b1 b2 b3 b4 b5 b6 b7
N.B. après le bit de départ, il y a le bit 0 (pas le bit7)
Question : quelle est la parité choisie dans cet exemple ?
Rôle du bit de parité
•bit 7 = 1 : IT émise
•bit 6 = 1 : erreur de parité
•bit 5 = 1 : erreur de cadence (Overrun)
•bit 4 = 1 : erreur de Trame (Frame)
•bit 3 = 1 : copie de la borne CTS
•bit 2 = 1 : copie de la borne DCD
•bit 1 = 1 : Reg. Emission vide
•bit 0 = 1 : Reg. Réception plein
Questions
Le circuit UART est représenté en informatique par la variable globale uart de
type enregistrement
cntrl de type octet non signé
status de type octet non signé
data_in de type octet non signé
data_out de type octet non signé
fin enregistrement
a) On veut échanger des données de type char car_in et car_out. Comment déclarer ces
variables ?
b) Ecrire en langage C une procédure de service d’IT baptisée isr_in() qui récupère le caractère
reçu par l’UART et le range à car_in.
c) Soit mesure[128] de type tableau d'entier court et nb_mes de type entier court déclarés en
variables globales. Ecrire en langage C la procédure de service d’IT isr_input() qui récupère
le caractère reçu par l’UART et le range à sa place dans le tableau mesure[].
main: …
nb_mes 0
armer les IT de réception
Tantque nb_mes < 128 Faire
// instructions d’une tache (interruptible) à faire
FinTantque
désarmer les IT de réception
CAN / CNA
De l’analogique au numérique
Discrétisation
en temps
Discrétisation
en amplitude
bn-1 bn-1
CN/A CA/N
n bits n bits
VS VE
b0 b0
NE (n bits) VS VE NS (n bits)
Nombre entier tensions Nombre entier
VS = NE q NS = VE/q
CN/A et CA/N unipolaire et bipolaire
0 q 2q 3q NE q (2n - 1)q Vref
fs > 2fc
CAN voie 0
Logique
Bus Adresses de
Décodage Data Reg
voie n-1
RD Status Reg
µP
WR
INT
2
1
0
T 2T 4T (2n-1)T 2nT t
horloge
T 2T 4T (2n-1)T 2nT t
2
1
0
horloge T 2T 4T NT 2n T t
Fonctionnement du compteur TCN
(mode périodique)
Compteur Drapeau REF mis à 1 et compteur remis à zéro
2n-1 IRQ activée si IT armée
Réf N
4
0
Clock T 2T 4T NT t
Illustration du traitement des IT Timer
main: instruction 1
…
…
instruction j
… IT
…
instruction k isr_clk: sauvegarde contexte
… MàJ H,M, S
… IT acquitter l’IT
… restitution contexte
instruction n
retour d’IT
…
…
TIMER et PWM
(« Pulse Width Modulation »)
• Certains TIMERS : mode permettant de générer un signal modulé
en largeur (« PWM ») sur une borne de sortie :
rapport cyclique /T (« Duty cycle ») du signal modifiable.
VM
VM τ/T
T T+ 2T 2T+ t
Création d’un signal PWM (méthode 1)
On a 3 registres contenant respectivement
la valeur pour (Duty), celle pour T et celle du compte courant.
Ref. T
Réf. τ
T T+ 2T
Création d’un signal PWM (méthode 2)
le registre du compte courant est un compteur-décompteur.
T = 2NT TCK avec NT ≤ NMAX 2n-1
= 2 NτTCK /T = Nτ / NT
Ref. T
Réf. τ
t t+ t+T
Exercice : TIMER
TCCR1A et TCCR1B : Registres de mode du
TIMER 1
I. Introduction au langage C
IV. Entrées/Sorties
V. Arduino
Qu’est ce que Arduino ?
• Start-up italienne fondée en 2005
Entrées analogiques :
•6
• lire potentiomètres, capteurs, …
• pas de sortie analogique sauf PWM
(modulation) : exemple sortie numérique 3
Objets à connecter à l’Arduino
Capteurs / actionneurs nus :
• Capteurs de température
• Capteurs de pression
• Capteurs de lumière
• Moteurs pas à pas
• Moteurs à courant continu
• écran LCD
• Relais électrique
• potentiomètre
Fonctions simples :
pinMode() : choisit un port E/S
digitalRead/Write() : lit/écrit
valeur numérique sur un port
analogRead/Write() : idem pour
une valeur analogique
delay() : attend une durée