WOW !! MUCH LOVE ! SO WORLD PEACE !
Fond bitcoin pour l'amélioration du site: 1memzGeKS7CB3ECNkzSn2qHwxU6NZoJ8o
  Dogecoin (tips/pourboires): DCLoo9Dd4qECqpMLurdgGnaoqbftj16Nvp


Home | Publier un mémoire | Une page au hasard

 > 

Les systèmes embarqués

( Télécharger le fichier original )
par Ramzi BOULKROUNE
Université de Annaba - Ingénieur d'état en électronique option télécommunication 2009
  

Disponible en mode multipage

Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy

Table des matières

Table des matières

I. Introduction général.................................................................. 4

II. Motivation du choix du thème................................................................ 5

III. Objectif ............................................................................................. 5

Chapitre I : généralités sur les systèmes embarqués

1. Définitions............................................................................................. 7

2. Historique 8

3. Classe des systèmes embarqués.................................................................. 10

4. Caractéristiques des systèmes embarqués.................................................................10

5. Contraintes des systèmes embarqués................................................................ 11

6. Architecture des systèmes embarqués............................................................ 12

1. Les systèmes embarqués de première génération........................... 12

2. Les systèmes embarqués de deuxième génération.............................................13

3. Les systèmes embarqués de troisième génération.............................................14

7. Les systèmes embarqués spécifiques......................................................... 15

Chapitre II : conception des logiciels embarqués

1. Introduction.......................................................................................... 17

2. Les systèmes pour puces 17

3. La conception des systèmes sur puces 20

4. Les systèmes monopuces (SoC)... 22

5. Conception des systèmes embarqués...................................................... 23

1. Flots classiques de conception des SE.......................................... 23

2. Flots de conception récents 25

6. Exemple de flot de conception pour SoC................................................ 26

1. Présentation générale 27

2. Architecture détaillée du flot ...................................................... 31

7. De la compilation au ciblage du logiciel 35

1. Introduction sur la compilation.....................................................................35

2. Le ciblage logiciel en général...................................................... 37

3. Représentations pour le ciblage logiciel 38

4. Le ciblage logiciel pour les architectures spécifiques 41

8. Etat de l'art sur les systèmes d'exploitation OS............................................. 48

1. Introduction sur les systèmes d'exploitation 48

2. Systèmes d'exploitation définitions 48

9. Les systèmes d'exploitation dans les systèmes embarqués....................................... 50

1. Fonctionnalités requises pour le logiciel dans les SE........................... 51

2. Contraintes imposées par les SE pour le logiciel 54

3. Les degrés de liberté pour le logiciel dans les SE 56

4. Exemples de SE généralistes 56

5. Avantages et inconvénients des OS pour les SE 57

10. Conclusion 59

Chapitre III : conception matériel

1. Introduction 61

2. Modéliser et synthétiser à un haut niveau 61

3. Réutilisation de composants matériels 63

1. Composants

virtuels................................................................................. 63

2. Standardisation 64

4. Un exemple d'environnement orienté composante pour la conception

d'architecture numérique.............................................................................. 65

5. L'état de lieux de perspectives de recherche......................................................... 67

6. Architecture matérielle........................................................................... 68

1. Les capteurs 69

2. Les convertisseurs analogiques numériques 70

3. Effecteurs : influent sur l'environnement 72

4. Interface homme machine 73

5. Interfaces associées.................................................................. 73

6. Les

mémoires.................................................................................... 73

7. Circuit logique programmable « FPGA »............................................. 74

8. Unité centrale de traitement « CPU » 74

7. Conclusion 75

Chapitre IV : sécurité des systèmes embarqués

1. Introduction............................................................................................. 77

2. Cryptologie...................................................................................................... 77

1. Introduction.............................................................................. 77

2. Confidentialité................................................................................. 78

3. Intégrité et authentification 78

3. Les menaces de sécurité .................................................................................... 79

1. Types d'attaques (menaces).................................................................. 79

2. Objectifs des attaques............................................................... 79

3. Classement des attaques............................................. 79

4. Contre mesure 82

5. Conclusion................................................................................................ 83

Conclusiongénéral.................................................................. 84

Bibliographie ........................................................................ 85

Glossaire................................................................................................... 86

Table des figures

Table Des Figures

Chapitre I

Figure a : Système de régulation de quantité de vapeur............................................................ 8

Figure b : Le premier système embarqué 9

Figure c : Le système de contrôle aux LGM-30 Minuteman............................................................ 9

Figure I.1 : Un système embarqué dans son environnement................................................... 11

Figure I.2 : Architecture embarquée de première génération ..........................................................12

Figure I.3 : Architecture embarquée de deuxième génération............................................. 13

Figure I.4 : Architecture embarquée de troisième génération.................................... 14

Chapitre II

Figure II.1 : Architecture logicielle/matérielle d'un SoC................................................ 19

Figure II.2 : Les métiers de la conception système ......................................................................20 Figure II.3 : Le flot de conception système................................................................................21 Figure II.4a : Les flots de conception classiques pour les SE..........................................................24 Figure II.4b : codéveloppement pour les SE..............................................................................24 Figure II.5 : Les deux méthodes de cosimulation ...................................................... 26 Figure II.6 : La représentation intermédiaire.............................................................................28

Figure II.7 : Exemple de description pour chaque niveau d'abstraction ......... 29

Figure II.8 : représentation simplifiée du flot de conception pour SoC................................. 30

Figure II.9 : Un module processeur........................................................................................31

Figure II.10 : Le flot de conception générale pour les SoC................................................ 32

Figure II.11 : Génération d'interfaces matérielles et logicielles....................................... 34

Figure II.12 : Enveloppes de simulation.................................................................. 35

Figure II.13 : Les étapes de la compilation d'un programme en langage C........................................37 Figure II.14 : Les étapes du ciblage logiciel..............................................................................40

Figure II.15 : OS en tant qu'abstraction du matériel................................................... 49

Figure II.16 : OS en tant que gestionnaire de ressources ................................................ 50

Figure II.17 : Communication point à point et communication multipoint ........................ 52

Figure II.18 : Files d'attentes FIFO pour désynchroniser deux blocs ................................. 53

Chapitre III

Figure III.1 : Système embarqué typique ..................................................................................68 Figure III.2 : Capteur et transmetteur en situation ......................................................................69 Figure III.3 : Principe de la pesée successive ............................................................................70 Figure III.4: Principe du convertisseur simple rampe ...................................................................71 Figure III.5: Architecture du convertisseur double rampe ......................................................... 71 Figure III.6 : Le convertisseur flash ........................................................................................72 Chapitre IV

Figure IV.1 : Classement des attaques ....................................................................................80
Figure IV.2 : Modèle de menaces ..........................................................................................81
Figure IV.3 : Types de menaces..............................................................................................81

Listes des tableaux

Tableau II.1 : Exemple de description pour chaque niveau d'abstraction...........................................28

Introduction général

I. Introduction général :

Un système embarqué est un système électronique et informatique autonome ne possédant pas des entrées/sorties standards comme un clavier ou un écran d'ordinateur. Il est piloté dans la majorité des cas par un logiciel, qui est complètement intégré au système qu'il contrôle. On peut aussi définir un système embarqué comme un système électronique soumis à diverses contraintes. Les concepteurs des systèmes électroniques sont aujourd'hui confrontés à la complexité croissante des algorithmes mis en oeuvre et à la variété des cibles potentielles FPGAs et/ou DSPs. Actuellement, il n'est pas rare que ces systèmes intègrent plusieurs douzaines voire des centaines de processeurs. A l'origine, ce sont des systèmes matériels et logiciels intégrés dans des avions militaires ou des missiles. Ensuite dans le civil: avions, voitures, machine à laver...! La machine et le logiciel sont intimement liés et noyés dans le matériel et ne sont pas aussi facilement discernables comme dans un environnement de travail classique de type PC. On mentionne les contraintes physiques fortes: dimensions, poids, taille, autonomie, consommation, fiabilité, contraintes temporelles (temps réels).

Le premier chapitre est une introduction générale à ce domaine pluridisciplinaire. Après en avoir posé les grands principes avec des généralités, en effet, l'électronique se trouve maintenant embarquée dans de très nombreux objets usuels : les téléphones, les agendas électroniques, les voitures. Ce sont ces systèmes électroniques enfouis dans les objets usuels.

Le deuxième chapitre est consacré à la conception des logiciels embarqués, les habitudes de programmation pour les ordinateurs portent à croire que la compilation et l'édition de liens sont les seuls traitements à apporter au logiciel pour pouvoir le faire fonctionner sur une architecture cible. Le but de ce chapitre est de montrer que dans le cas des systèmes embarqués, une autre étape est nécessaire avant la compilation : elle adapte le logiciel à l'architecture cible spécifique et sera nommée dans ce mémoire le ciblage logiciel.

Dans le troisième chapitre, nous nous intéresserons aux bases de conception matérielle. En effet, les systèmes à base de composants apparaissent bien dans une architecture matérielle qui est vue comme l'interconnexion sur une carte (PCB pour Printed Circuit Board) de composants sur étagère vendus dans des boîtiers séparés. Ces composants sont vus comme des boîtes noires auxquelles les constructeurs associent des documents (datasheets, notes d'application), pour en préciser les fonctionnalités, les interfaces et les contraintes d'utilisation. Une même carte regroupe généralement un processeur, de la mémoire, des périphériques de taille modeste et des circuits logiques. Ces derniers sont combinés soit pour construire des circuits plus complexes, soit sous forme de «glu» pour adapter les interfaces entre composants.

Le quatrième chapitre traite des problèmes sur la sécurité des systèmes embarqués. On cite notamment : La cryptologie qui est la science du secret, elle se divise en deux branches : La cryptographie : qui étudie les différentes possibilités de cacher, protéger ou contrôler l'authenticité d'une information; La cryptanalyse : qui étudie les moyens de retrouver cette information à partir du texte chiffré (de l'information cachée) sans connaître les clés ayant servi à protéger celle-ci, c'est en quelque sorte l'analyse des méthodes cryptographiques.

Le besoin des entreprises internationales installées en Algérie, dans les nouvelles technologies de l'information et de la communication, et spécialement dans le domaine de conception des systèmes embarqués, c'est dans ce contexte qu'on a étudié ce thème qui a pour but le transfert de compétence dans le domaine des systèmes embarqués. Internationalement, Les multiprocesseurs sur monopuce paraient être une voie prometteuse, ils introduisent de nouvelles contraintes et de nouveau défis à soulever, due essentiellement à leurs natures multi-coeurs.

Motivation et Objectif

Motivation :

Les systèmes embarqués prennent une place de plus en plus importante dans notre société, ils servent à contrôler, réguler des dispositifs électroniques grâce à des capteurs, embarqués dans des robots, des véhicules spatiaux, etc. Ces systèmes embarqués sont souvent utilisés par le public dans la vie de tous les jours sans même qu'on ne s'en rende compte, par exemple dans les systèmes de freinage d'une voiture, le contrôle de vol d'un avion,... Et grâce a cette importance des systèmes embarqués on a choisis ce thème la.

IV. Objectif :

Notre but principal est la conception des systèmes embarqués en général par l'étude des points suivants :

- Bien connaitre les systèmes embarqués.

- Les flots de conception existant des systèmes embarqués.

- Les systèmes d'exploitation dédiés aux systèmes embarqués. - L'architecture matérielle des systèmes embarqués.

- La sécurité des systèmes embarqués.

Chapitre I

Généralités sur les systèmes

embarqués

Chapitre I généralités sur les systèmes embarqués

I.1. DEFINITIONS :

Définition 1 :

Les systèmes électroniques sont de plus en plus présents dans la vie courante. Les ordinateurs et micro-ordinateurs sont des systèmes électroniques bien connus. Mais l'électronique se trouve maintenant embarquée dans de très nombreux objets usuels : les téléphones, les agendas électroniques, les voitures. Ce sont ces systèmes électroniques enfouis dans les objets usuels qui sont appelés systèmes embarqués.

Définition 2 :

« Embedded system » tout système conçu pour résoudre un problème ou une tache spécifique mais n'est pas un ordinateur d'usage général.

-Utilisent généralement un microprocesseur combiné avec d'autres matériels et logiciel pour résoudre un problème de calcul spécifique.

-Système électronique et informatique autonome ne possédant pas des entrées-sorties standards.

-le système matériel et l'application sont intimement liés et noyés dans le matériel et ne sont discernables comme dans un environnement de travail classique de type PC.

Définition 3 :

N'est pas visible en tant que tel, mais est intégré dans un équipement doté d'une autre fonction ; ou dit aussi que le système est enfoui, ce qui traduit plus fidèlement le terme anglais « Embedded ».

-Une faible barrière existe entre les systèmes embarqués et les systèmes temps réel (un logiciel embarqué n'a pas forcément de contraintes temps réel).

-La conception des ces systèmes est fiable (avions, système de freinage ABS) à cause de leur utilisations dans des domaines à fortes contraintes mais également parce que l'accès au logiciel est souvent difficile une fois le système fabriqué.

Définition 4 :

Les microprocesseurs s'étendent depuis de simples microcontrôleurs 8bits aux 64bit le plus rapidement et les plus sophistiqués.

-le logiciel système inclus s'étend d'un petit directeur à un grand logiciel d'exploitation en temps réel (RTOS) avec une interface utilisateur graphique (GUI). Typiquement, le logiciel système inclus doit répondre aux événements d'une manière déterministe et devrait toujours être opérationnel.

Les systèmes embarqués couvrent aussi bien les commandes de navigation et de commande de trafic aérien qu'un simple agenda électronique de poche.

I.2. HISTORIQUE :

La plupart des machines qui nous simplifient la vie ont besoin d'un système de régulation ou de contrôle pour fonctionner de manière correcte.

Ces systèmes de contrôle existent depuis bien avant l'invention des ordinateurs. Exemple :

Pour maintenir une locomotive à vapeur à une vitesse constante, on a besoin d'un système qui régule la quantité de vapeur envoyée dans les pistons.

Si la locomotive ralentit (pente montante...) il faut injecter plus de vapeur, si la locomotive accélère, il faut injecter moins de vapeur On aimerait que cette tâche se fasse de façon «automatique», c'est-à dire avec un minimum d'intervention de l'être humain.

Solution : le gouverneur à force centrifuge

valve valve

d'admission d'adminission

de vapeur de vapeur

axe relié aux roues rotation rapide fermeture

Figure a : Système de régulation de quantité de vapeur

Ces systèmes de contrôle peuvent donc être réalisés de manière forte simple. Avec le développement de la technologie, on a opté pour des systèmes basés sur l'électronique.

Parallèlement à ce développement des systèmes de contrôle, les systèmes informatiques se sont développés. Ceux-ci sont vite sortis du cadre des «machines de bureau» ou de «machine à calculer» dans lequel ils avaient initialement été développés, (Ordinateur = machine à traiter l'information).

Il est donc naturel d'utiliser les possibilités de calcul de l'ordinateur comme composant d'un système plus large. Pour remplacer un système de régulation analogique, et pour réaliser un traitement qui serait trop complexe / impossible en analogique...

Les Avantages:

· plus grande flexibilité des systèmes informatiques.

· On peut modifier le programme.

· On peut réutiliser plus facilement ce qui existe déjà.

· plus de puissance de calcul.

· plus compact.

Sys. Contrôle Informatique

Systèmes embarqués

Un des premiers exemples de système embarqué date du début des années 1960. Il s'agit de l'ordinateur de bord des vaisseaux spatiaux du programme Apollo, qui a amené N. Armstrong sur la lune. Cet ordinateur contrôlait en temps réel les paramètres de vol et adaptait la trajectoire. Il fonctionnait en mode interactif.

 

Interface utilisateur

Pas de CPU: plus de 4000 circuits intégrés contenant chacun 3 portes NOR 32 Ko de RAM

72 Ko de ROM 2MHz

Programme en assembleur (11 instructions)

Figure b : Le premier système embarqué

Le premier système embarqué qui a été produit en série est vraisemblablement le D-17 d'Autonetics. Il servait de système de contrôle aux missiles nucléaires américains LGM-30 Minuteman, produit à partir de 1962.

Disque dur

Figure c : Le système de contrôle aux LGM-30 Minuteman Le disque était utilisé comme mémoire primaire !

Depuis les systèmes se sont diversifiés, ils ont permis l'explosion du marché des «consumer electronics» où tout est (devenu) numérique (GSM, électroménager, MP3s, etc.). Ils sont également bien présents dans le domaine industriel pour Contrôle de processus de production, etc.

La convergence entre les applications électroniques pour grand public et les ordinateurs est de plus en plus grande : La console de jeu XBox de Microsoft n'est qu'un PC «emballé» sous la forme d'une console. Il est de plus en facile de transformer son PC de bureau en «media center» qui remplace la chaîne hi-fi et le lecteur DVD...

Brève histoire des systèmes embarqués :

1967 : Apollo Guidance Computer, premier système embarqué. Environ un millier de circuits intégrés identiques (portes NAND).

1960-1970 : Missile Minuteman, guidé par des circuits intégrés.

1971 : Intel produit le 4004, premier microprocesseur, à la demande de Busicom. Premier circuit générique, personnalisable par logiciel.

Chapitre I généralités sur les systèmes embarqués

1972 : lancement de l'Intel 8008, premier microprocesseur 8 bits (48 instructions, 800kHz).

1974 : lancement du 8080, premier microprocesseur largement diffusé. 8 bits, (64KB d'espace adressable, 2MHz - 3MHz).

1978 : création du Z80, processeur 8 bits.

1979 : création du MC68000, processeur 16/32 bits.

I.3.Classes des systèmes embarqués : > Calcul normal (limite de matériels) - Application similaire à une application de bureau mais empaquetée dans un système embarqué.

- Les jeux de vidéo, set- top box, et TV Box. > Les systèmes de contrôle

- Contrôle de systèmes en Temps Réel.

- Moteur d'automobile, traitement chimique, traitement nucléaire, système de navigation aérien.

> Traitement de signal

- Calcul sur de grosses quantités de données.

- Le radar et sonar, le dispositif de compression vidéo.

> Télécommunications & Réseau

- Transmission d'information et commutation. - Téléphone portable, Dispositifs de l'Internet.

I.4.Caractéristiques des systèmes embarqués :

La principale caractéristique d'un système embarqué est qu'il est conçu pour gérer quelques tâches simples, mais les étapes de la manipulation ou de l'accomplissement de cette tâche mai être aussi complexe que tout programme d'ordinateur. Un contrôleur de jeux vidéo, par exemple, mai être considérés comme ayant des tâches simples, charge le jeu et permettre au joueur de contrôler par le biais de commandes entrées par l'intermédiaire du combiné. En vérité, cependant, un contrôleur de jeu (surtout les nouveaux jeux conçus pour la X-Box ou PS3) passe par une série de mesures et d'actions qui nécessitent le plus de puissance de traitement comme un ordinateur. Parmi les caractéristiques de modernes systèmes embarqués sont:

Interface utilisateur

L'origine, un système intégré n'a pas d'interface utilisateur, l'information et des programmes ont déjà été intégrés dans le système (par exemple, le système de guidage d'un missile balistique intercontinental ou ICBM) et il n'y avait pas de nécessité d'intervention humaine ou de l'intervention, sauf pour installer le dispositif de test.

De nombreux systèmes embarqués modernes ont toutefois à grande échelle des interfaces utilisateur bien que ce ne sont que des entrées de données, mais ne sont pas censés fournir des fonctionnalités supplémentaires pour le système, par exemple, un clavier QWERTY pour PDA utilisé pour saisir des noms, adresses, numéros de téléphone et des notes et même le plein la taille des

documents. Le moment PDA ordinateur de bureau, atteindre le plein de fonctionnalités, mais ils mai ne sera plus considéré comme les systèmes embarqués.

Simple Système Limité, qui provient de la fonctionnalitéL'origine, cette référence à des systèmes de base tels que les interrupteurs, les petits

caractères ou des chiffres et les voyants affiche uniquement pour but de montrer la «santé» du système embarqué, mais il a également atteint un certain niveau de complexité. Une caisse enregistreuse ou d'un guichet automatique avec la technologie d'écran tactile est considéré comme un système intégré, car il a des usages limités, même si l'interface utilisateur (l'écran tactile) est un système complexe.

CPU avec les plates-formes microprocesseurs ou de microcontrôleurs

Encore une fois, la fonctionnalité limitée est la clé dans la définition de ce que les systèmes embarqués. Dans un sens, le BIOS est considéré comme un système intégré, car il a des fonctions limitées, et fonctionne automatiquement (quand l'ordinateur est démarré). Périphériques comme l'USB peuvent aussi être considérées comme des systèmes embarqués.

Les systèmes embarqués ont pour but de permettre aux objets usuels de réagir à l'environnement. Ils peuvent aussi apporter une interface avec l'utilisateur. La structure de base de ces systèmes est donnée figure I.1 : l'environnement est mesuré par divers capteurs. L'information des capteurs est échantillonnée pour être traitée par le coeur du système embarqué. Puis le résultat du traitement est converti en signaux analogiques qui génèrent les actions sur l'environnement (afficheur d'informations pour l'utilisateur, actionneurs, transmission d'information, etc.).

Capteur
Capteur
Capteur

C
A
N

Environnement
Système embarqué

Coeur du
système
embarqué

C
N
A

Afficheur

Actionneurs

etc.

Figure I.1 : Un système embarqué dans son environnement I.5. Les contraintes des systèmes embarqués :

Les systèmes embarqués exécutent des tâches prédéfinies et ont un cahier des charges contraignant à remplir, qui peut être d'ordre :

De coût. Le prix de revient doit être le plus faible possible surtout s'il est produit en grande

série.

Chapitre I généralités sur les systèmes embarqués

D'espace compté, ayant un espace mémoire limité de l'ordre de quelques Mo maximum. Il convient de concevoir des systèmes embarqués qui répondent au besoin au plus juste pour éviter un surcoût.

De puissance de calcul. Il convient d'avoir la puissance de calcul juste nécessaire pour répondre aux besoins et aux contraintes temporelles. Les processeurs utilisés dans les systèmes embarqués sont 2 à 3 décades moins puissantes qu'un processeur d'un ordinateur PC.

De consommation énergétique la plus faible possible, due à l'utilisation de batteries et/ou, de panneaux solaires voir de pile à combustible pour certain prototypes.

Temporel, dont les temps d'exécution et l'échéance temporel d'une tâches est déterminé (les délais sont connus ou bornés a priori). Cette dernière contrainte fait que généralement de tels systèmes ont des propriétés temps réel.

De sécurité et de sûreté de fonctionnement. Car s'il arrive que certains de ces systèmes embarqués subissent une défaillance, ils mettent des vies humaines en danger ou mettent en périls des investissements importants. Ils sont alors dits « critiques » et ne doivent jamais faillir. Par « jamais faillir », il faut comprendre toujours donner des résultats juste, pertinents et ce dans les délais attendus par les utilisateurs (machines et/ou humains) desdits résultats.

I.6. Architecture des systèmes embarqués :

Dans cette section, nous présentons les architectures supportées par trois générations d'outils de conception.

I.6.1. Les systèmes embarqués de première génération :

I.6.1.1. Partie matérielle des systèmes embarqués de première génération :

Les premiers systèmes embarqués supportés par des outils tels que COSYMA et Vulcan étaient très simples : ils étaient constitués d'un processeur qui contrôlait un nombre restreint de CIAS (circuits intégrés à applications spécifiques) ou ASIC qui étaient appelés périphériques. Cette architecture est représentée figure I.2. Les communications de cette architecture se situent au niveau du bus du processeur et sont type maître/esclave : le processeur est le maître et les périphériques sont les esclaves.

Système embarqué

Processeur

Périphérique
d'entrée

Mémoire

Bus du processeur

Périphérique
de sortie

Environnement

Figure I.2 : Architecture embarquée de première génération

Les périphériques de ces architectures étaient essentiellement des capteurs et des actionneurs (contrôleurs magnétiques, sortie, etc.). Le processeur est dédié au calcul et au contrôle de l'ensemble du système.

Les microcontrôleurs assemblent sur une même puce le processeur et les périphériques.

I.6.1.2. Partie logicielle des systèmes embarqués de première génération :

Ne devant pas exécuter de nombreuses opérations simultanées (le nombre de périphériques et de fonctions étant restreint), les parties logicielles étaient constituées d'un seul programme. La réaction aux événements était effectuée par le biais de routines de traitement d'interruptions.

Cette partie logicielle était décrite directement en langage d'assemblage ce qui permettait d'obtenir un code efficace et de petite taille.

I.6.2. Les systèmes embarqués de deuxième génération :

Les premiers systèmes embarqués ne pouvaient fournir que des fonctions simples ne requérant que peu de puissance de calcul. Leur architecture ne peut pas supporter les fonctionnalités requises pour les systèmes embarqués actuels à qui il est demandé non seulement d'effectuer du contrôle, mais aussi des calculs complexes tels que ceux requis pour le traitement numérique du signal. De nouveaux outils tels que N2C (dans ces nouvelles versions) permettent de traiter des architectures plus complexes.

I.6.2.1. Partie matérielle des systèmes embarqués de deuxième génération :

L'architecture des systèmes embarqués de deuxième génération est composée d'un processeur central, de nombreux périphériques, et souvent de quelques processeurs annexes contrôlés par le processeur central. Le processeur central est dédié au contrôle de l'ensemble du système. Les processeurs annexes sont utilisés pour les calculs ; il s'agit souvent de processeurs spécialisés comme les DSP. Une telle architecture est représentée figure I.3. Dans une telle architecture, plusieurs bus de communication peuvent être nécessaires : chaque processeur dispose de son bus de communication.

Système embarqué

Processeur central

Périphériques d'entrée

Mémoire centrale

Bus annexe

Pont

Périphériques de sortie

Bus du processeur central

Mémoire annexe

Autres
périphériques

Processeur annexe

Environnement

Figure I.3 : Architecture embarquée de deuxième génération

Chapitre I généralités sur les systèmes embarqués

I.6.2.2. Partie logicielle des systèmes embarqués de deuxième génération :

La partie logicielle des systèmes embarqués de deuxième génération est répartie sur plusieurs processeurs (le processeur principal et les processeurs annexes). Les systèmes actuels sont trop complexes pour pouvoir être gérés par un unique programme sur le processeur principal. Il est donc nécessaire d'avoir une gestion multitâche sur ce processeur, et un système d'exploitation est couramment employé dans ce but.

Le logiciel du processeur central est souvent décrit dans un langage de haut niveau tel que le C. le logiciel des processeurs annexes est souvent trop spécifique pour être entièrement décrit dans un langage de haut niveau, et l'utilisation des langages d'assemblage est nécessaire.

I.6.3. Les systèmes embarqués de troisième génération :

Les progrès de l'intégration permettent d'envisager des circuits pouvant contenir plusieurs milliers de portes. Il devient donc techniquement possible de fabriquer des systèmes embarqués pouvant remplir toutes les fonctionnalités souhaitées.

I.6.3.1. Parties matérielles des systèmes embarqués de troisième génération :

Pour pouvoir supporter conjointement les besoins en puissance et en flexibilité, ces architectures comprennent de plus en plus de processeurs, qui peuvent chacun se comporter en maître : l'architecture couramment utilisée, basée sur un processeur central contrôlant le reste du système, n'est donc plus suffisante.

Processeur

ASIC

Processeur

Mémoire

Processeur

Mémoire

ASIC

Processeur

ASIC

Mémoire

Bus

Architecture à base de bus Architecture en barres croisées

ASIC

ASIC

Mémoire

Processeur

Architecture à base de réseau commuté

Mémoire

ASIC

Bus

Processeur

ASIC

Mémoire

ASIC

Processeur

Architecture mixte

Figure I.4 : Architectures embarquées de troisième génération

Alors le goulet d'étranglement était les ressources en calcul, de nos jours il est situé plutôt au niveau des communications. Ce sont elles qui définissent désormais l'architecture, et nos plus les ressources de calcul. La figure I.4 donne des exemples d'architectures centrées sur les communications. Dans cette figure, tous les éléments (processeur, ASIC ou mémoires) sont traités de la même manière. Le premier exemple est basé sur des communications par bus : ce modèle de communication consomme peu de surface, mais risque de devenir un goulet d'étranglement. Le deuxième est basé sur des communications en barres croisées très performantes mais aussi très coûteuses en surface. Le troisième exemple donne une solution intermédiaire, par réseau commuté. Enfin le dernier exemple montre qu'il est possible de mixer plusieurs modèles de communication, et d'apporter de la hiérarchie dans l'architecture.

Autour de ce modèle d'architecture centré sur les communications, se greffent les autres modèles d'architecture : architectures des éléments de calcul et des mémoires. L'architecture des éléments de calcul consiste à définir quels sont les éléments principaux et quels sont leurs périphériques de manière à les grouper dans une architecture locale. L'architecture des mémoires sert à définir quelles sont les mémoires locales à un groupe et quelles sont celles qui seront partagées.

I.6.3.2. Parties logicielles des systèmes embarqués de troisième génération :

Les parties logicielles ont beaucoup gagné en importance dans les systèmes embarqués. Plusieurs systèmes d'exploitation sont parfois nécessaires pour les divers processeurs de l'architecture. De plus, la complexité et la diversité des architectures possibles font qu'il devient de plus en plus nécessaire d'abstraire les tâches logicielles des détails du matériel. Toute cette complexité est donc reportée dans les systèmes d'exploitation, qui deviennent de plus en plus complexes.

Cette complexité logicielle et matérielle entraîne de nombreuses alternatives. En particulier, l'aspect multiprocesseur apporte des alternatives pour les systèmes d'exploitation : il peut y avoir un seul système pour tous les processeurs (solution difficilement applicable lorsque les processeurs sont hétérogènes), ou il peut y avoir un système par processeur (solution qui peut être plus coûteuse).

I.7. Les systèmes embarqués spécifiques :

Lorsqu'un système est utilisé pour une tâche bien précise, il est souvent plus efficace et économe s'il est spécifique à cette fonctionnalité que s'il est général. Les systèmes embarqués sont très souvent utilisés dans ces conditions, et il est donc intéressant qu'ils soient conçus spécifiquement pour les fonctions qu'ils doivent remplir. Notamment, les contraintes citées dans la section précédente ne peuvent souvent être respectées que si le système est conçu dès le départ pour pouvoir les respecter. Il est donc de par sa conception même spécifique.

Le problème qui se pose alors est que, pour chaque nouvelle fonctionnalité, il faudra concevoir un système spécifique différent de ceux déjà existants. Le flot de conception, présenté dans la section II.6 (chapitre II), et dont le travail de ce mémoire fait partie, s'intéresse à ce type de système embarqué, et tout particulièrement aux systèmes sur une puce, présentés dans le chapitre suivante.

Chapitre II

Conception des logiciels

embarqués

Chapitre II conception des logiciels embarqués

II.1.Introduction :

La conjonction de l'évolution des technologies de fabrication des circuits intégrés et de la nature du marché des systèmes électroniques fait que l'on est amené à concevoir des circuits de plus en plus complexes (plusieurs millions) de transistors en un temps de plus en plus court (quelques mois). Ce phénomène a entraîné une métamorphose du processus de conception allant de l'idée au produit.

Durant les dernières décennies, on est passé de la conception de circuits composés de quelques milliers de portes à des systèmes structurés et intégrés comme un réseau sur une même puce. Les puces modernes peuvent contenir plusieurs processeurs, de la mémoire et un réseau de communication complexe. Le principe de la conception reste le même ; il s'agit de générer une réalisation physique sous forme d'une puce en partant d'une spécification système. Par contre, les outils mis en oeuvre et l'organisation du travail durant le processus de conception ont beaucoup évolué. Partant d'une conception complètement manuelle où l'on dessinait les masques du circuit à réaliser sur du papier spécial, on est passé à une conception quasi automatique en partant d'une description du comportement du circuit sous forme d'un programme décrit dans un langage de haut niveau.

Le ciblage de logiciel dans le cas des systèmes embarqués est traité aussi dans ce chapitre. Dans le domaine de la conception de logiciel, de très nombreux travaux ont été et sont effectués sur la compilation de descriptions de haut niveau vers les langages machines (interprétés par les processeurs). Les habitudes de programmation pour les ordinateurs portes à croire que la compilation et l'édition de liens sont les seuls traitements à apporter au logiciel pour pouvoir le faire fonctionner sur une architecture cible. Le but de ce chapitre est de montrer que dans le cas des systèmes embarqués, une autre étape est nécessaire avant la compilation : elle adapte le logiciel à l'architecture cible spécifique et sera nommée dans ce mémoire le ciblage logiciel.

II.2.Les systèmes pour puces :

Les prévisions stratégiques d'ITRS annoncent que 70 % des ASIC comporteront au moins un CPU embarqué à partir de l'année 2005. Ainsi la plupart des ASIC seront des systèmes mono-puces (SoC pour System on Chip en anglais). Cette tendance semble non seulement se confirmer mais se renforcer : les systèmes mono-puces contiendront des réseaux formés de plusieurs processeurs dans le cas d'applications telles que les terminaux mobiles, les Set top box, les processeurs de jeux et les processeurs de réseaux. De plus, ces puces contiendront des éléments non digitaux (par exemple analogique ou RF) et des mécanismes de communication très sophistiqués. Etant donné que tous ces systèmes correspondent à des marchés de masse, ils ont tous été (ou seront) intégrés sur une seul puce afin de réduire les coûts de production. Il est prévu que ces systèmes soient les principaux vecteurs d'orientation de toute l'industrie des semi-conducteurs. Il est donc crucial de maîtriser la conception de tels systèmes tout en respectant les contraintes de mise sur le marché et les objectifs de qualité.

Tous les acteurs dans le domaine des semi-conducteurs travaillent déjà sur des produits intégrant des processeurs multiples (CPU, DSP, ASIC, IP, etc.) et des réseaux de communication complexes (bus hiérarchiques, bus avec protocole TDMA, connexion point à point, structure en anneau et même réseaux de communication par paquets) dans des systèmes monopuces. Certains commencent même à parler de réseaux de composants monopuces (network on chip). Il s'agit

d'assembler des composants standards pour en faire un système comme on le fait pour les cartes. Ainsi, le problème n'est plus tant de concevoir des composants efficaces mais surtout d'obtenir une architecture qui respecte les contraintes de performances et de coûts. Pour les composants, le problème devient plutôt de s'assurer de leur validité avant de les utiliser. Cette évolution fait que le goulet d'étranglement du processus de conception devient maintenant la réalisation du réseau de communication des composants embarqués sur la puce et la validation globale de l'ensemble du système avant sa réalisation. Ainsi, nous sommes déjà passés de l'ASIC au SoC et nous sommes en train de passer au réseau sur puce.

La conception de ces nouveaux systèmes à l'aide de méthodes classiques conduit à des coûts et des délais de réalisation inacceptables. En fait, la conception de ces systèmes induit plusieurs points de cassures qui rendent difficile la mise en échelle des méthodes de conception existantes. Les principaux défis sont les suivants :

1. la conception des systèmes multiprocesseurs monopuces entraînera inévitablement la réutilisation de composants existants qui n'ont pas été conçu spécialement pour être assembler sur la même puce. Il sera donc nécessaire d'utiliser des méthodes d'assemblage de composants hétérogènes ;

2. le concepteur d'un système contenant des processeurs programmables doit obligatoirement fournir, en plus du matériel, une couche logicielle permettant la programmation de haut niveau du circuit. Il sera donc nécessaire d'aider les concepteurs de circuits à concevoir les couches logicielles ;

3. l'assemblage de composants hétérogènes sur une même puce concevoir des architectures dédiées à des applications particulières peut nécessiter des schémas de communication très sophistiqués mettant en oeuvre des parties matérielles, des parties logicielles et des parties non numériques telles que les interfaces de composants optiques ou micromécaniques. La conception de ces interfaces hétérogènes sera vraisemblablement le principal goulet d'étranglement du processus de conception des systèmes multiprocesseurs monopuces ;

4. la complexité des systèmes est telle qu'il devient quasi impossible de les spécifier/valider manuellement à des niveaux bas tels que le RTL où il faut donner/valider des détails au niveau du cycle d'horloge. Des méthodes de conception/validation basées sur des concepts de plus haut niveau sont donc nécessaires. Comme pour le logiciel, des outils de synthèse de haut niveau seront nécessaires pour le matériel. La vérification des composants synthétisés sera obligatoire afin de pouvoir en assurer la qualité.

La grande difficulté sera de maîtriser la complexité lors de la conception de ces réseaux monopuces. Il s'agira de réussir la conception rapide de système monopuces multiprocesseurs, et ce, sous de fortes contraintes de qualité et de temps de conception. La figure II.1 montre l'architecture d'un système monopuces. Cette architecture est structurée en couches en vue de maîtriser la complexité. La partie matérielle est composée de deux couches :

- la couche basse contient les principaux composants utilisés par le système. Il s'agit de composants standard tels que des processeurs (DSP, MCU, IP, mémoires) ;

- la couche de communication matérielle embarquée sur une puce. Il s'agit des dispositifs nécessaires à l'interaction complexe allant du simple pont (bridge en anglais) entre deux processeurs au réseau de communication de paquets. Bien que le réseau de communication lui-même soit

Chapitre II conception des logiciels embarqués

composé d'élément standard, il est souvent nécessaire d'ajouter des couches d'adaptation entre le réseau de communication et les composants de la première couche.

Logiciel spécifique à l'application

API

Services du système d'exploitation
(interruptions, gestion des ressources, entrées/sorties)

Pilotes

Réseau de communication matériel embarqué

CPU, IP, mémoires

(DSP, MCU) (ASIC, COTS)

Compromis
matériel/logiciel

Logiciel

Matériel

Figure II.1. Architecture logicielle/matérielle d'un système mono-puce Le logiciel embarqué est aussi découpé en couches :

- la couche de gestion de ressources permet d'adapter l'application à l'architecture.

Cette couche fournit les fonctions utilitaires nécessaires à l'application qu'il est indispensable de personnaliser pour l'architecture et ce pour des raisons d'efficacité.

Cette couche permet d'isoler l'application de l'architecture. Cette couche est souvent appelé « système d'exploitation » (OS). Les applications embarquées utilisent souvent des structures de données particulières avec des accès non standard (manipulation de champs de bits ou parcours rapides de tableaux) qui ne sont généralement pas fournis par les OS standard. D'autre part, les OS standard sont généralement trop volumineux pour être embarqués. Il sera souvent nécessaire de réaliser des OS spécifiques dédiés aux applications. Le lien avec le matériel se fait via les pilotes d'entrées/sorties et d'autres contrôleurs de bas niveau, qui permettent de contrôler les composants de l'architecture. Le code correspondant à ces pilotes est intimement lié au matériel. Ces pilotes permettent d'isoler le matériel du reste du logiciel ;

- le code de l'application.

Cette représentation en couches des systèmes monopuces permet de séparer la conception des composants logiciels (application) et matériels (composants existants ou dédiés) des couches de communication. Elle permet aussi de définir les différents métiers de conception et la distribution du travail entre les différentes équipes.

La plupart des méthodes de conception actuelles essayent de copier le flot de conception des cartes. Ce dernier sépare la conception en quatre métiers, l'architecture système, la conception des composants matériels, la conception des composants logiciels et l'intégration ou la conception système. Les trois derniers métiers sont montrés dans la figure II.2a. Dans les schémas traditionnels, le travail de l'architecte consistait à tailler des composants matériels sur mesure afin de prévoir les interconnexions de manière efficace et d'obtenir les meilleures performances. Ainsi tout le matériel est taillé sur mesure, les composants et le réseau de communication. Le logiciel étant réalisé à part, le concepteur d'architecture doit juste fournir une couche mince de logiciel permettant d'accéder aux ressources matérielles. Le fait que la grande partie des couches de communication est réalisée par des équipes séparées (logiciel, matériel) peut entraîner des surcoûts dus aux précautions et/ou aux sous-

Conception

Logiciel d'application

du API 1

logiciel

Système d'exploitation sur mesure

 
 

Piotes d'entrées/sorties

2

 

Réseau de communication matériel

 

intégrateur

Conception des composants

3

 
 

système 1. Concepteur du logiciel d'application

2. Concepteur des interfaces logicielles/ Matérielles pour système sur puce Concepteur 3. Concepteur de circuit

de circuit

utilisations. La vérification des différentes parties est aussi réalisée de manière séparée et chaque équipe utilise des programmes de test spécifiques.

Application

API

Système d'exploitation standard

Modèle abstrait de l'architecture

Logiciel de test

Piotes d'entrées/sorties

Réseau de communication matériel

Modèle des composants matériels

Programme de test

Conception des composants

a) Les métiers pour la conception b) Les métiers de la conception

des systèmes sur cartes des systèmes sur puces

Figure II.2 : Les métiers de la conception système

Ce schéma n'est plus applicable à partir d'un certain degré de complexité. Ainsi la conception d'architecture consistera surtout à assembler des composants existants en vue de respecter des contraintes de performances et de coûts au niveau du système global et non plus au niveau du seul composant. Ainsi, il devient crucial de combiner la conception des couches de communication logicielles et matérielles. Cette évolution permettra la séparation totale entre la conception des couches de communication et les composants matériels et logiciels. Une telle séparation est nécessaire pour introduire un peu de flexibilité et de modularité dans l'architecture en permettant de charger plus facilement les modules de base. Ainsi, l'abstraction des interfaces de communication devient le pivot de la conception des systèmes monopuces.

C'est cette abstraction qui va permettre la conception de circuits à partir d'un modèle supérieur au niveau RTL utilisé aujourd'hui. Le fait de pouvoir décrire l'architecture globale du système et d'abstraire la communication entre les composants doit permettre de mieux finaliser les interfaces entre les différentes couches à l'aide de procédure d'interface (API pour Application Procédure Interface) de haut niveau. Ainsi on pourra décrire le matériel au niveau comportemental et le logiciel à un haut niveau ; bien entendu, le but étant de pouvoir simuler globalement le système à partir de ce modèle abstrait et de permettre la génération automatique de codes logiciel et matériel. C'est ce schéma (présenté figure II.2b) qu'essaient d'atteindre les nouvelles recherches dans le domaine de la conception système.

II.3. La conception des systèmes sur puces :

Le flot de conception est généralement découpé en deux parties, la partie frontale et la partie dorsale du flot (en anglais ces parties sont appelées front-end et back-end). La première partie consiste à raffiner les spécifications initiales pour produire une réalisation de haut niveau. La partie dorsale du flot réalise les étapes de conception de bas niveau pour aller à la puce. Le point de

Chapitre II conception des logiciels embarqués

rencontre constitue un contrat (en anglais sign-off) permettant de sous-traiter la partie dorsale du flot. Au cours des années, la réalisation de haut niveau faisant l'objet du contrat à évolué du simple dessin des masques aux modèles de portes et est en passe d'atteindre le niveau transfert de registre. Il est prévu que cette évolution continue pour atteindre le niveau micro-architecture puis le niveau architecture de système contenant à la fois les parties matérielles (composants et interconnexions) et les parties logicielles (programmes d'applications et systèmes d'exploitation).

La partie frontale du flot part d'une spécification système qui permet de fixer les principales contraintes du produit à réaliser. Ce modèle sera aussi utilisé pour l'exploration d'architecture afin de fixer la solution architecturale qui sera réalisée. Suit alors la conception de cette solution. Cette étape comporte trois types d'actions ; la conception des composants logiciels, la conception des composants matériels et la conception des interfaces logicielles/matérielles.

Le résultat de cette partie est actuellement une micro-architecture de l'ensemble du système. Les parties matérielles sont détaillées au niveau transfert de registre (description au niveau du cycle d'horloge). Dans le cas où le système contient des parties logicielles exécutées sur un ou plusieurs processeurs embarqués, elles sont décrites au niveau de l'instruction (assembleur)

La partie dorsale comprend la conception des parties matérielles en passant par la conception logique et la conception physique. La figure II.3 montre une vue simplifiée de ce flot. Les rectangles désignent des modèles de description et les ovales des outils.

Verification, validation (tome!)

Architecture

Code assembleur

Raffinement du Raffinement de la Synthèse

Logiciel (tome3) communication (tome3) comportementale

(tome1)

Spécification des parties logicielles

Exploration d'architecture
(tome1)

Produit (niveau physique)

Spécification système

Conception physique
(tome2)

Interconnexion

Conception logique
(tome2)

Micro-architecture

Ports logiques

Spécification des
parties matérielles

Test (Tome2)

Figure II.3 : le flot de conception système

Ce flot considère cinq niveaux d'abstraction : le niveau système, le niveau architecture et le niveau microarchitecture, le niveau porte et le niveau physique. Au niveau système le circuit est spécifié au niveau des transactions entre les éléments de calcul : un ensemble de modules hiérarchiques et de processus communiquant par protocoles de communication de haut niveau par l'intermédiaire de canaux abstraits. Un canal peut cacher des protocoles de communication de haut niveau et des primitives de communication qui manipulent des types de données abstrait. A ce niveau, les modules peuvent être décrits en utilisant différents langages et/ou en utilisant différents niveaux d'abstraction. La cosimulation est utilisée pour valider la fonctionnalité du système. Ce modèle peut être utilisé pour explorer l'espace des solutions architecturales et fixer les grandes lignes de l'architecture. Cette étape est généralement réalisée à l'aide d'outils de simulation et d'estimation de performances.

Le deuxième niveau d'abstraction représente une architecture abstraite qu'on appelle macroarchitecture, ce modèle est composé d'un ensemble de modules reliés ensemble par des fils logiques. Chaque module représente un processeur dans l'architecture finale. Ceci peut être un processeur logiciel (par exemple : un DSP ou un microcontrôleur exécutant le logiciel), un processeur matériel (un composant spécifique) ou un module existant (mémoire globale, périphérique, contrôleur de bus, etc.). Les fils logiques sont des canaux abstraits qui transfèrent des types de données fixes (par exemple : nombre entier ou flottant) et peuvent cacher des protocoles de bas niveau (par exemple : poignée de main, transfert en mode rafale). Les différents modules peuvent être décrits en utilisant un ou plusieurs langages. La cosimulation peut être utilisée pour valider ce découpage architectural. Cette macroarchitecture peut être utilisée par différentes équipes pour réaliser les composants matériels, les composants logiciels et l'intégration des différents composants. Le résultat de ce flot est une macroarchitecture du système décrite au niveau transfert de registre. Ce modèle contient tout les détails de la communication entre les composants. Les couches de communication logicielles peuvent comporter un système d'exploitation spécifique (OS). Les couches de communication matérielles comportent les bus et autres dispositifs permettent de router les informations entre les composants. Les blocs matériels sont raffinés au niveau du cycle d'horloge. Finalement, les blocs existants (souvent appelés IP de l'anglais Intellectual Property) sont enveloppés dans des interfaces afin de les adapter aux bus et réseaux de communication utilisés. La connexion entre les différents blocs matériels est faite par les fils physiques qui mettent en application les protocoles choisis. Les composants logiciels communiquent entre eux et avec l'extérieur via des appels système à l'OS.

Le niveau porte détaille le système au niveau des délais élémentaires des transferts entre les portes de base. Finalement, le niveau physique représente les dessins des masques.

II.4. Les systèmes monopuces :

Les progrès réalisés par les fondeurs de circuits permettent maintenant d'envisager l'intégration sur une même puce d'un système embarqué complet. Ces systèmes monopuces (SoC : system on chip) apportent des changements importants dans les flots de conception classique.

Dans les systèmes électroniques classiques, les grandes dimensions des cartes électroniques entraînaient des problèmes électriques. Ils limitaient notamment la vitesse de communication. Cela pouvait conduire à des communications lentes entre des composants potentiellement très rapides. C'était particulièrement critique pour la communication entre le processeur et la mémoire : quelle

Chapitre II conception des logiciels embarqués

que soit la vitesse du processeur, il devait aller lire ses instructions en mémoire. Pour pallier à ces problèmes, il était nécessaire d'utiliser des caches. L'inconvénient des caches est dû à la très grande complexité d'étude de leur système. Ils induisent en plus de gros facteurs d'indéterminisme. Avec les systèmes monopuces, la communication reste toujours un goulet d'étranglement, car elle est très consommatrice de surface, mais avec un facteur bien moindre. En effet le fait d'avoir sur la même puce l'ensemble du système raccourcit les chemins de communication et facilite la construction d'architecture s'accordant aux localités de calcul de l'application. Ces facilités permettent ainsi souvent de s'affranchir des caches. Les systèmes monopuces sont aussi moins encombrants et surtout, ils peuvent consommer moins : en effet les données doivent transiter par des chemins beaucoup moins longs, l'énergie nécessaire à cette transmission est donc plus faible.

Les systèmes monopuces apportent aussi des changements dans les habitudes de conception. Notamment, la frontière entre le logiciel et le matériel n'est plus aussi nette : en effet avec les anciens systèmes le matériel était déjà conçu lorsqu'il fallait concevoir le logiciel. Avec les systèmes monopuces, les deux doivent être conçus en même temps. Cela augmente la complexité de la conception, mais cela offre aussi plus de liberté : chaque partie peut être réalisée en logiciel, en matériel, ou de manière mixte.

II.5. Conception des systèmes embarqués :

Les systèmes embarqués de première génération étaient suffisamment simples pour que leur conception ne requière pas de méthodologie particulière : quelques essais-erreurs pouvaient suffire pour satisfaire aux contraintes. Avec la seconde génération, la complexité est devenue trop importante pour que la conception puisse être menée à bien sans méthode. Un premier type de flot de conception a donc été utilisé, inspiré par les flots de conception pour les systèmes généralistes. Ce flot est présenté dans la première section. La troisième génération remet en question ce type de flot, et de nouvelles méthodes émergent. Elles sont présentées dans la section suivante.

II.5.1. Flots classiques de conception des systèmes embarqués : II.5.1.1. Le flot :

Le flot classique de conception des systèmes embarqués est représenté sur les figures II.4a et II.4b. Ce flot part d'une spécification souvent informelle du système. Il distingue immédiatement les parties logicielles des parties matérielles. Ces parties sont développées indépendamment l'une de l'autre par des équipes différentes. A la fin, une équipe d'intégration assemble les parties, ce qui pose souvent des problèmes d'incompatibilité. Cette intégration donne directement un prototype à tester. En cas d'erreur, il peut être nécessaire de recommencer complètement le flot.

Dans un tel flot il peut être difficile de développer complètement le logiciel sans que le matériel soit défini. C'est pour cela que son développement devait souvent attendre que la partie matérielle soit décrite pour être achevé.

Equipe
logicielle

Spécification
logicielle

Conception
logicielle

Prototype
logiciel

Partitionnement
logiciel /matériel

Prototype final

Compte-rendu

Spécification
générale

Sur le matériel

Information

Intégration

TEST

Spécification
matérielle

Conception
matérielle

Prototype
matériel

Equipe
test

Equipe
intégration

Equipe
matériell

Equipe
système

Figure II.4a : Les flots de conception classiques pour les systèmes

Equipe
intégration

Equipe
test

Equipe
matérielle

Equipe architecture

Equipe
système

TEST final

Compte-rendu

Equipe
logicielle

Spécification
logicielle

Conception
logicielle

Prototype
logiciel

Partitionnement
synthèse allocations

Architecture
globale
raffinée/annotée

Intégration

Prototype

Spécification
matérielle

Conception
matérielle

Prototype
matériel

Spécification générale

Définition de
l'architecture

Architecture globale

Figure II.4b : Codéveloppement pour les systèmes embarqués

Chapitre II conception des logiciels embarqués

II.5.1.2. Les limitations du flot classique :

Le flot classique de conception de systèmes embarqués possède de nombreuses faiblesses qui le rendent inadapté pour supporter la complexité des systèmes embarqués de troisième génération.

Tout d'abord, il manque une description globale qui accompagnerait la conception du système (logiciel et matériel) du début à la fin. Cette description permettrait à toutes les équipes de conception de bien connaître l'ensemble du système, ce qui éviterait de nombreuses erreurs. Il devrait également être possible d'effectuer des vérifications du système complet à tous les stades de la conception.

La séparation entre le logiciel et le matériel est effectuée trop tôt dans le flot de conception : au stade où elle est effectuée il n'est souvent pas possible de savoir quelle est la meilleure configuration. A l'inverse, l'intégration des différentes parties est effectuée trop tard dans le flot : il est souvent trop tard pour lever les incompatibilités.

Les faiblesses de ce type de flot font que les temps de développement ne sont plus réalistes pour la conception des systèmes embarqués actuels.

II.5.2. Flots de conception récents :

Si le flot de conception classique pouvait suffire pour les première et deuxième générations de systèmes embarqués, la troisième génération, fortement hétérogène et multimaître, est trop complexe pour que les limitations précédemment énoncées soient acceptable telles que le codéveloppement.

II.5.2.1. Codéveloppement :

Le codéveloppement ou codesing a pour but de développer conjointement les diverses parties d'un système hétérogène (logiciel, électronique, mécanique, etc.). C'est pourquoi une description globale du système est nécessaire.

Deux approches sont possibles pour cette description : la première consiste à décrire toutes les parties dans un langage unique. Ce langage doit alors avoir une sémantique pour chacune des parties. L'avantage est qu'il est plus simple pour les outils et les utilisateurs de gérer un langage unique. L'inconvénient est qu'il est difficile, sinon impossible, de définir un langage qui soit vraiment adapté à toutes les parties du système. La deuxième approche consiste à utiliser plusieurs langages, chacun étant adapté à une partie du système. Un langage de coordination sert à faire le lien entre toutes les descriptions. L'avantage est que, cette fois, il est possible d'avoir le langage optimal pour chaque partie. L'inconvénient est que la gestion de tous ces langages est difficile.

Une partie difficile du codéveloppement est le découpage entre le logiciel et le matériel. De nombreuses heuristiques ont été développées, etc. cependant l'approche manuelle prévaut toujours.

La figure II.4 donne un exemple de flot basé sur le codévloppement en comparaison avec le flot classique : dans le nouveau flot, la séparation entre le logiciel et le matériel est effectuée plus tard, et une nouvelle équipe fait son apparition : l'équipe d'architecture, qui s'occupe du système global et de la coordination entre les équipes.

Le codéveloppement repose aussi sur l'utilisation d'une autre technique permettant la simulation du système aux divers niveaux d'avancement dans la conception. Ces simulations, appelées cosimulations, sont décrites dans la section suivante.

II.5.2.2. Cosimulation :

La cosimulation a pour but de simuler conjointement les diverses parties d'un système hétérogène. Cela permet d'effectuer la validation d'un système complet avant le prototype, mais aussi à divers niveaux d'abstraction.

Il existe deux méthodes pour effectuer cette cosimulation (présentées figure II.5) : la première consiste à traduire les descriptions des diverses parties dans un unique langage pour la simulation. Très souvent, il s'agit d'un langage de programmation tel que le C pour accélérer les simulations. La difficulté est d'être assuré que la traduction et la simulation du langage unique ne changent pas la sémantique des descriptions des diverses parties. La deuxième méthode consiste à conserver les descriptions spécifiques des diverses parties et à exécuter en parallèle les divers simulateurs. Un programme, appelé bus de cosimulation, cette tâche peut s'avérer difficile à effectuer lorsque les modèles de simulation sont différents ; de plus les communications entre les simulateurs peuvent s'avérer coûteuses.

Cosimulation avec description

Cosimulation multilangage

Description
logicielle

Description
matérielle

Description
autre

Description
logicielle

Description
matérielle

Description
autre

Traduction

Simulateur
logiciel

Simulateur
matériel

Simulateur
autre

Description
unique

 
 
 
 
 
 

Simulateur

Bus de cosimulation

Figure II.5 : Les deux méthodes de cosimulation

II.6. Exemple de flot de conception pour systèmes monopuces :

La conception du logiciel est très liée aux autres étapes et modèles utilisés dans le flot de conception. Cette section présente un flot typique qui peut servir d'environnement aux méthodes de conception de logiciel décrites dans ce travail. Le but est de définir une démarche et un ensemble d'outils permettant de faciliter la conception des systèmes monopuces.

L'aide à la conception sera obtenue en élevant le niveau d'abstraction avec lequel les concepteurs travaillent, et en automatisant au maximum les passages aux niveaux d'abstraction inférieurs. Ce flot est centré sur les communications car elles apparaissent comme étant l'épine dorsale de la conception des systèmes monopuces.

Chapitre II conception des logiciels embarqués

II.6.1. Présentation générale :

II.6.1.1. Domaine d'application :

Le flot a pour but d'aider à la conception des systèmes embarqués spécifiques, et notamment les systèmes sur une puce. Les diverses équipes de conception peuvent utiliser conjointement cet outil (voir le paragraphe II.5.2). Mais il est tout particulièrement destiné à l'équipe d'architecture. L'aide consiste d'une part en l'apport d'une représentation multiniveau et multilangage de l'architecture globale. Cette représentation sert de référence pour la conception de toutes les parties du système et aussi pour sa simulation. D'autre part, elle consiste en l'apport d'outils d'automatisation de diverses opérations telles que la génération des interfaces matérielles et logicielles.

Il supporte les architectures hétérogènes multiprocesseur, multimaîtres et multitâches. Dans ce flot, chaque processeur dispose d'un système d'exploitation et d'un jeu de tâches qui lui sont propres. Chaque composant matériel est encapsulé dans une interface qui adapte ses communications locales aux communications globales de l'architecture.

II.6.1.2. Les restrictions :

La conception d'un système embarqué complet commence souvent par une spécification informelle et générale. Il existe des langages tels que UML qui permettent de représenter de manière formelle ce type de spécification, avec un niveau d'abstraction très élevé (le niveau service du paragraphe II.6.1.3). Le flot proposé n'est pas encore capable d'intégrer ce type de spécification : il débute plus bas dans l'abstraction, à un niveau où l'architecture globale est définie (le niveau fonctionnel du paragraphe II.6.1.3).

II.6.1.3. Le modèle de représentation de base :

II.6.1.3.1. La forme intermédiaire utilisée :

Le flot utilise une forme intermédiaire pour décrire la spécification quels que soient les niveaux d'abstraction. Cette forme intermédiaire utilise le langage Colif. Ce langage permet de décrire la structure d'un système, à plusieurs niveaux d'abstraction, et en mettant l'accent sur les communications. Les descriptions comportementales sont supposées issues de la description initiale de l'application.

II.6.1.3.2. Les objets de la description :

Quel que soit le niveau d'abstraction, la description est constituée de modules communicants. Ces modules peuvent représenter des parties matérielles, des parties logicielles ou des éléments de mémorisation. Ils communiquent par l'intermédiaire de ports, au travers de canaux.

Chaque objet (module, port ou canal) est décomposé en une interface et un contenu. Le contenu de chaque objet peut être hiérarchique (c'est-à-dire contenir d'autres objets) ou faire référence à un comportement.

La figure II.6 donne un exemple d'une telle architecture : les modules, les ports et les canaux sont respectivement nommés M, P et C lorsqu'ils sont hiérarchiques et m, p et c lorsqu'ils ne le sont pas.

M1

m1

m2

m3

P1

P2

P3

P4

P7

P8

c6

c7

c1

c2

c3

P5

P6

P9

P10

P1

c5

C1

c4 p2

Figure II.6 : La représentation intermédiaire

Niveau

service

Fonctionnel

Macro-
architecture

Micro-
architecture

comportement

Objets
concurrents

Transactions Partiellement ordonnées

Pas de calcul

cycles

communications

Requêtes / services

Passage de
messages

Transmission de
données
événements

Valeurs de bits

Exemple de
langages

CORBA/UML

SDL

VHDL, systemC

VHDL, systemC

Tableau II.1 : Exemple de description pour chaque niveau d'abstraction II.6.1.3.3. Les niveaux d'abstraction utilisés dans le flot :

Les systèmes est représenté sur quatre niveaux d'abstraction différents : le niveau service, le niveau fonctionnel, le niveau macroarchitecture et le niveau microarchitecture. Le tableau II.1 compare les caractéristiques de ces différents niveaux, et la figure II.7 donne un exemple pour chaque niveau. Au niveau service, les objets peuvent interagir anonymement par le biais de requêtes et de service. Seules les fonctionnalités sont définies. Au niveau fonctionnel, les connexions entre les objets sont définies. Au niveau macroarchitecture, les éléments d'architecture sont définis : les processeurs, les ASIC, etc. au niveau microarchitecture, tous les détails de réalisation sont définis, comme les interfaces de communications des processeurs ou les systèmes d'exploitation.

Chapitre II conception des logiciels embarqués

Niveau service niveau fonctionnel

R S S

F1 F2 F3

Routeur de requêtes /services

R R S R

F4

S

F1 F1

message

F1 F1

message

message

Niveau macroarchitecture

Processeur 1

F1

Données données Evénement

Evénement

Evénement

Données

F2

F4
ASIC

Processeur 2

F3

Niveau microarchitecture

Système d'exploitation

Processeur 1

Evénement
Données

F1

F2

Système d'exploitation

Processeur 2

Evénement

F3

Bus adresses bus données bus adresses bus données

Interface

F4
ASIC

Interface

Figure II.7 : Exemple de description pour chaque niveau d'abstraction

Dans l'exemple de la figure II.7, une application est présentée aux quatre niveaux d'abstraction. Cette application est composée de quatre fonctions (ou tâches) F1, F2, F3 et F4. Au niveau service, elles communiquent anonymement grâce au routeur de requêtes. Au niveau fonctionnel, les connexions entre les tâches sont explicitées, par exemple F1 envoie et reçoit des messages avec F2 et F3 mais F4 n'envoie des messages qu'à F3, et n'en reçoit que de F2. Au niveau macroarchitecture, l'architecture globale a été décidée : F1 et F2 sont sur le processeur 1, F3 sur le processeur 2 tandis que F4 est un ASIC. Finalement, au niveau microarchitecture, les détails locaux sont aussi explicités : les processeurs disposent de leurs interfaces logicielles (systèmes d'exploitation) et matérielles. Les ports des processeurs et de l'ASIC sont réels t non plus ceux de la communication entre les tâches (qui sont cachés dans les interfaces).

Le niveau service n'est pour l'instant pas traité par le flot. Nous commençons par le niveau fonctionnel, pour arriver jusqu'au niveau microarchitecture. Ce dernier est souvent appelé niveau transfert de registres ou RTL (register transfer level).

II.6.1.4. Architecture générale du flot :

La figure II.8 donne une vision simplifiée du flot de conception. Ce flot débute au niveau fonctionnel, mais après que le partitionnement logiciel/matériel ait été décidé. Il se termine au niveau microarchitecture, où une classique étape de compilation et de synthèse logique permet d'obtenir la réalisation finale du système. C'est un flot descendant qui permet cependant de simuler à tous les niveaux et de revenir en arrière à chaque étape. En entrée, le flot attend une description de l'application au niveau fonctionnel. Cette description est traduite dans la forme intermédiaire multi niveau Colif pour être raffinée au cours de trois étapes :

- La première étape fait passer la description au niveau macroarchitecture : elle effectue la synthèse de la communication et les allocations globales de la mémoire ;

- La deuxième étape génère une table d'allocation (mémoire et protocoles) : elle effectue les affectations de mémoire et de protocoles, et également les optimisations des accès ;

Description fonctionnelle
après partitionnement
logiciel / matériel

Synthèse de la communication

Allocation mémoire globale

Description macroarchitecture

Affectation mémoire et protocoles

Optimisation des accès

Description macroarchitecture
annotée (table d'allocations)

Génération d'interfaces matérielles

Génération d'interfaces logicielles

Figure II.8 : Représentation simplifiée du flot de conception pour systèmes monopuces

Chapitre II conception des logiciels embarqués

- La dernière étape fait passer la description au niveau microarchitecture : elle effectue la génération des interfaces logicielles et matérielles qui permettent l'assemblage des divers composants ainsi que leurs communications.

II.6.2. Architecture détaillée du flot :

Ce flot global est présenté sur la figure II.10. Il part d'une spécification architecturale et comportementale du système à concevoir. La description est alors raffinée de niveaux d'abstraction en niveaux d'abstraction. En sortie, nous obtenons le code logiciel et matériel réalisant l'application.

II.6.2.1. L'entrée du flot au niveau fonctionnel :

En entrée du flot, nous prenons une description dans le langage systemC. Ce langage permet de décrire la structure et le comportement d'un système logiciel et matériel. Il est basé sur le langage C++ étendu avec des bibliothèques permettant la modélisation et la simulation de systèmes logiciels/matériels globalement synchrones, ou asynchrones avec un modèle à événements proches de celui du VHDL.

Cette description peut être effectuée au niveau fonctionnel ou aux niveaux inférieurs. Il est aussi possible de combiner les niveaux. Elle donne les informations sur la structure, et éventuellement le comportement. Si certains composants sont fournis sans comportement, ils sont considérés comme des boîtes noires.

Cependant il était préférable que nous possédions l'entière maîtrise du flot et donc qu'il ne dépende pas d'un langage d'entrée externe à notre groupe. C'est pourquoi la première étape du flot consiste à convertir la description system C en une description Colif.

REMARQUE :

Lorsqu'un module représente un processeur, nous considérons qu'il est accompagné par une mémoire locale dans laquelle sont stockés le code et les données locales du logiciel que le processeur doit exécuter. Tout au long de ce travail, dès que nous parlerons de processeur, nous supposerons implicitement l'existence de cette mémoire locale. Dans le cas où le processeur est un microcontrôleur, les périphériques intégrés seront eux aussi encapsulés dans l'enveloppe représentant le processeur. La figure II.9 montre l'architecture représentée par un module processeur.

Processeur

Périphérique
local

Bus du processeur

Mémoire
local

Périphérique
local

Figure II.9. Un module processeur

Niveau micro-architecture

Niveau fonctionnel

Niveau macroarchitecture

Bibliothèque
d'interfaces

Bibliothèque
de mémoire

Code des interfaces matérielles

Bibliothèque
de modèles
mémoire

Bibliothèque
de commun-
ication

Système monopuce

Architecture Colif annotée macro-
architecture avec mémoire

Génération
d'interfaces
matérielles

Architecture Colif micro-architecture

Allocation mémoire globales

SystemC annoté

Génération
d'architecture
mémoire

Description du comportement

Description de l'architecture

Architecture Colif
fonctionnelle

Architecture Colif
macroarchitecture

Table d'allocations

Affectations
mémoire

Génération de
systèmes
d'exploitation
(interfaces
logicielles)

Traduction vers Colif

Code systèmes
d'exploitation

raffinement : synthèse de communication

Optimisations
d'accès mémoire

Comportement
(ex. C++)

Comportement
(ex. C++)

Comportement
optimisé

Compilation / Synthèse

Bibliothèque de
système
d'exploitation

Comportement optimisé

Boites
noires

Génération
d'architecture
mémoire

Description
multilangage
multiniveau

simulable

Cosimulation

Bibliothèque
de simulation

Composants
existants

Figure II.10 : Le flot de conception générale pour les systèmes monopuces

Chapitre II conception des logiciels embarqués

II.6.2.2. Etape de traduction vers Colif :

Cette étape extrait les informations structurelles de la description d'entrée (systemC), pour les mettre sous le format Colif qui sera traité tout au long du flot. Les informations comportementales et les informations «boîte noire » sont conservées. Cette étape a été automatisée grâce aux outils développés dans l'équipe par Wander Cesário.

II.6.2.3. Etape d'allocation mémoire et de synthèse de la communication :

Cette étape permet de passer d'une description du niveau fonctionnel au niveau macroarchitecture.

L'allocation mémoire consiste en la définition des blocs mémoires qui vont contenir les données de l'application. Il s'agit généralement d'une heuristique permettant de déterminer automatiquement une configuration optimale pour réduire le coût en communication mémoire.

La synthèse de la communication consiste à choisir les protocoles de communication et les éléments de calcul (processeurs, ASIC, etc.) qui seront utilisés. Dans l'état actuel du flot, aucun outil ne permet d'effectuer cette synthèse de communication. Cette opération est donc effectuée à la main.

Des résultats de simulation au niveau macroarchitecture (voir le paragraphe II.6.2.9) permettent de guider les choix pour les protocoles. A l'avenir, il est prévu d'intégrer une méthodologie et des outils permettant d'automatiser les choix à l'aide d'une bibliothèque de résultats de simulation.

II.6.2.4. Etape d'affectation et d'optimisation de mémoire :

Une fois que les blocs mémoire ont été décidés, il est possible de leur assigner les données. Cette opération est effectuée au cours de cette étape en parallèle avec l'optimisation des accès mémoire.

II.6.2.5. Etape de génération d'architecture mémoire :

Durant cette étape, les types de mémoires, leurs contrôleurs et leurs interfaces sont générés à partir d'une bibliothèque. Le principe de cette génération est celui d'un assemblage de blocs de la bibliothèque. Cet assemblage est guidé par les choix d'allocation et de synthèse (voir le paragraphe II.6.2.3).

II.6.2.6 Etape de génération d'interfaces matérielles :

La génération d'interfaces matérielles permet d'interconnecter les divers éléments de calcul : en effet ces éléments ne sont pas tous compatibles entre eux. Ces interfaces permettent aussi de réaliser de protocoles de communication non supportés nativement par les éléments.

Cette étape, est basée sur un assemblage de blocs à partir d'une bibliothèque. Le modèle d'interface généré au sein du flot est présenté figure II.11. L'interface est constituée de trois parties. Une première partie, dépendante de l'élément de calcul (processeur), fait le pont entre son bus et celui de l'interface. La deuxième partie est le bus de l'interface, et la dernière est l'ensemble des contrôleurs de communication qui réalisent les protocoles. Ce découpage permet de générer aisément des interfaces pour tout type de processeur et tout type de protocole sans que la bibliothèque soit trop grande.

Figure II.11 : Génération d'interfaces matérielles et logicielles

Interface
matérielle

Processeur

Application

API

Noyau

ES

PILOT

Bus interne

Bus adresse bus données contrôle

Coprocesseurs de communication

Pont vers le bus interne

II.6.2.7. Etape de génération de systèmes d'exploitation :

Les parties logicielles ne peuvent pas être exécutées directement sur les processeurs : l'exécution concurrente de plusieurs tâches sur un même processeur et les communications entre le logiciel et le matériel doivent être gérée par une couche logicielle appelée système d'exploitation. La figure II.11 illustre le modèle de ces interfaces logicielles.

II.6.2.8. Les étapes de simulation :

II.6.2.8.1. La génération d'enveloppes de simulation :

Le flot permet d'effectuer des simulations du système à tout niveau d'abstraction, et même en mélangeant les niveaux d'abstraction. La technique de base consiste à encapsuler les divers composants à simuler dans des enveloppes qui adaptent le niveau de leurs communications à celui de la simulation globale. La figure II.12 illustre l'utilisation de ces enveloppes : à l'intérieur de chacune se trouve un composant qui est simulé à un niveau d'abstraction qui peut être inférieur (module A) égal ou supérieur (module B) au niveau d'abstraction de la simulation. Ces enveloppes permettent aussi d'adapter les divers simulateurs entre eux, comme par exemple un simulateur VHDL (module B) et un simulateur systemC.

Chapitre II conception des logiciels embarqués

Simulation SystemC

Enveloppe A

Module A

VHDL

Niveau : micro-architecture

Enveloppe B

Module B systemC Niveau : fonctionnel

Figure II.12. Enveloppes de simulation

Un outil qui permet de générer ces enveloppes est basé sur le même principe que la génération d'interface : la bibliothèque contient les trois types de composants précédemment cités, mais le bus interne devient une API (application programming interface) de simulation.

II.6.2.8.2. La cosimulation :

Grâce aux enveloppes, il est possible d'effectuer des validations par cosimulation pour toutes les étapes du flot, ou même sur des composants situés à des étapes différentes. Plus le niveau d'abstraction est élevé, plus la simulation est rapide, et plus le niveau est bas, plus la simulation est précise. Cette cosimulation est multiniveau, mais elle peut être aussi multilangage. La raison de telles cosimulations est que très souvent un langage est adapté pour la simulation de certaines parties d'un système, mais inadapté pour d'autres. Par exemple les simulateurs VHDL sont bons pour les circuits mais pas pour la mécanique qui est mieux modélisée par Matlab.

Pour effectuer une cosimulation, chaque simulateur est exécuté dans un processus différent. Un processus de contrôle gère l'ensemble des communications et synchronisations entre les simulateurs par le biais de mémoires partagées. Le modèle temporel utilisé est le modèle synchrone : chaque simulateur exécute un pas de calcul, puis toutes les données sont échangées grâce au processus de routage. Une fois que les communications sont achevées, un autre pas de calcul peut être effectué.

Le processus de contrôle est décrit en systemC. Cela permet de l'utiliser pour décrire des parties matérielles ou logicielles au niveau macroarchitecture, sans avoir à utiliser un simulateur externe. Il est généré en même temps que les enveloppes à partir de la bibliothèque de simulation.

II.6.2.9. Utilisation des résultats de simulation :

Les simulations pourront servir de base pour mettre en place une méthodologie d'évaluation qui permettra dans un premier temps de guider les choix du concepteur dans l'étape de synthèse, puis d'automatiser cette synthèse avec recherche d'optimum. Pour ce faire, il faudra définir des modèles de performance et des heuristiques permettant de les composer en même temps que l'on compose les divers modules des systèmes à générer.

II.7. De la compilation au ciblage du logiciel :

II.7.1 Introduction sur la compilation :

La compilation est un sujet récurrent en informatique comme en électronique : en effet, pour simplifier les descriptions, il est préférable d'utiliser des langages de haut niveau, proche d'un langage naturel. Cependant, ces langages ne peuvent en général pas être utilisés directement : il est

nécessaire de les traduire dans des formes moins sympathiques, mais correspondant directement à la réalité (dans le cas de l'électronique), ou directement utilisables par les outils ou les machines (dans le cas de l'électronique et de l'informatique). Cette section est une introduction à ce mécanisme de traduction appelé compilation.

II.7.1.1. Définitions de la compilation :

La compilation est la traduction automatique d'une description écrite dans un langage vers un autre langage. Très souvent, ce terme est restreint à la traduction d'un langage de programmation de haut niveau tel que le C vers le langage machine du processeur qui devra exécuter le programme.

Le flot de compilation est décomposé en plusieurs étapes (passes) consécutives :

- L'analyse lexicale qui produit une suite d'identificateurs correspondant aux instructions du programme d'entrée. Ces identificateurs sont appelés unités lexicales ou token ;

- L'analyse syntaxique qui produit un arbre dont chaque noeud décrit une opération élémentaire, et dont les arcs indiquent les dépendances de contrôle ;

- L'analyse sémantique qui enrichit cet arbre pour obtenir un arbre dit « décoré ». Il s'agit d'une étape de synthèse ;

- La génération de code qui parcourt l'arbre « décoré » en générant le code du langage cible correspondant à chaque noeud.

Les trois premières étapes ne dépendent que du langage d'entrée et sont appelées le frontal du compilateur. La dernière étape ne dépend que du langage cible et est appelée le dorsal du compilateur.

REMARQUE :

Très souvent, il y a une étape supplémentaire entre l'analyse sémantique et la génération de code : l'étape d'optimisation indépendante du langage cible. Cette étape se rencontre notamment avec les compilateurs vers les langages d'assemblage.

L'étape de génération de code peut être très complexe lorsque des optimisations spécifiques au langage cible sont entreprises.

Un abus de langage souvent commis est d'inclure l'édition de liens dans le flot de compilation vers le langage machine d'un processeur. L'édition de liens consiste à associer une adresse à chaque objet d'un programme en langage machine pour pouvoir le charger en mémoire et l'utiliser conjointement avec d'autres programmes.

II.7.1.2. Exemple de la compilation du langage C vers le langage d'assemblage :

Un flot de compilation typique pour le langage C est représenté figure II.13. Il s'agit d'un flot séquentiel, le résultat de chaque étape étant l'entrée de l'étape suivante. Les trois premières étapes sont le frontal du compilateur ; elles prennent en entrée le programme C et restent inchangées quel que soit le processeur cible. La dernière étape est le dorsal du compilateur qui produit en sortie le programme en langage d'assemblage. Cette étape dépend du processeur cible.

Chapitre II conception des logiciels embarqués

Programme C

Analyse lexicale

Liste de tokens

Analyse syntaxique

Arbre de compilation

Analyse sémantique

Arbre décoré

Génération de code

Programme assembleur

Figure II.13 : Les étapes de la compilation d'un programme en langage C

II.7.2. Le ciblage logiciel en général :

Dans ce travail nous présentons un flot de ciblage avec génération de système d'exploitation. Dans cette section nous nous intéresserons au ciblage logiciel de manière plus générale, c'est-à-dire sans se soucier des architectures spécifiques et sans l'introduction ou non de systèmes d'exploitation dans le flot. Dans un premier temps nous donnons quelques définitions concernant le ciblage logiciel et notamment la nuance entre ciblage et compilation, puis nous nous intéressons aux flots de ciblage avec les représentations utilisées et les étapes à suivre.

II.7.2.1. Notion d'exécutable :

Le logiciel peut se présenter sous plusieurs formes, dans plusieurs langages. Cependant, le processeur sur lequel il s'exécute ne comprend en général qu'un langage basé sur des suites de 0 et de 1, on parle de langage machine. Un programme est dit exécutable lorsqu'il se présente sous cette forme, c'est-à-dire qu'il est « compris » par le processeur et qu'il peut donc être exécuté.

On parle parfois de langage exécutable pour les langages qui peuvent être traduits en un langage exécutable (par exemple le C), par opposition à ceux qui ne le permettent pas (par exemple UML).

Il existe de très nombreux processeurs et ils ne sont en générale pas compatibles entre eux. En particulier, ils ne « comprennent » pas le même langage machine. Dès lors, la notion d'exécutable n'est pas générale : un programme est sous une forme exécutable pour un processeur donné.

De nos jours il existe aussi ce que l'on appelle des machines virtuelles, qui sont des couches logicielles ajoutées aux processeurs et comprenant le même langage quel que soit le processeur sur lequel elles sont installées. L'exemple le plus connu est le langage Java qui s'exécute sur une machine virtuelle Java. Dans ce cas, un programme exécutable pour la machine virtuelle, l'est indépendamment du processeur. L'avantage est qu'un même programme peut fonctionner quel que soit le processeur. L'inconvénient est que ces machines sont en général très lentes.

II.7.2.2. Définition du ciblage logiciel :

Le ciblage logiciel consiste à produire une description exécutable (pour une architecture matérielle donnée) d'une application logicielle, à partir d'une ou plusieurs descriptions de haut niveau de cette dernière, ne contenant pas de détails d'implémentation.

Le ciblage n'est pas exactement une compilation. En effet, une compilation est simplement la traduction d'un langage vers un autre. Le compilateur ne doit donc effectuer aucun changement dans la sémantique de la description. Le compilateur ne réalise donc pas de raffinement dans la description et n'est pas capable de l'adapter à l'architecture cible. Pour que la compilation puisse produire un logiciel correct, il est nécessaire au préalable, d'adapter cette description d'entre à l'architecture.

Le ciblage logiciel quant à lui effectue cette adaptation, la compilation étant l'étape finale d'un flot de ciblage. Un tel flot va tout d'abord raffiné certaines parties de la description d'entrée pour qu'elle soit compatible et efficace avec l'architecture cible. Cela veut dire qu'elle change la sémantique de cette description. Par exemple, dans le cas d'une spécification système, le ciblage logiciel consiste à traiter les concepts de haut niveau contenus dans la description (communication, structures parallèles) pour rendre la spécification exécutable pour une architecture donnée.

II.7.2.3. Ciblage logiciel idéal :

Le but d'un flot de ciblage est de permettre au programmeur de développer son application logicielle à haut niveau, sans se préoccuper des détails d'implémentation spécifiques à l'architecture. Il est aussi souhaitable que ce flot ne soit pas trop contraignant quant au codage de l'application. Enfin, il faudrait que le programmeur puisse remonter assez facilement du code ciblé au code, pour faciliter le travail de vérification et de correction des erreurs.

Idéalement, un flot de ciblage pourrait cibler n'importe quelle application (quel que soit son style de programmation), pour n'importe quelle architecture cible. De plus, le code ciblé par un tel flot contiendrait sans aucune modification le code initial, c'est-à-dire que l'opération de ciblage aura consisté uniquement à ajouter le code nécessaire pour rendre la description initiale compatible avec l'architecture.

II.7.3. Représentations pour le ciblage logiciel :

II.7.3.1. Représentations initiales pour le ciblage logiciel :

Comme tout flot dont le but final est la génération de code, les flots de ciblage utilisent au minimum deux types de représentations : une représentation d'origine et une représentation de destination.

II.7.3.1.1. La représentation d'entrée :

La représentation d'entrée est une spécification du système. Cette spécification peut contenir des informations structurelles, des informations comportementales, mais aussi des paramètres qui précisent les détails des éléments à générer. Ces paramètres peuvent être présents sous la forme d'annotations associées aux éléments de la spécification.

La représentation d'entrée n'a pas besoin d'être exécutable. Au contraire, les informations nécessaires pour l'exécution ou la simulation peuvent interférer avec le ciblage. Il peut être par

Chapitre II conception des logiciels embarqués

exemple suffisant pour la description comportementale de donner des listes de fonctionnalités requises, sans donner leurs réalisations.

Cette représentation est souvent une forme intermédiaire, produite par une étape de synthèse. Elle n'a donc pas forcément de format humainement accessible : elle peut par exemple être limitée à une structure de données interne à un outil de ciblage.

II.7.3.1.2. La représentation de sortie :

Le résultat de la génération est donné dans la représentation de sortie. Etant la cible de la génération, il n'y a pas de contrainte particulière sur cette représentation.

Elle décrit le système donné en entrée, mais avec tous les détails d'implémentation obtenus par le générateur de code.

II.7.3.1.3. Représentation supplémentaire, nécessaire pour le fonctionnement du ciblage :

Le ciblage consiste souvent à produire et assembler des parties de code élémentaires (décrites dans la représentation de sortie) correspondant à certains éléments donnés dans la spécification d'entrée. L'ordre dans lequel les parties de code élémentaires doivent être assemblées est déduit de l'ordre dans lequel sont présentés les éléments du système, c'est-à-dire les informations structurelles de la spécification (voir le paragraphe II.7.3.1.1). La production des parties de code élémentaires est dirigée par les paramètres associés aux éléments de la spécification.

Le cibleur de code doit donc être capable de produire les parties élémentaires de code pour chaque type d'élément de la représentation d'entrée. La méthode couramment employée est de ranger toutes les parties de code élémentaire possibles dans une bibliothèque. Le problème se réduit alors à la recherche dans la bibliothèque des portions de code correspondant aux éléments de la spécification. Pour le résoudre il convient d'avoir une représentation pour décrire le contenue de cette bibliothèque. Cette représentation doit être relationnelle pour donner les correspondances entre les éléments de spécification et les portions de code finales. Elle doit être aussi comportementale pour la description des portions de code.

Si la représentation de sortie est suffisamment souple pour pouvoir décrire les parties élémentaires de code, leur paramétrage et leur assemblage, elle peut être utilisée également pour la description de la partie comportementale de la bibliothèque. Si ce n'est pas le cas, il convient alors d'encapsuler les parties de code final dans une autre représentation plus flexible.

II.7.3.2. Les étapes du ciblage logiciel :

Nous allons présenter dans cette section les étapes à suivre lors du ciblage logiciel. Nous procéderons par ordre chronologique, en partant des descriptions de l'application et de l'architecture matérielle cible, jusqu'à la production des exécutables finaux.

Le but de cette section n'est pas de présenter une méthodologie de ciblage, mais plutôt de montrer le type d'opérations et la chronologie qu'il sera généralement nécessaire de suivre. Nous nous contenterons donc ici de présentations sommaires des étapes du ciblage, sachant que les détails les concernant varient suivant la méthodologie employée.

La figure II.14 présente les diverses étapes d'un flot de ciblage. Ces étapes sont présentées dans les paragraphes suivants.

II.7.3.2.1. Analyse des entrées : application et architecture matérielle :

Cette étape consiste en l'acquisition des informations nécessaire au ciblage. Nous allons voir les types d'information requis pour effectuer un ciblage et comment nous pouvons y accéder.

Les informations nécessaires pour le ciblage sont tout d'abord les services requis : dans cette catégorie se trouvent toutes les informations concernant les fonctionnalités logicielles à ajouter. Parmi celles-ci trouvent les fonctionnalités de communication, les fonctionnalités du système d'exploitation et les gestionnaires de périphérique

Application Architecture

logicielle Choix des éléments
logiciels

Analyse des entrées

Requis

Code de

l'application logicielle

Paramètre

Eléments logiciels
supplémentaires

Mise en place des paramètres

Génération du code ciblé

Code ciblé de l'application logicielle

Compilation

Edition de liens

Code exécutable de l'application
Figure II.14 : Les étapes du ciblage logiciel

D'autres informations requises prennent la forme de paramètres : dans cette catégorie, se trouvent toutes les valeurs qui permettront de configurer les éléments logiciels. Ces paramètres peuvent avoir les origines suivantes :

- les informations sur le matériel : quel type de processeur, quel type de périphériques, etc. ;

- les allocations, c'est-à-dire les adresses mémoire des divers éléments (logiciels ou matériels) ;

- les contraintes imposées par l'environnement. Il peut s'agir de contraintes temporelles (délais à respecter, débit, etc.), de contraintes de surface (quantité de mémoire limitée), de contraintes de consommation ou d'autres contraintes plus spécifiques (liées par exemple à du matériel particulier). Ces contraintes peuvent elles aussi avoir une influence sur le chois des services.

Accès aux informations

Ces informations sont en règle générale dispersées dans plusieurs endroits, et sous plusieurs formes :

- directement dans la spécification, sous la forme d'annotations,

Chapitre II conception des logiciels embarqués

- déductibles à partir de la structure de la spécification,

- déductibles à partir d'autres informations de la spécification, - données en langage naturel.

Il est préférable de rassembler ces informations avant de commencer toute opération de ciblage.

II.7.3.2.2. Choix des éléments logiciels à ajouter :

Dans cette étape sont sélectionnés les divers éléments logiciels à ajouter pour le ciblage. Ces éléments sont à choisir en fonction de leurs fonctionnalités, sachant qu'au final il faut que toutes les fonctionnalités requises par le système soient fournies (voir le paragraphe II.7.3.2.1)

Les éléments logiciels peuvent avoir plusieurs formes. La forme la plus courante consiste en l'ensemble des fonctions présentes dans le système d'exploitation choisis. Dans ces conditions, l'étape de choix des éléments logiciels consiste simplement au choix du système d'exploitation qui fournira le plus de fonctionnalités requises par l'architecture, les autres devant être développées. L'inconvénient est évidemment qu'il y a souvent de très nombreuses fonctionnalités inutiles apportées par le système choisis. Certains systèmes d'exploitation peuvent être paramétrés en fonction des besoins. Dans ce cas, l'étape de choix consiste au choix du système qui fournira le plus de fonctionnalités requises par l'architecture et à l'inhibition de ses fonctionnalités superflues. Il reste toujours nécessaire de développer les fonctionnalités manquantes. Des flots de ciblage plus élaborés se basent sur des bibliothèques. L'étape de choix consiste alors au choix des bons éléments dans la bibliothèque. S'il manque des fonctionnalités, il faut les développer, cependant elles peuvent être ajoutées à la bibliothèque pour pouvoir être réutilisées dans d'autres conditions.

II.7.3.2.3. Mise en place des paramètres et production du code logiciel exécutable :

Dans cette étape, le code exécutable est généré. Pour cela, il faut introduire les paramètres précédemment définis (voir le paragraphe II.7.3.2.1) et, éventuellement, adapter le code de l'application à l'environnement utilisé (système d'exploitation et architecture). Là encore les méthodes varient suivant le code des éléments logiciels. Parfois le code est présent sous la forme d'un simple exécutable. Dans ces conditions, les paramètres ne peuvent être mis en place qu'au niveau de l'application, qui doit être réécrite en fonction de l'environnement, avec par exemple l'utilisation des appels système fournis par le système d'exploitation. Une autre conséquence est que de nombreux paramètres (comme les contraintes sur l'ordonnancement) ne peuvent pas être introduits. Parfois, le code est présent sous la forme de sources paramétrables.

II.7.3.2.4. Compilation et édition de liens :

La dernière étape consiste en la compilation et en l'édition de liens pour la production du code final. Avec cette étape, le flot rejoint les flots standards de conception.

II.7.4. Le ciblage logiciel pour les architectures spécifiques :

Ce paragraphe présente les difficultés particulières du ciblage logiciel dans le cas des systèmes embarqués spécifiques. Pour atténuer ces difficultés, la faisabilité de flots de ciblage automatiques est étudiée. Ce paragraphe propose enfin l'intégration des systèmes d'exploitation dans le flot de ciblage.

II.7.4.1. Difficultés du ciblage logiciel :

Nous présentons dans cette section les difficultés que présente le ciblage logiciel. Ces difficultés sont de deux ordres : la variété des domaines et la quantité d'opérations à effectuer.

II.7.4.1.1. La variété des architectures cibles :

La variété des processeurs

Il existe de très nombreux processeurs, qui ne sont pas compatibles entre eux et qui ne comprennent pas le même langage. En première analyse, il pourrait sembler que seul le compilateur soit concerné par cette diversité de processeurs, et qu'il suffit de choisir le compilateur correspondant au processeur pour s'affranchir des incompatibilités.

En fait, cette première vue est inexacte : le type du processeur a une influence non négligeable sur le code de haut niveau du logiciel, et notamment dans le cas des applications embarquées. Pour voir pourquoi, nous allons montrer quelques caractéristiques d'un processeur qui peuvent conduire à des adaptations difficiles voire impossibles à la compilation :

- les types des données : les processeurs possèdent en général un type de données privilégié, correspondant à la taille de leurs registres. Pour qu'une application soit performante, il est préférable d'utiliser ce type au maximum pour les variables. Evidemment, suivant le processeur ce type n'est pas le même : cela peut être entier sur 8 bits, 16bits, 32bits, ou d'autres types plus exotiques. Une solution apportée par le langage C est de nommer ce type privilégié le type int, auquel cas, c'est bien le compilateur qui décide du type à prendre. Mais cela pose toujours des problèmes lorsqu'il s'agit de communiquer ces données : le type doit correspondre à l'émission et à la réception, et si les deux n'ont pas le même type de base il faut en choisir un et l'imposer aux deux. On se retrouve donc toujours dans une situation où il faut changer de type suivant le processeur et son environnement ;

- la représentation des données : les données sont représentées en mémoire par des paquets de bits. Cependant, il existe de nombreuses manières pour interpréter ces bits (par exemple en complément à deux, en mantisse et exposant, etc.) et il est aussi possible de les interpréter en grosboutistes (big-endians) ou en petit-boutistes (little-endians). Il est important de noter que pour un même type il peut exister plusieurs représentations possibles ;

- les instructions : chaque type de processeur dispose d'un jeu d'instructions qui lui est propre. C'est au compilateur de produire le code compréhensible par le processeur, et en fait n'importe quel programme de haut niveau doit pouvoir être traduit par ce dernier. Cependant, une description de haut niveau générale ne prend pas en compte les spécificités d'un processeur, notamment en termes de performance. Il est parfois préférable de changer l'algorithme pour un processeur donné. En outre, un certain nombre d'instructions ne peuvent pas être représentées à haut niveau : c'est le cas par exemple des instructions de contrôle de consommation que possèdent de nombreux processeurs utilisés dans les systèmes embarqués. Dans ces deux cas le compilateur ne peut pas agir ;

- les interruptions : la plupart des processeurs disposent d'un mécanisme d'interruptions qui permet de générer des événements. Ces mécanismes sont toujours très spécifiques à chaque à chaque processeur et peuvent être d'une grande complexité. Cependant, ils sont très rarement pris en compte

Chapitre II conception des logiciels embarqués

par le compilateur, car ils ne font pas partie du modèle de programmation classique (séquentiel continu).

Comme on le voit, les différences entre les processeurs sont de plusieurs ordres et ne peuvent être prises en compte par les seuls compilateurs.

La variété des communications

Suivant l'architecture cible, des modes de communication très différents peuvent être utilisés. Il peut y avoir des différences d'un point de vue topologique : communications point à point ou non, hiérarchique ou non, à base de barres croisées ou non, etc. Les différences peuvent être d'un point de vue protocolaire : avec ou sans connexion, avec ou sans poignée de main, avec ou sans rafale, etc. Enfin, elles peuvent être d'un point de vue matériel : avec ou sans mémoire, avec ou sans accès direct à la mémoire (DMA), etc.

Toutes ces caractéristiques peuvent se combiner, ce qui fait un très grand nombre de cas possibles, pour chacun desquels un ciblage différent sera nécessaire.

La variété des circuits connectés au processeur

Suivant l'architecture cible, des circuits différents peuvent être utilisés, et même s'ils peuvent avoir des fonctionnalités identiques, ils risquent d'avoir des modes de fonctionnement et de communication différents. Cela implique que chaque circuit induit des détails logiciels différents et change donc les opérations de ciblage à effectuer.

Logiciel abstrait

Le but de ciblage est d'adapter le logiciel aux architectures cibles. Ce logiciel est donc très général et utilise des primitives abstraites pour interagir avec l'extérieur. Nous avons vu dans les sections précédentes que les éléments d'architecture étaient très variés. Pour pouvoir les relier avec le logiciel, il convient de fournir au concepteur du logiciel les primitives abstraites correspondantes.

Pour simplifier et clarifier la programmation, il convient que le nombre de primitives soit le plus faible possible. Dès lors, une partie du travail de ciblage sera d'adapter ces quelques primitives à la diversité des architectures cibles.

Conséquences sur la variété des architectures cibles

Comme nous venons de le voir, le nombre d'architectures cibles possibles pour une même application au départ est énorme. Evidemment de très nombreuses configurations ne sont pas valables, mais il est souvent difficile a priori de savoir si une architecture sera valable ou non (notamment du point de vue temporel). Dès lors, il arrive souvent que le choix d'une architecture soit effectué au terme d'une suite d'essais sur différentes architectures.

Dans ces conditions, il apparaît important que le ciblage soit le plus rapide possible et demande le moins d'efforts possible. Ainsi, il sera possible d'obtenir plus rapidement une réalisation finale valide, il sera aussi possible de tester un plus grand nombre d'architecture, ce qui donne plus de chances pour atteindre un optimum.

II.7.4.1.2. La diversité des connaissances liées au ciblage logiciel :

Le ciblage requiert des domaines de compétence très divers ; nous allons ici en donner une liste des principaux et explique en quoi ils sont nécessaires.

Connaissances sur les processeurs

Il est important de bien connaître le processeur cible lorsque l'on veut adapter le logiciel qui doit être exécuté dessus. Il faut notamment connaître :

- les « dimensions » du processeur : la taille de ses registres, la taille de ses bus adresse et donnée, pour savoir quels types de données utiliser ;

- les modes de communication du processeur : utilise-t-il une mémoire commune données/programme (von Neumann) ou distincte (Harvard), quels protocoles utilise-t-il pour lire/écrire les données (exemple : programmation particulière de certains protocoles du 8051 [HOA]), quel est son système d'interruption ? Chaque système se programme de manière différente et la plupart du temps en langage d'assemblage uniquement ;

- le langage d'assemblage du processeur : pour pouvoir écrire toutes les parties du code spécifiques au processeur, comme la gestion des interruptions ou le changement de contexte ;

- les performances du processeur suivant les cas (vitesse d'exécution, temps de réaction aux interruptions, etc.) pour choisir les meilleurs algorithmes et réalisations ;

- l'architecture du processeur (pipeline, RISC ou CISC, etc.) cela aidera aussi au choix des algorithmes et des réalisations.

Connaissances sur les communications

Une partie du ciblage consiste en la réalisation des communications entre le logiciel à cibler et le reste. Pour ce travail, il est nécessaire d'avoir des connaissances en communication, et plus précisément :

- protocole : il faut connaître leurs caractéristiques ;

- langage de description de communication : très souvent les communications sont décrites dans un langage qui leur est propre (par exemple SDL), qu'il faut donc savoir interpréter ;

- méthode de réalisation des communications : il existe un certain nombre de méthodes pour réaliser des communications, certaines complètement logicielles, certaines faisant appel à du matériel (par exemple un DMA).

Connaissances en description d'application

Connaître l'application permet de faire de meilleurs choix lors du ciblage. Cela implique de connaître également :

- le langage dans lequel l'application est décrite : très souvent c'est du C ou du C++, cependant d'autres langages peuvent être utilisés comme Ada, SDL, etc. ;

- les algorithmes habituellement utilisés dans une application donnée, pour savoir quelles sont les implémentations optimales ;

- les paramètres de ces applications : nombre de données à traiter, nombre de tâche possibles,

etc.

Connaissances en architecture

Le ciblage sur une architecture implique la compréhension de cette dernière, il est donc nécessaire de connaître ;

- les langages de description d'architectures (VHDL, System C, etc.) ;

- les principes utilisés dans les architectures comme la modularité, l'instanciation, etc. ; - les différents types d'architectures et les conséquences sur l'implémentation [ARM].

Connaissances en électronique

Bien qu'il s'agisse de ciblage logiciel, la cible est une architecture matérielle comprenant des éléments électroniques. Si de vastes connaissances en électronique ne sont pas nécessaires, il est important d'avoir des notions sur :

- les bases de l'électronique numérique (portes), sachant que le processeur cible peut être

connecté à un peu de logique ;

- quelques circuits électroniques comme les DMA, les arbitres de bus, et autres contrôleurs ;

- les bases de l'électronique analogique pour être capable de prendre en compte les problèmes liés à la consommation.

Connaissances sur les systèmes d'exploitation

Une bonne part du ciblage consiste dans le choix et l'adaptation du ou des systèmes d'exploitation qui seront utilisés. Il est donc important de bien connaître les principes liés aux systèmes d'exploitation.

II.7.4.1.3. Nombreuses opérations et nombreuses erreurs :

Une bonne part du ciblage consiste en une fastidieuse suite d'opérations élémentaires (construire de nombreuses tables de correspondances, choisir et assembler de nombreux composants logiciels, etc.). Toutes ces opérations sont sources de nombreuses erreurs de frappe difficiles à détecter. De plus, elles sont à recommencer complètement à chaque fois que l'architecture cible change.

II.7.4.2. Faisabilité de l'automatisation du ciblage logiciel :

Dans ce paragraphe, nous allons voir dans quelle mesure il est possible d'automatiser certaines opérations dans le ciblage logiciel. Le but est d'accélérer le processus de ciblage et de limiter les erreurs, ce qui permettra une exploration plus large des diverses solutions possibles pour réaliser une application.

Pour ce faire nous allons essayer de localiser la redondance dans les opérations de ciblage, puis nous allons analyserons les types de choix à effectuer et nous déterminerons ce qui est systématique dans les flots de ciblage. Enfin, nous conclurons en précisant ce qu'il serait possible d'automatiser.

II.7.4.2.1. La redondance des opérations de ciblage :

Il y a redondance dans les informations : très souvent une même information se trouve présente dans plusieurs endroits dans les entrées du flot de ciblage ; par exemple le format de données dans un protocole de communication peut se trouve dans la description de l'architecture et

Chapitre II conception des logiciels embarqués

dans les spécifications ou même le code de l'application à cibler. Il y a aussi redondance dans les fonctionnalités des éléments logiciels : il est fréquent que deux éléments logiciels aient des fonctionnalités communes, ce qui fait que s'ils sont tous les deux sélectionnés pour le ciblage, il y aura du code inutile.

Cette redondance est source de conception lors d'un ciblage manuel, mais elle peut être un avantage pour l'automatisation, car elle peut permettre certaines factorisations.

II.7.4.2.2. Le problème des choix à effectuer lors d'un ciblage :

Nous avons vu précédemment qu'il fallait faire un certain nombre de choix lors du ciblage : il faut par exemple choisir des éléments logiciels en fonction des fonctionnalités requises, des contraintes et des performances. Il faut aussi choisir les valeurs de paramètres de configuration des éléments logiciels (par exemple la taille des mémoires tampons), en fonction des contraintes et des performances.

Si le choix en fonction des fonctionnalités requises peut être effectué automatiquement par simple gestion de dépendances (comme par exemple dans Tornado de Windriver), le choix de fonctions de contrainte et de critères de performance (vitesse, taille, ou consommation) est plus délicat. Dans ce dernier cas, il est nécessaire d'avoir une évaluation des conséquences des choix sue les performances, ce qui peut être d'autant plus difficile à obtenir si les éléments logiciels possèdent de nombreux paramètres. Dans tous les cas le résultat est rarement certain, et il est donc préférable de laisser à l'utilisateur la possibilité d'influencer ces choix.

II.7.4.2.3. Ce qui est systématique dans le flot de ciblage :

Pour automatiser le flot de ciblage, il est intéressant de repérer les actions systématiques, c'est-à-dire les actions qui ne demandent pas d'intelligence.

Dans le cas du ciblage, les actions suivantes sont directement systématiques :

- l'acquisition des informations : cette action consiste juste en la lecture des entrées du flot avec extraction des informations. A partir du moment où les entrées sont bien définies (par exemple des fichiers sous un format connu), les techniques de base d'analyse syntaxique peuvent être utilisées ;

- la mise en place des paramètres : en supposant que les divers éléments logiciels pour le ciblage sont décrits suivant un formalisme connu et que les paramètres sont directement accessibles, cela revient à effectuer des opérations d'expansion de macro ;

- la compilation et l'édition de liens : les compilations et éditeurs de liens existent déjà et sont automatiques, il suffit juste d'automatiser leur appel dans le bon ordre.

Il existe aussi d'autres actions qui peuvent devenir en partie systématiques :

- le choix des éléments logiciels nécessaires : si tous les choix ne sont pas systématiques, un certain nombre peut l'être, comme la détection de tous les éléments ayant une certaine fonctionnalité, et le choix des éléments compatibles avec une certaine architecture matérielle. Cela suppose que le flot de ciblage dispose de descriptions des fonctionnalités de ces éléments ainsi que de leur compatibilités ;

- l'adaptation du code de l'application peut elle aussi être en partie systématique : cela concerne notamment les appels de communications qui peuvent être remplacés par les bons appels au système d'exploitation.

II.7.4.2.4. Conclusion sur l'automatisation du ciblage logiciel :

Nous avons vu dans ce paragraphe que si l'automatisation complète du ciblage n'est pas encore réaliste, une bonne part du flot peut l'être avec seulement quelques interventions humaines lorsqu'il s'agit d'effectuer les choix concernant les performances.

Avec une automatisation partielle, il y aura gain de temps : il est toujours plus rapide de générer et d'adapter du code automatiquement plutôt qu'à la main (hors des considérations d'optimisation qui reste un problème NP-complet). Il y aura aussi un gain au niveau des erreurs : toutes les opérations répétitives et sources d'erreurs pour un homme peuvent être prises en charge par l'outil de ciblage automatique. Il peut être aussi possible de prouver des équivalences entre l'entrée et la sortie du flot de ciblage, auquel cas nous avons la certitude de la validité du résultat. Enfin, même s'il est toujours recommandé d'avoir une bonne compréhension des concepts liés au ciblage, il n'est plus nécessaire pour le concepteur de connaître tous les détails d'implémentation.

II.7.4.3. Les systèmes d'exploitation dans le ciblage logiciel :

II.7.4.3.1. Système d'exploitation : cible et source logicielle pour le ciblage :

Les systèmes d'exploitation ont un statu particulier dans les flots de ciblage car ils peuvent être à la fois vus comme une partie logicielle à cibler pour une architecture matérielle et comme paramètre d'un ciblage pour faire fonctionner une application pour cette architecture.

Un flot de ciblage complet devrait être capable de prendre en comte ces deux vues du système d'exploitation : il devrait être capable de générer ou de choisir le système d'exploitation avec les bons paramètres pour faire fonctionner l'application, et il devrait être capable de cibler ce même système d'exploitation pour l'architecture matérielle.

II.7.4.3.2. Apport de l'utilisation d'un système d'exploitation pour le ciblage logiciel :

Nous verrons dans le paragraphe II.8.1.1 qu'un système d'exploitation peut être vu comme une abstraction du matériel qui soulage le programmeur de la programmation des détails spécifiques à l'architecture cible. L'utilisation d'un système d'exploitation peut donc grandement simplifier le ciblage logiciel. Il faut par contre que, pour chaque architecture, il existe un système d'exploitation capable de la gérer. Nous avons vu que ce n'était pas le cas : il est très souvent nécessaire d'adapter un système d'exploitation plus ou moins générique à une architecture donnée.

Chaque système d'exploitation fournit une API pour l'application logicielle. C'est cette API qui représente les contraintes pour la programmation de l'application. L'avantage est qu'une API ne fournit pas de contraintes pour le style de programmation, comme cela peut être le cas pour les logiciels de synthèse de haut niveau, mais seulement des contraintes pour les points de communication et de synchronisation qui doivent être des fonctions du système d'exploitation.

Ces fonctions système peuvent être très générales, mais elles manquent alors d'efficacité, ou elles peuvent être plus spécifiques à l'architecture cible ou au système d'exploitation. Dès lors, si

Chapitre II conception des logiciels embarqués

l'application logicielle doit être ciblée pour une autre architecture ou si un autre système d'exploitation doit être utilisé, il faut changer son code. Ce dernier point n'est pas souhaitable.

II.8. Etat de l'art sur les systèmes d'exploitation :

Il est courant d'utiliser un système d'exploitation pour gérer plusieurs tâches concurrentes sur un même processeur. C'est une méthode aussi couramment employée dans les systèmes embarqués spécifiques, même s'il existe des solutions alternatives comme nous le verront au cours de cette section, Cependant, le terme système d'exploitation est un terme très vaste et cette section va commencer par une introduction générale à ce sujet. Enfin, la dernière section sera consacrée à leur intégration dans les flots de conceptions pour systèmes embarqués.

II.8.1. Introduction sur les systèmes d'exploitation :

Dans le monde de l'informatique et de l'électronique le terme de système d'exploitation peut être employé avec des sens différents : il peut par exemple être un ordonnanceur de tâche ou, à l'extrême opposé, un environnement complet pour faire fonctionner des programmes (sans forcément fournir d'ordonnancement). Il est très souvent logiciel, mais il peut aussi être matériel.

Dans cette section, nous présenterons dans un premier temps quelques définitions pour les systèmes d'exploitation, et nous présenterons quelques inconvénients liés à l'emploi des systèmes d'exploitation dans les systèmes embarqués ainsi que des alternatives à leur emploi.

II.8.2. Systèmes d'exploitation : définitions

Dans cette section, nous allons tenter de définir le terme système d'exploitation. Cette section n'a pas pour but de définir de manière absolue les systèmes d'exploitation, mais plutôt d'éviter les confusions avec d'autres définitions relatives au même sujet.

II.8.2.1. Un système d'exploitation en tant qu'abstraction du matériel :

II.8.2.1.1. Le matériel idéal et le matériel réel :

Pour un programme, le matériel idéal aurait des ressources infinies (mémoire, calcul, etc.) et immédiatement disponibles. Tous ses composants disposeraient aussi de la même interface simple.

Le matériel réel n'a hélas pas ces propriétés : aucun composant matériel ne peut réagir instantanément. Les ressources matérielles étant onéreuses, il est souvent nécessaire de les partager entre plusieurs tâches logicielles (c'est notamment le cas pour le processeur et la mémoire). Enfin les différents composants matériels peuvent proposer une très grande variété d'interfaces (pour des raisons de performance, ou tout simplement du fait de leurs fonctionnalités).

II.8.2.1.2 Solution apportée par le système d'exploitation :

Un système d'exploitation peut être vu comme un matériel abstrait idéal. Il s'agit en fait d'une couche logicielle qui encapsule le matériel et dont le but est de simplifier la conception des applications logicielles. Il peut alors se placer comme unique interlocuteur avec les programmes car il présente les caractéristiques suivantes.

- Il peut cacher aux tâches logicielles les indisponibilités du matériel ;

- Il peut offrir des fonctions de gestion de ressources, qui, même si elles ne permettent pas de les rendre infinies, soulagent le programme de cette gestion. Par exemple, un ordonnanceur permettra à plusieurs tâches logicielles de partager le processeur ;

- Il peut fournir une interface simple identique quel que soit le composant matériel (par exemple UNIX encapsule les accès matériels dans des accès fichiers).

La figure II.15 représente une application complète allant des programmes logiciels (Tâche 1, Tâche 2 et Tâche 3) à l'architecture matérielle permettant son fonctionnement. Chaque couche ne peut communiquer qu'avec ses voisines, ainsi les tâches logicielles ne peuvent communiquer qu'avec le système d'exploitation.

Tâche 1

Tâche 2

Tâche 3

Système d'exploitation

Processeur

Périph.1

Périph.2

Périph.3

 

Logiciel

Matériel

Figure II.15 : Système d'exploitation en tant qu'abstraction du matériel

II.8.2.2. Un système d'exploitation en tant que gestionnaire de ressource :

II.8.2.2.1. Les ressources matérielles :

Les programmes peuvent être vus comme des entités consommatrices de ressources, ces ressources représentant le matériel.

Parmi les ressources matérielles, les premières sont le processeur sur lequel les programmes sont exécutés et la mémoire dans laquelle ils stockent leurs données.

Les autres peuvent être des éléments de calcul, de communication, etc. II.8.2.2.2. La gestion des ressources : le système d'exploitation

Les ressources matérielles ne sont pas toujours directement accessibles. De plus dans les applications complexes, elles sont souvent partagées entre plusieurs programmes : il arrive par exemple souvent que plusieurs programmes doivent se partager le même processeur. Il est donc nécessaire de pouvoir gérer ces ressources.

Le système d'exploitation peut être considéré comme ce gestionnaire de ressources matérielles pour l'application, il peut gérer la ressource processeur grâce aux algorithmes d'ordonnancement de tâches, la ressource mémoire grâce aux fonctions d'allocation et de libération de la mémoire, ainsi que toutes les autres ressources grâce à des gestionnaires de périphériques.

La gestion de ces ressources peut être plus ou moins équitable suivant les besoins de l'application : l'ordonnancement peut avoir des tâches prioritaires, certaines zones mémoire peuvent être réservées pour certaines tâches. Une telle vision du système d'exploitation est illustrée par la figure II.16 : dans cette figure, le système d'exploitation, associé au matériel, est considéré comme un serveur de ressources et les tâches logicielles sont considérées comme des clients.

Chapitre II conception des logiciels embarqués

Tâche 1

R S

Tâche 2

Tâche 4

S R

Tâche 3

Système

Service d'exploitation requête
+

Requête Matériel service

Figure II.16 : Système d'exploitation en tant que gestionnaire de ressources

II.8.2.3. Elargissement du terme système d'exploitation :

II.8.2.3.1. Système d'exploitation : uniquement logiciel ?

La plupart des systèmes d'exploitation sont logiciels. Toutefois, une partie du système d'exploitation peut être réalisée en matériel. Dans cette section, nous nous intéressons principalement aux parties logicielles d'un système d'exploitation, mais la méthode présentée est compatible avec la mise en place d'éléments matériels pour le système d'exploitation.

II.8.2.3.2. Les interpréteurs de langages évolués :

Les processeurs sont des interpréteurs de langage machine. Il existe aussi des interpréteurs de langages plus évolués comme le LISP ou le Java .

Certains de ces interpréteurs fournissent toutes les fonctionnalités d'un système d'exploitation. C'est le cas des machines virtuelles Java. Ils peuvent donc être considérés comme des ensembles système d'exploitation/processeur.

II.9. Les systèmes d'exploitation dans les systèmes embarqués :

Dans la section précédente, nous avons présenté les systèmes d'exploitation en général, et notamment pour les ordinateurs. Dans le monde des systèmes embarqués, le logiciel a une part de plus en plus importante ; les systèmes d'exploitation deviennent donc essentiels dans ce domaine.

Cette section présente les systèmes d'exploitation dans le cas particulier des systèmes embarqués. Dans une première sous-section nous présenterons les fonctionnalités requises pour le logiciel dans les systèmes embarqués, puis dans la deuxième sous-section les contraintes et les degrés de libertés. Enfin, nous résumerons les avantages et inconvénients de l'utilisation de systèmes d'exploitation dans les systèmes embarqués et nous présenterons quelques solutions alternatives.

II.9.1. Fonctionnalités requises pour le logiciel dans les systèmes embarqués :

Dans ce paragraphe nous allons présenter les fonctionnalités requises pour les systèmes embarqués. Nous verrons d'abord les fonctionnalités communes avec les systèmes d'exploitation généraux, puis nous verrons les fonctionnalités spécifiques aux systèmes embarqués : pour les communications, pour le temps, et pour les pilotes de périphériques.

II.9.1.1. Fonctionnalités communes avec les systèmes d'exploitation généraux :

Les systèmes d'exploitation embarqués possèdent de nombreuses fonctionnalités communes avec les systèmes d'exploitation généraux. Ils doivent par exemple pouvoir gérer une ou plusieurs tâches et les ressources matérielles.

Ces fonctionnalités sont cependant à moduler les besoins spécifiques d'un système embarqué : par exemple une gestion multitâche n'est pas nécessaire si une seule tâche est exécutée par le processeur. De plus, elles doivent respecter des contraintes particulières pour les systèmes embarqués qui peuvent notablement changer leur implémentation comme nous le verrons dans le paragraphe II.9.2.

II.9.1.2. Fonctionnalités de communication spécifique :

Dans les systèmes embarqués spécifiques, et notamment dans les systèmes monopuces, l'architecture est dédiée à l'application pour optimiser les performances et le coût. Cela implique que les architectures de tels systèmes sont très variées. Cette variété se répercute directement sur les communications : tout d'abord parce qu'elles aussi sont optimisées pour l'application, mais aussi parce que les divers composants n'utilisent que rarement les mêmes types de communications.

Ainsi les communications peuvent être point à point ou multipoints comme le montre la figure II.17. Cette figure présente les deux types de communications, le premier requiert plus de connexions et donc plus de surface, tandis que le deuxième peut être un goulet d'étranglement et donc un facteur ralentissant. Elles peuvent être implémentées avec ou sans mémorisation intermédiaire. La mémorisation intermédiaire permet de désynchroniser deux blocs, sans pour autant forcer les blocs à s'attendre mutuellement pour échanger des données. Cette mémorisation intermédiaire peut elle-même être gérer de plusieurs manières différentes : par exemple cela peut être un système de mémoire partagée ou un système FIFO, illustré à la figure II.18, qui montre aussi les avantages de la mémorisation intermédiaire pour désynchroniser deux blocs.

Une caractéristique importante des communications est la définition des protocoles : ils sont très nombreux suivant les architectures, les données à transiter et les contraintes associées (par exemple : CAN ou même TCP/IP). Ces communications peuvent être réalisées en faisant plus ou moins intervenir le logiciel ou le matériel, suivant les compromis choisis entre la performance et la souplesse. De plus, au cours de la conception, ou même après la réalisation, la frontière entre le logiciel et le matériel n'est pas fixe.

Ces divers cas se retrouvent souvent combinés dans la même architecture.

Chapitre II conception des logiciels embarqués

Communication point a point

Module 1
(processeur, matériel...)

Module 3
(processeur, matériel...)

Module 2
(processeur, matériel...)

Module 4
(processeur, matériel...)

Communication multipoint

Module 1
(processeur, matériel...)

Module 3
(processeur, matériel...)

Module 2
(processeur, matériel...)

Module 4
(processeur, matériel...)

Figure II.17 : Communication point à point et communication multipoint

p p g q

Chapitre II conception des logiciels embarqués

Communication asynchrone (par poignée de main)

Module 1
(processeur, matériel...)

Module 2 (processeur, matériel...)

Module 1 écrit Module 2 lit

Module 1 : requête donnée

Module 2 :

acquittement

 
 

Module 1 doit attendre

Communication par FIFO (et poignée de main)

Module 1
(processeur, matériel...)

Module 2
(processeur, matériel...)

Module 1 écrit Module 2 lit

Module 1 : peut effectuer une autre tâche

Module 1 : requête donnée

FIFO

acquittement
Module 2 : requête

acquittement

FIFO donnée

Figure II.18 : Files d'attentes FIFO pour désynchroniser deux blocs sans les forcer à s'attendre
mutuellement

II.9.1.3. Fonctionnalités temporelles :

Tout comme les systèmes d'exploitation multiutilisateurs tels qu'UNIX, les systèmes embarqué ont des contraintes temporelles fortes. Cependant, ces contraintes n'ont pas la même nature:

- pour les systèmes multiutilisateurs il est important de ne pas bloquer longtemps une tâche. Le modèle temporel employé est celui du temps partagé, le but étant d'assurer une certaine équité entre les tâches ;

Chapitre II conception des logiciels embarqués

- pour les systèmes d'exploitation embarqués, il est important de respecter des délais, même s'il est nécessaire de bloquer des tâches pendant une longue durée. Le modèle temporel employé est le modèle temps-réel.

II.9.1.4. Pilotes de périphériques :

Avec les systèmes embarqués spécifiques il faut souvent trouver des compromis entre le respect des contraintes temporelles, les performances, la consommation et la surface. Les pilotes de périphériques ne sont pas les même suivant les compromis choisis, ce qui augmente d'autant leur nombre.

Enfin les systèmes embarqués devenant très complexes, il est fréquent que plusieurs processeurs fonctionnent en concurrence. Cette concurrence doit elle aussi être gérée par des pilotes.

II.9.1.5 conséquences des fonctionnalités requises sur les systèmes d'exploitation embarqués :

Nous avons vu que les fonctionnalités requises pour les systèmes d'exploitation embarqués étaient d'une grande variété, notamment pour les communications. Cette variété peut se retrouver sur une même puce, voire pour un même système d'exploitation. Il est donc nécessaire que ce dernier puisse supporter cette variété, et il doit donc disposer de très nombreuses parties spécifiques. C'est un obstacle à l'idée de standardisation générale des systèmes d'exploitation embarqués : en effet, à moins d'avoir un jeu de fonctionnalités disproportionné capable de fournir des fonctions optimales pour chaque cas, il est souvent nécessaire d'ajouter des fonctions spécifiques au système pour qu'il puisse fonctionner avec une architecture particulière.

II.9.2. Contraintes imposées par les systèmes embarqués pour le logiciel :

Dans ce paragraphe, nous allons présenter les contraintes spécifiques liées aux systèmes embarqués. Nous verrons dans un premier temps les contraintes purement matérielles (surface et consommation). Ensuite nous verrons les contraintes temporelles, en mémoire et en vitesse d'exécution.

II.9.2.1. Contraintes en surface et consommation :

Deux contraintes spécifiques aux systèmes embarqués sont la surface et la consommation. Le logiciel influe aussi sur ces paramètres, et il peut être par exemple intéressant de savoir s'il vaut mieux implémenter une fonctionnalité en logiciel plutôt qu'en matériel pour la consommation ou la surface.

Il est possible de dégager du logiciel quelques paramètres influençant la taille et la consommation :

- La surface pour le logiciel est celle de la mémoire nécessaire pour le stocker et l'exécuter. Ainsi, plus le code du logiciel est important ou plus les besoins en mémoire à l'exécution seront importants, plus la surface nécessaire sera importante ;

- La consommation dépend du taux d'activité des processeurs : plus ils effectuent de calculs, plus ils consomment. De meilleurs algorithmes peuvent réduire les calculs, et donc réduire la consommation ;

La consommation dépend aussi du nombre d'accès mémoire. Or les mémoires qui utilisent le moins de surface sont les mémoires dynamiques qui doivent être fréquemment rafraîchies, ce qui

provoque une grande consommation. Il y a donc un compromis à trouver entre surface et consommation dans le cas de la mémoire.

II.9.2.2. Contraintes temporelles : II.9.2.2.1. Les performances :

Lorsqu'il est question de contraintes temporelles, il est souvent sous-entendu performances. Pourtant, la notion de performance diffère entre les systèmes d'exploitation généraux et les systèmes d'exploitation embarqués :

- Les performances des systèmes d'exploitation généraux sont en général évaluées en moyenne car les écarts momentanés importent peu ;

- Les performances des systèmes d'exploitation embarqués sont évaluées pour les pires cas des parties citriques : quand le système doit réagir vite, il doit le faire dans tous les cas de figures ; par contre dans les cas où il n'a pas de délai à respecter, le temps qu'il met n'a pas d'importance.

Ces contraintes temporelles peuvent devenir vitales comme par exemple dans le cas d'un système de freinage ABS.

II.9.2.2.2. Contraintes temps-réel :

Nous avons vu dans le paragraphe précédent, qu'il y a des cas où les contraintes temporelles pour les systèmes embarqués prennent la forme de délais qu'il est impératif de respecter : elles sont appelées contraintes temps-réel, et, pour pouvoir y répondre, des systèmes dits « temps-réel » sont nécessaire.

II.9.2.3. Contraintes en mémoire :

Nous avons vu dans le paragraphe II.9.2.1, que dans les systèmes embarqués, la mémoire disponible pour le code et pour les données pouvait être limitée. Cette contrainte se répercute sur le système d'exploitation puisque son code ses données ajoutés à ceux de l'application doivent pouvoir tenir dans la mémoire disponible. Il est de plus préférable de disposer d'un maximum de mémoire pour l'application ; le système d'exploitation doit donc être le plus petit possible.

Cette contrainte en mémoire est si forte dans le domaine des systèmes embarqués, qu'il est fréquent de ne pouvoir disposer que de quelques kilo-octets de mémoire pour le système d'exploitation.

II.9.2.4. Les erreurs :

Les systèmes embarqués occupant des fonctions critiques disposent d'une dernière contrainte : ils ne peuvent pas être en panne, même en cas d'erreur.

Cette dernière contrainte conduit à des validations beaucoup plus strictes et donc beaucoup plus longues des applications embarquées, et aussi des systèmes d'exploitation embarqués. Des mécanismes de tolérance aux fautes peuvent aussi être ajoutés au système, ou à l'application, pour pouvoir continuer à fonctionner malgré les erreurs.

II.9.2.5. L'aspect multiprocesseur hétérogène :

Les architectures embarquées récentes contiennent souvent plusieurs processeurs différents, chacun étant spécialisé pour un domaine : par exemple un processeur générale pour le contrôle et un

Chapitre II conception des logiciels embarqués

processeur de traitement du signal pour certains calculs. Avec de telles architectures, l'utilisation d'un système d'exploitation unique pour gérer l'ensemble des processeurs est problématique : en effet, une fois compilé pour un processeur, le logiciel ne peut pas être exécuté sur un autre. Une solution possible est d'utiliser une machine virtuelle au-dessus des processeurs pour pouvoir exécuter tout le logiciel dans un langage d'assemblage unique. Cette solution est peu performante et il est préférable d'envisager une autre méthode : utiliser un système d'exploitation par processeur. Cette seconde méthode apporte cependant des contraintes supplémentaires : tout d'abord les contraintes en surface deviennent plus fortes, car plusieurs systèmes d'exploitation sont susceptibles de consommer plus de mémoire qu'un seul ; ensuite il est peut-être difficile de maintenir une cohérence globale avec plusieurs systèmes. Enfin, avec une telle architecture, les tâches ne peuvent pas passer d'un processeur à un autre : il faut décider avant la compilation de la conception à quel processeur chacune est allouée.

II.9.3. Les degrés de liberté pour le logiciel dans les systèmes embarqués :

Jusqu'à présent nous avons vu les difficultés supplémentaires liées aux systèmes d'exploitation embarqués par rapport aux systèmes d'exploitation généraux. Dans ce paragraphe nous allons voir les points qui sont plus simples à traiter pour les évolutions du logiciel.

II.9.3.1. Gestion utilisateurs simple :

En général, les systèmes embarqués n'ont pas à gérer plusieurs utilisateurs en même temps. Il n'est donc plus nécessaire de gérer la sécurité ni le temps partagé entre les utilisateurs.

II.9.3.2. Evolution du logiciel lente :

Nous entendons par évolution du logiciel lente le fait que les programmes sont plus rarement chargés ou déchargés dans les systèmes embarqués que dans les systèmes généraux : en général les systèmes embarqués disposent d'un nombre restreint de programme, soit disponibles en ROM, soit chargés au démarrage du système. Au contraire, les systèmes d'exploitation généraux (pour station de travail) peuvent à tout moment charger ou décharger une multitude de programmes présents sur leurs disques.

Cette évolution logicielle lente limite le risque du chargement d'un programme « indésirable » qui pourrait provoquer des erreurs, ou déséquilibrer l'accès aux ressources. Le nombre d'allocations et de libérations en mémoire est aussi réduit, ce qui donne plus de liberté dans les mécanismes de gestion de la mémoire.

II.9.4. Exemples de systèmes embarqués généralistes :

Il existe un très grand nombre de systèmes embarqués. Nous allons ici présenter rapidement deux catégories de systèmes d'exploitation généralistes.

II.9.4.1. Les systèmes d'exploitation embarqués propriétaires :

Les systèmes de cette catégorie les plus connus sont : VxWorks, Nucleus PLUS, QNX, pSOS et Windows CE.

Ce sont des systèmes d'exploitation généralistes qui présentent souvent de bonnes caractéristiques temps-réel et en mémoire. Ils manquent cependant souvent de fonctionnalités

spécifiques. Il est aussi difficile de les adapter à de nouvelles architectures du fait de leur nature propriétaire qui empêche leur modification.

II.9.4.2. Les extensions temps-réel :

Cette catégorie comprend les systèmes d'exploitation obtenus après adaptations aux contraintes temps-réel de systèmes d'exploitation ouverts existants. Il existe ainsi Linux temps-réel (dont le plus connu est eCos) ou mach temps-réel.

Ces systèmes, n'étant pas initialement prévus pour l'embarqués, ont souvent de moins bonnes caractéristiques que les systèmes d'exploitation embarqués propriétaires. Notamment, ils sont souvent non déterministes et plus lents. Ils disposent par contre de beaucoup plus de fonctionnalités spécifiques que les précédents, et ils sont simples à étendre du fait de leur nature ouverte.

II.9.5. Avantages et inconvénients des systèmes d'exploitation pour les systèmes embarqués :

Tout au long de ces sections, nous avons présenté les systèmes d'exploitation en général puis dans le cas particulier des systèmes embarqués. Dans ce paragraphe nous allons essayer de donner les avantages et inconvénients de l'utilisation d'un système d'exploitation pour les systèmes embarqués.

II.9.5.1. Avantages des systèmes d'exploitation pour les systèmes embarqués : II.9.5.1.1. Programmation simplifiée des applications :

Le système d'exploitation gère lui-même le matériel et propose aux applications des fonctions d'accès de haut niveau. Le travail du programmeur d'applications est donc soulagé de la programmation des accès au matériel, travail difficile, fastidieux et source de nombreuses erreurs.

Cet avantage serait encore plus important si tous les systèmes d'exploitation offraient une même interface très simple. Ce n'est malheureusement pas le cas : les impératifs de performance empêchent souvent l'utilisation d'interfaces génériques abstraites, et la multitude des systèmes d'exploitation et des architectures sont des freins à l'uniformité des interfaces.

II.9.5.1.2. Utilisation des spécificités des processeurs :

Les systèmes d'exploitation, spécialement programmés pour le processeur sur lequel ils vont s'exécuter, peuvent tirer partie de ses spécificités :

- Le mécanisme d'interruption permet d'interrompre le fonctionnement séquentiel du programme suite à un événement extérieur. Ces interruptions ne sont en général pas prises en compte dans les modèles logiciels, de plus elles sont très variables d'un processeur à un autre. Un système d'exploitation est capable de les gérer;

- Des instructions de réduction de consommation sont proposées par de nombreux processeurs pour systèmes embarqués. Il y a par exemple des fonctions de mise en veille du processeur jusqu'au prochain événement ;

- Des instructions de synchronisation ou d'exclusion mutuelle (par exemple l'instruction Test AND Set) servent pour l'utilisation de mémoire partagées entre plusieurs processeurs ;

Chapitre II conception des logiciels embarqués

- Des instructions permettent de contrôler le fonctionnement du processeur, comme les instructions de gestion de cache, qui permettent aussi des optimisations de performances ou de consommation.

II.9.5.2. Inconvénients des systèmes d'exploitation pour les systèmes embarqués :

II.9.5.2.1. Les systèmes d'exploitation consomment de la mémoire :

Les systèmes d'exploitation sont spécifiques au processeur sur lequel ils s'exécutent. Par contre, ils restent très généraux pour l'application qu'ils doivent gérer. En effet, ils sont prévus pour exécuter n'importe quel type d'application et ils doivent donc proposer des services suffisamment généraux pour être utilisables par toutes.

La généralité du système d'exploitation vis-à-vis de l'application fait qu'il est souvent plus volumineux que nécessaire. C'est un défaut important dans le monde des systèmes embarqués où la mémoire est limitée.

Les systèmes d'exploitation modulaires tentent de résoudre ce problème en mettant leurs fonctionnalités sous la forme de modules optionnels, qui ne seront effectivement chargés dans la mémoire que s'ils sont utilisés. Cependant, ces modules restent eux-mêmes généraux, à moins d'avoir une bibliothèque de modules contenant tous les types de modules spécifiques possibles, ce qui n'est guère réaliste.

II.9.5.2.2. Les systèmes d'exploitation consomment des ressources processeur :

Comme nous l'avons vu dans le paragraphe précédent, les systèmes d'exploitation sont très généraux pour les applications qu'ils doivent exécuter. Cette généralité se paye en termes de mémoire consommée, mais elle peut se payer aussi en termes de vitesse d'exécution : par exemple les synchronisations utiliseront toujours des mécanismes de sémaphores complets, alors que dans de nombreux cas un simple verrou suffit.

La vitesse du système d'exploitation est aussi limitée par l'ordonnancement dynamique des tâches qui demande du temps aussi bien pour la décision que pour le passage d'une tâche à l'autre.

II.9.5.2.3. Les systèmes d'exploitation peuvent être non déterministes :

Nous avons vu que dans les systèmes embarqués, des contraintes temps-réel pouvaient imposer que le fonctionnement soit déterministe. Ce déterminisme n'est pas toujours aisé à obtenir avec les systèmes d'exploitation qui sont des programmes à exécution complexe. En fait, il est souvent impossible de savoir avant utilisation si une application basée sur un système d'exploitation va respecter des délais ou non.

II.9.5.3. Solutions alternatives aux systèmes d'exploitation :

Nous avons vu précédemment les avantages et inconvénients de l'utilisation des systèmes d'exploitation pour les applications embarquées. Il existe aussi des solutions sans système d'exploitation. Nous allons ici présenter les deux grands types de solutions alternatives.

II.9.5.3.1. Utilisation d'un programme unique par processeur :

La solution la plus simple consiste à écrire un seul programme qui fonctionnera directement pour le processeur. Elle présente l'avantage de pouvoir prendre en compte les spécificités du

processeur et de l'application ; elle n'est pas contre utilisable que si l'application et le processeur sont simples. Il est notamment difficile d'utiliser cette méthode dans le cas d'applications multitâches.

Cette méthode a été la première employée dans la conception des systèmes embarqués et elle est encore couramment utilisée dans le cas des processeurs de traitement du signal par exemple.

II.10. Conclusion :

Dans ce chapitre, nous avons précisé le cadre du travail de cette mémoire : il s'agit des systèmes embarqués électroniques et informatiques spécifiques, et notamment les systèmes sur une puce (SoC). Si la conception de la première génération était suffisamment simple pour ne pas requérir de méthode ni d'outils particuliers, la dernière génération, hétérogène, multiprocesseur et multimaître est trop complexe pour être conçu sans de nouvelles approches.

Les méthodes récentes de conception de basent sur le codéveloppement et la cosimulation, c'est-à-dire le développement et la simulation conjoints de toutes les parties d'un système. Un exemple de flot de conception basé sur ces principes a été présenté. Ce flot démarre au niveau fonctionnel, c'est-à-dire lorsque les divers composants de l'architecture ont été définis. Il raffine cette description jusqu'au niveau transfert de registres (appelé micro-architecture). Ce chapitre est consacré à l'étape de la génération d'interfaces logicielles et au ciblage logiciel. La principale action de cette étape est de générer un ensemble logiciel appelé système d'exploitation. Ce logiciel particulier est complexe et recouvre un domaine très vaste, il est présenté aussi dans ce chapitre.

Dans la deuxième partie de ce chapitre, le concept de ciblage logiciel a été introduit : il s'agit de l'adaptation du logiciel à l'architecture cible. C'est une étape obligatoire dans les flots de conception, mais elle est souvent négligée par rapport à la seule compilation. Pourtant, le ciblage logiciel est difficile, fastidieux et sujet à de nombreuses erreurs.

Cette étape peut être grandement automatisée et l'inclusion du système d'exploitation simplifie ce travail. Dès lors le concepteur du logiciel n'a plus qu'à se concentrer sur les fonctionnalités, les détails d'implémentation étant en grande partie automatiquement résolus par le flot de ciblage.

Chapitre III

Conception matériel

Chapitre III conception matériel

III.1. Introduction :

La conception de systèmes à base de composants apparaît bien établie dans le monde de l'électronique où les ingénieurs ont toujours travaillé ainsi. Dans les années 1980, une architecture matérielle est vue comme l'interconnexion sur une carte (PCB pour Printed Circuit Board) de composants sur étagère vendus dans des boîtiers séparés. Ces composants sont vus comme des boîtes noires auxquelles les constructeurs associent des documents (datasheets, notes d'application) pour en préciser les fonctionnalités, les interfaces et les contraintes d'utilisation. Une même carte regroupe généralement un processeur, de la mémoire, des périphériques de taille modeste et des circuits logiques. Ces derniers sont combinés soit pour construire des circuits plus complexes, soit sous forme de «glu» pour adapter les interfaces entre composants.

Dans les années 1990, les microcontrôleurs intègrent dans un même boîtier un coeur de processeur, ses périphériques et de la mémoire. La capacité croissante des ASICs (Application Specific Integrated Circuits) autorise l'implantation directement en matériel de fonctions complexes tandis que les circuits logiques programmables (PLD) permettent de regrouper la «glu» sur une même puce pour en réduire l'encombrement.

A partir de 2000, un simple ASIC ou FPGA (Field-Programmable Gate Array) peut contenir l'équivalent de plusieurs millions de portes logiques, ce qui permet d'intégrer dans le même boîtier un ou plusieurs coeurs de processeurs, des bus, de la mémoire et des périphériques. L'ordre de complexité de ces périphériques va d'un simple timer à un décodeur vidéo complet.

Aussi, un effort important est fourni pour la vérification des SoC en utilisant des représentations abstraites du système et de ses composants. Compte tenu de la complexité en nombre de portes des composants, cette vérification ne peut être exhaustive et s'avère à son tour très coûteuse en temps de développement. Les concepteurs de circuits combinent plusieurs approches :

- l'optimisation et la génération automatique de matériel à partir d'une modélisation de haut niveau du système,

- la réutilisation de composants pour éviter de la redondance dans la conception,

- l'utilisation de techniques de simulation et de vérification formelle afin de s'assurer que les modèles sont consistants par rapport aux spécifications.

III.2 Modéliser et synthétiser à un haut niveau d'abstraction :

Un flot typique de conception de matériel suit une progression descendante faite d'une succession d'étapes qui enrichissent la vision abstraite du système. Le diagramme en Y, proposé par Gajski et Kuhn, donne une vision synthétique des domaines de conception et des niveaux d'abstraction sous lesquels un circuit peut se présenter au cours de son développement. Les trois domaines proposés sont le domaine comportemental, dans lequel on s'intéresse aux propriétés dynamiques du fonctionnement d'un système ; le domaine structurel dans lequel un système est vu comme une interconnexion de composants ; le domaine géométrique, ou physique dans lequel on s'intéresse aux relations spatiales entre ces composants sur le support cible (carte ou circuit intégré). Les différents niveaux d'abstraction identifiés dans chacun de ces domaines sont :

- le niveau architectural décrit les fonctionnalités d'un système au niveau spécifications, donne sa décomposition en sous-systèmes ainsi que ses contraintes d'implantation physique ;

- le niveau algorithmique exprime des comportements de type flot de données et/ou de contrôle en utilisant des modèles hauts niveaux. La structure représente l'affectation des fonctions aux ressources. Des informations géométriques sont exprimées en terme de partitionnement en blocs sur un circuit intégré ou une carte ;

- le niveau transfert de registres (RTL) exprime l'ordonnancement au cycle d'horloge près des opérations et des transferts de données. Pour l'aspect structurel, ces opérations sont projetées sur des ressources matérielles élémentaires (registres, opérateurs arithmétiques, etc.) ;

- le niveau logique décrit le comportement sous forme d'équations booléennes, qui peuvent elles mêmes se traduire sous la forme d'une interconnexion de portes logiques d'une part, et d'autre part de cellules élémentaires placées et routées d'une bibliothèque technologique de type ASIC ;

- le niveau circuit modélise le comportement électrique sous forme d'équations différentielles ou de fonctions de transfert ; une représentation structurelle décompose le circuit en une interconnexion de transistors et une représentation géométrique détaille le placement et le routage de ces transistors sur le substrat de silicium.

Cette décomposition en domaines et niveaux d'abstraction conduit à une représentation commune des formes sous lesquelles un système peut se présenter et des transformations réalisables pour passer d'une représentation à une autre. Les langages de description de matériel comme VHDL ou Verilog autorisent des représentations combinant différents niveaux et domaines, représentations sur lesquelles des outils automatiques peuvent travailler à des fins d'analyse et de synthèse. Les outils de synthèse matérielle réalisent en fait l'équivalent de la «compilation», au sens logiciel, en automatisant le raffinement d'une description de «haut niveau» (par exemple une description comportementale au niveau RTL) en une description de plus bas niveau (par exemple une description structurelle au niveau logique).

Trois étapes de synthèse sont aujourd'hui couramment utilisées dans l'industrie : synthèse RTL (du niveau RTL comportemental vers le niveau logique structurel) ; synthèse logique (optimisation au niveau logique structurel) et synthèse physique, ou placement/routage (du niveau logique structurel vers le niveau logique ou circuit dans le domaine géométrique). Ces étapes s'enchaînent et les interventions du concepteur se limitent à l'écriture de scripts qui précisent notamment les contraintes à respecter. En amont de ces trois étapes, la synthèse de haut niveau promet la génération automatique d'une description RTL à partir d'une description du comportement au niveau algorithmique : ces nouveaux outils qui émergent depuis quelques années sur le marché de la CAO reposent sur l'ordonnancement automatique des opérations et la synthèse d'un contrôleur adapté aux performances souhaitées pour l'architecture matérielle de sortie.

Chapitre III conception matériel

III.3 Réutilisation de composants matériels :

Les systèmes électroniques embarqués actuels sont un mélange de technologies hétérogènes (numérique /analogique, matériel/logiciel, orientation contrôle/données) et de fonctionnalités complexes dont certaines sont communes pour une famille de produits. La réutilisation devient alors nécessaire pour éviter de multiples implémentations de fonctionnalités identiques.

La réutilisation de composants matériels sur étagère (composants en boîtiers) est une pratique courante dans le domaine de la conception de systèmes sur cartes. Un composant est une boîte noire conditionnée et interfacée de manière standard. La documentation constructeur en détaille les fonctionnalités et les conditions d'utilisation (chronogrammes des entrées/sorties). Elle fournit également des notes d'application avec des exemples de réalisation et des circuits de référence.

III.3.1 Composants virtuels :

La notion de système sur circuit intégré amène des changements majeurs sur cette définition du composant : un composant ne recouvre plus un objet physique palpable mais se présente sous la forme d'une unité de structuration abstraite dont il n'est pas sûr qu'elle corresponde à une entité physique distincte après fonderie. L'utilisation de langages de description de matériel et d'outils de synthèse automatiques devient ici incontournable. Rapidement, se pose le problématique de concevoir, échanger et réutiliser de tels composants (appelés composants virtuels ou IP cores pour Intellectual Property), problématique nouvelle dans le monde du matériel mais déjà rencontrée dans le monde du génie logiciel.

Comparée à la réutilisation de composants en boîtiers, l'intégration d'un composant virtuel dans un système introduit de nouveaux problèmes :

- Les standards d'interface (bus de communication) qui régissaient la conception de cartes sont remis en question. Un composant virtuel n'étant plus limité par les contraintes de packaging peut être muni d'interfaces spécifiques, optimisées en fonction du fonctionnement interne du composant. Pour permettre à deux composants de collaborer le concepteur d'un système doit leur ajouter des couches d'adaptation qui introduisent un surcoût en temps de développement et une possible dégradation des performances.

- Les composants manipulés dans les flots de conception sont des modèles fournis sous forme de fichiers sources (code synthétisable écrit dans un langage de description de matériel) ou ayant déjà subi les étapes de synthèse logique et physique (netlists, masques prêt à fondre). Les formats d'échange et la nature des informations échangées entre concepteur et utilisateur d'un composant conditionnent l'interopérabilité de leurs outils de conception respectifs.

- La modélisation des composants à un haut niveau d'abstraction permet une certaine flexibilité dans leur conception. Il devient possible de les «personnaliser» à différents niveaux (paramètres algorithmiques comme les nombres de points d'une FFT, paramètres de performances comme le nombre d'étages de pipeline, paramètres technologiques comme la fréquence d'horloge). En revanche, les caractéristiques physiques d'un composant (encombrement, consommation) sont d'autant moins prédictibles qu'il est décrit à un haut niveau.

Chapitre III conception matériel

- Un dernier aspect des composants virtuels concerne la protection de la propriété intellectuelle dans la mesure où, selon le niveau d'abstraction de sa description, l'utilisateur dispose d'une vue en boîte grise voire en boîte blanche qui facilite la rétro-conception. A la différence des composants en boîtiers dont il faut acheter autant d'exemplaires que de produits à fabriquer, un composant virtuel peut être reproduit à l'infini en toute illégalité. Une notion de licence d'utilisation similaire à celles des produits logiciels s'applique aujourd'hui également au matériel.

III.3.2 Standardisation :

VSIA (Virtual Socket Interface Alliance) est une organisation qui regroupe des vendeurs de CAO et des sociétés qui développent des systèmes. Elle propose des recommandations sur les points suivants :

- les standards permettant de définir, ce qu'est un composant virtuel ;

- les méthodologies pour la conception et la réutilisation d'IP ;

- les techniques de vérification et de test de ces IP ;

- la protection de la propriété intellectuelle pour ces IP ;

- les méthodes de transfert de composants.

VSIA définit trois niveaux d'abstraction sous lesquels un composant peut être délivré :

- Les composants virtuels durs (hard) sont livrés sous forme de masques prêts à fondre. Ses performances et ses propriétés physiques sont pleinement caractérisées. En revanche, un jeu de masques est spécifique à une technologie donnée et peut difficilement être porté d'une technologie à une autre. Un tel composant n'est pas paramétrable et ne peut pas être optimisé pour une application donnée.

- Un composant virtuel ferme (firm) se présente sous la forme d'une netlist structurelle aux niveaux portes logiques. Elle est généralement optimisée en vue d'une cible technologique donnée, mais autorise des optimisations supplémentaires lors du placement et du routage sur le support physique. La fonction réalisée et les performances sont figées.

- Un composant virtuel mou (soft) est délivré sous la forme d'une description de niveau transfert de registres dans un langage de description de matériel. Cette description est portable d'une technologie à une autre et pourra traverser différentes étapes d'optimisation en lien étroit avec les besoins de l'utilisateur. Elle peut également supporter un paramétrage au niveau micro-architectural (par exemple de la largeur des bus).

Les composants soft sont plus facilement sujets aux violations de la propriété intellectuelle. Généralement, un composant annoncé comme soft est délivré sous forme firm, le constructeur préférant réaliser la synthèse chez lui en fonction des contraintes de l'utilisateur plutôt que de lui délivrer son code source.

Les travaux du groupe VSIA visent également à standardiser la notion de plate forme d'intégration qui fournit un cadre de développement de SoC dont le coeur est réutilisable pour une famille d'architectures donnée. Le terme plate-forme, assez vague, regroupe en fait quatre niveaux :

- Les plates-formes «de niveau zéro» font simplement référence à un ensemble de blocs de base utiles pour une large famille d'applications.

- Les plates-formes «de niveau un» sont constituées d'une architecture minimale basée sur un ou un ensemble de processeurs, choisi pour une famille d'applications précises (ex. ARM7/9 + RISC pour un produit utilisant la technologie sans-fil), et dont l'utilisation est maîtrisée. Ces architectures font en général apparaître un certains nombre de différenciateurs qui permettent de particulariser la plate-forme pour un produit spécifique (ex. DECT ou GSM).

- Les plates-formes «de niveau deux», appelées également «plates-formes d'intégration système», visent un taux de réutilisation de l'ordre de 95 pourcent. Ce taux de réutilisation peut seulement être atteint car la majorité de la plate forme est déjà pré-validée, souvent cette validation a été 'prouvée' par la réalisation d'un ou plusieurs produits. Avec ce type de plate-forme, le degré de liberté est très réduit (i.e. on peut seulement choisir un certain nombre de périphériques parmi un ensemble proposé, changer le contenu des composants programmables ou rajouter des parties analogiques spécifiques). Il est toutefois indispensable de valider les nouveaux composants selon des critères fonctionnels, temporels et matériels (encombrement, contraintes électromagnétiques).

- Enfin le «niveau trois» représente les «plates-formes de production» ou les aspects matériels sont fixes et pré-validés ; seuls les composants programmables ou les aspects logiciels peuvent être modifiés. Dans ce dernier type de plate forme, la validation et la mise au point des applications et/ou du système d'exploitation devient l'étape qui fait la différence au niveau du produit final.

Cette approche par plates-formes d'IP fait partie des avancées dans le domaine du matériel qui pourraient être adaptées à la conception d'architecture embarquées.

III.4. Un exemple d'environnement orienté composants pour la conception d'architectures numériques :

Dans ce paragraphe, nous présentons une étude qui utilise les techniques orientées objets et l'approche par composant pour concevoir et simuler des architectures numériques. Il s'agit là d'un exemple d'environnement de modélisation et d'évaluation de performance d'architecture : SEP (Simulation et Evaluation de Performance). Initialement SEP a été étudié pour répondre à des besoins d'industriels qui souhaitaient pouvoir réutiliser leurs modèles existants et les enrichir afin qu'ils réalisent les nouvelles fonctions. Les langages objets ont été choisis dans SEP afin d'enrichir les modèles bien conçus en utilisant les mécanismes d'héritage et de composition. Les composants pour leur part, permettent d'encapsuler par une interface de communication une ou plusieurs fonctionnalités. Ils communiquent par l'intermédiaire de connecteurs qui ont l'avantage indiscutable sur les objets de faire apparaître sur un pied d'égalité l'émetteur et le récepteur. De ce point de vue, le composant est un modèle mieux adapté que les objets pour représenter cette caractéristique des échanges dans le matériel. Ces approches doivent être combinées et adaptées aux outils et modèles existants pour la conception de circuits.

Les langages de description du matériel (VHDL ou Verilog) sont orientés composants. Ils permettent la description de l'interface de communication ou entité, ainsi que de plusieurs implémentations différentes (composant) et enfin de la configuration. Ils manquent néanmoins de mécanismes d'enrichissement des composants existants. SEP se base donc sur deux approches pour la modélisation et la simulation d'architecture numérique à savoir :

Chapitre III conception matériel

- utiliser des langages orientés objets tels que Java ou C++ pour décrire les fonctions (services) élémentaires réalisés par les architectures matérielles. Ces modèles peuvent alors être enrichis et adaptés à de nouvelles spécifications ;

- utiliser un langage de description d'architecture pour décrire les entités elles-mêmes et les mécanismes de communication et de synchronisation. Cette description matérielle utilise les modèles objets définis précédemment pour réaliser le comportement. Alors qu'avec des langages tels que VHDL et Verilog, le comportement est indissociable de l'interface du composant, dans l'outil SEP, ce comportement est délégué par un mécanisme d'interposition vers le monde des objets. Cela permet d'avoir une approche 'top-down' dans la conception et ainsi de vérifier les aspects fonctionnels avant de vérifier les aspects temporels de VHDL ou Verilog.

Le composant SEP L'entité de base de modélisation dans SEP est le composant. On distingue deux catégories de composants :

- les composants "élémentaires" représentés par la classe "Active Component" et dont le comportement est modélisé par un ensemble de services. Le comportement des composants est complètement autonome, il ne dépend pas de la configuration dans laquelle ils sont placés ce qui assure la modularité et la réutilisation ;

- les composants "Material Container" appelés aussi modules dont le comportement est représenté par une description structurelle, c'est-à-dire par composition d'autres composants.

Interface des composants SEP Les composants communiquent avec l'extérieur au travers de leur interface. Cette interface est constituée d'un ensemble de ports munis d'une sensibilité qui définit les conditions sous lesquelles les composants réagissent. Cette notion de sensibilité est caractéristique du matériel.

Les ports sont reliés entre eux par des signaux. Ils communiquent avec le composant dont ils dépendent en utilisant le ou les "event Listener" qui leur est associés. Les composants utilisent les ports pour échanger des données à travers des signaux de communication. Une donnée émise sur un port de sortie PS d'un composant est diffusée vers le ou les ports connectés au port PS par un signal. Cette autonomie rend possible la définition de nouvelles configurations qui modifient l'interconnexion des composants. En effet, une connexion directe entre deux composants, c'est-àdire un composant invoquant explicitement un service d'un autre composant sans connecteur, ne permet ni une modification aisée de la configuration, ni une réutilisation aisée des composants. La modélisation avec des composants et des connecteurs permet plus de souplesse que la simple utilisation d'objets.

Les services d'un composant La description du comportement d'un composant (Active Component) commence par la définition des services fournis par le composant. Ces services sont décrits par les méthodes d'une classe appelée "Service Provider" associée à ce composant. Ensuite, chaque service est encapsulé dans un composant SEP afin de réaliser un comportement. En effet, le service constitue seulement une partie du comportement. Il est exécuté en concurrence avec d'autres services du même composant ou d'autres composants. Il existe deux catégories élémentaires de composant dans SEP. Les composants combinatoires dont les sorties ne dépendent que des entrées : "Level Component", et les composants séquentiels qui peuvent être modélisés par des machines à

états et dont les sorties dépendent de l'état courant du composant et de ses entrées (modèle de Mealy): "Edge Component". L'état suivant est calculé en fonction de l'état courant et des entrées.

La composition de composants Dans SEP, il est possible de construire un comportement complexe par composition du comportement de composants plus simples. La définition d'une configuration de composants et de connecteurs permet de construire ce comportement. Les connecteurs élémentaires de SEP sont les signaux de contrôle et les bus de données. L'introduction de la notion de module permet de réutiliser des parties de modèles existants et permet une approche incrémentale. La notion de service est donc aussi présente au niveau des modules, c'est pourquoi un mécanisme qui la fait apparaître explicitement a été mis en oeuvre. Ce mécanisme permet la définition de services dans un module, améliore la lisibilité et donc la possibilité de réutilisation.

Héritage de comportements et de services Que la description du comportement des composants soit logicielle ou structurelle, tous les composants sont potentiellement constitués d'un ensemble de services.

On définit une relation d'héritage du comportement d'un composant fils vers son composant père comme d'une part, l'héritage par le fils de l'interface du composant père et d'autre part, l'héritage des services définis par le père. C'est-à-dire que le composant fils possède dans son interface au minimum les mêmes ports que son père ; bien évidemment, il peut en déclarer de nouveaux ; de plus, il hérite des services définis par son père et peut les redéfinir. Une deuxième notion d'héritage a été définie, c'est l'héritage des services d'un composant fils par son composant père, c'est-à-dire par le module auquel il appartient.

Les services du fils peuvent être directement invoqués sur le père comme s'il les avait définis lui-même.

III.5 L'état des lieux et les perspectives de recherche :

La conception de systèmes à base de composants est devenue une pratique courante depuis déjà plusieurs années. Face aux difficultés mentionnées plus haut et à l'impossibilité pour les grands groupes d'obtenir un consensus sur des standards, la notion de composant IP Plug-and-Play - c'està-dire implantable directement sans effort de la part de l'utilisateur et sans intervention du concepteur - est perçue aujourd'hui comme un objectif irréaliste et des solutions industrielles ont été mises en place pour résoudre les problèmes sans attendre. La notion de Platform IP résout la question de l'interopérabilité des composants provenant de sources variées en fournissant une architecture SoC prête à l'emploi et configurable de manière limitée (choix des périphériques dans une bibliothèque de composants sélectionnés pour la compatibilité de leurs interfaces).

Une partie des résultats obtenus par les industriels dans la construction et la mise au point de ces plates-formes pourraient être exploités pour leur adaptation à la notion de composant temps réel. En particulier, la gestion des interfaces et l'interopérabilité des composants est un problème bien cerné pour les IP. La caractérisation temporelle des IP fait également partie des contraintes qu'il faudrait attacher aux composants temps réel. Il faudrait étendre ces travaux afin de les adapter à des matériels de plus haut niveau que les SoC.

A l'inverse, il semble maintenant acquis que les techniques employées dans la conception du logiciel (méthodologie, outil de développement, outil de vérification) doivent être appliquées à la

Chapitre III conception matériel

conception de systèmes matériels. Cela suppose une adaptions de ces méthodes et outils logiciels pour la prise en compte, au niveau de ces modèles, de caractéristiques inhérentes au matériel.

III.6. Architecture matérielle d'un système embarqué :

La figure III.1 présente les caractéristiques principales d'un système embarqué typique.

FPGA/ ASIC

LOGICIELLE

MEMOIRES

CNA

CAN

CAPTEURS

CPU

INTERFACE
UTILISATEUR

SECURITE ELECTROMECANIQUE

PORT
ENTREES

ALIMENTATION
AUXILIAIRE

ACTIONNEURS

ENVIRONNEMENT EXTERIEURE

Figure.III.1 : Système embarqué typique

On retrouve en entrée des capteurs généralement analogiques couplés à des convertisseurs A/N. On retrouve en sortie des actionneurs généralement analogiques couplés à des convertisseurs N/A. Au milieu, on trouve le calculateur mettant en oeuvre un processeur embarqué et ses périphériques d'E/S. Il est à noter qu'il est complété généralement d'un circuit FPGA jouant le rôle de coprocesseur afin de proposer des accélérations matérielles au processeur.

On retrouve en fait un beau système d'asservissement entre les entrées et les sorties ! Il est à noter que l'expression la plus simple de cette figure est de considérer, comme capteurs, des interrupteurs et, comme actionneurs, des LED

Sur ce schéma théorique se greffe un paramètre important : le rôle de l'environnement extérieur. Contrairement au PC ronronnant bien au chaud dans un bureau, un système embarqué doit faire face à des environnements plus hostiles. Il doit faire face à un ensemble de paramètres agressifs :

· Variations de la température ;

· Vibrations, chocs ;

· Variations des alimentations ;

· Interférences RF ;

· Corrosion ;

· Eau, feu, radiations ;

L'environnement dans lequel opère le système embarqué n'est pas contrôlé ou contrôlable. Cela suppose donc de prendre en compte ce paramètre lors de sa conception. On doit par exemple

prendre en compte les évolutions des caractéristiques électriques des composants en fonction de la température, des radiations... Pense-t-on à tout cela lorsque l'on conçoit une carte mère de PC ? Enfin pour terminer cette partie, les systèmes embarqués sont aujourd'hui fortement communicants. Cela est possible grâce aux puissances de calcul offertes par les processeurs pour l'embarqué (32 bits en particulier) et grâce aussi à l'explosion de l'usage de la connectivité Internet ou connectivité IP. La connectivité IP permet fondamentalement de contrôler à distance un système embarqué par Internet. Ce n'est en fait que l'aboutissement du contrôle à distance d'un système électronique par des liaisons de tout type : liaisons RS.232, RS.485, bus de terrain...

Cela permet l'emploi des technologies modernes du web pour ce contrôle à distance par l'utilisateur : il suffit d'embarquer un serveur web dans son équipement électronique pour pouvoir le contrôler ensuite à distance, de n'importe où, à l'aide d'un simple navigateur. Il n'y a plus d'IHM spécifique à concevoir pour cela, ce rôle étant rempli par le navigateur web. Cela est une réalité : les chauffagistes proposent maintenant des chaudières pouvant être pilotées par le web ! Il faut aussi noter la montée en puissance des communications sans fil dans l'embarqué au détriment des communications filaires pour limiter le câblage et faciliter la mise en place du système embarqué. Le wifi et toutes les normes de réseaux sans fil IEEE 802.15 comme Zigbee ont le vent en poupe dans l'embarqué et surtout en domotique (réseaux de capteurs sans fil par exemple).Mais ne nous méprenons pas sur ces facilités et commodités, cela a bien sûr un revers : la sécurité du système embarqué, puisque connecté à Internet.

III.6.1. Les capteurs : III.6.1.1. Définition :

Figure .III.2 : Capteur et transmetteur en situation

Un capteur est un organe de prélèvement d'information qui élabore à partir d'une grandeur physique, une autre grandeur physique de nature différente (très souvent électrique). Cette grandeur représentative de la grandeur prélevée est utilisable à des fins de mesure ou de commande.

-virtuellement, tous les stimuli physiques peuvent être captés (température, lumière, couleur, son, vélocité, accélération (linéaire, angulaire), pression, champ magnétique, tension, courant, capacité...).

-Interfaces pour ces capteurs (alimentation, isolation et amplification, filtrage, multiplexage, conversion A/N, FPAA).

Chapitre III conception matériel

III.6.2. Les Convertisseurs Analogiques Numériques :

Le but du CAN est de convertir un signal analogique continu en un signal discret et cela de manière régulière (à la fréquence d'échantillonnage).

Il existe différents types de convertisseur qui va se différencier par leur temps de conversion et leur coût (Surface de silicium).

III.6.2.1. Les convertisseurs à intégration :

III.6.2.1.1. Convertisseur à approximations successives :

Principe : On détermine les valeurs des différents bits l'un après l'autre en commençant par le MSB, un peu à la manière d'une marchande de marché :

Figure .III.3 : Principe de la pesée successive

Le signal est comparé à une tension de référence: Vo/2. S'il est supérieur, on lui retranche cette valeur et on met le bit de comparaison à '1', sinon on met le bit de comparaison à '0' et on le compare à la tension suivante.

On effectue ainsi un encadrement progressif de plus en plus fin. Ainsi pour un CAN N bits, en N coups on obtient la conversion.

Il est plus lent que le Flash. Ainsi pour 16 bits, il lui faut en moyenne un temps de conversion de 10jts. Il est très adapté à des signaux audio.

III.6.2.1.2. Simple rampe / tracking :

Principe : A la valeur de la tension d'entrée on fait correspondre une impulsion dont la largeur est proportionnelle à cette tension. Cette impulsion vient contrôler l'autorisation à s'incrémenter d'un compteur. On génère ainsi le code binaire de sortie en comptant plus ou moins longtemps en fonction de l'amplitude du signal à convertir.

Figure .III.4 : Principe du convertisseur simple rampe

Caractéristiques :

> Les Avantages :

· Simple et peu coûteux.

· Inconvénients :

· N dépend de C donc de la tolérance sur C.

· Lent car nécessite 2N cycles d'horloges pour effectuer une conversion.

· Comme il n'y a pas de synchronisme entre l'horloge et le RAZ, cela induit une imprécision
de 1 période au début et à la fin de la conversion soit une erreur moyenne de 1,5 quantum.

III.6.2.1.3. Double rampe (intégrateur) :

Principe : On effectue une double intégration de manière à faire s'annuler les erreurs dues aux composants :

Figure .III.5 : Architecture du convertisseur double rampe

- phase 1 : intégration de l'entrée pendant un temps T1

- phase 2 : décharge de l'intégrateur vers 0 à vitesse constante.

- Le temps T2 mis à décharger l'intégrateur donne la valeur d'entrée

Chapitre III conception matériel

III.6.2.1.4. Parallèle (flash) : Principe :

Figure .III.6 : le convertisseur Flash

C'est un réseau de comparateur mis en parallèle. Un codage sur n bits nécessite 2n-1 comparateurs et résistances.

Facteurs clefs : temps de conversion, résolution, précision, linéarité, codes manquants, fenêtre d'acquisition, impédance d'entrée, bruit

III.6.3. Effecteurs : influent sur l'environnement :

moteurs, servomoteurs, valves, restitution de son (haut-parleurs, buzzers, ...), relais, afficheurs, Contrôleurs d'effecteurs, conversion N/A, amplification, interrupteurs de puissance (IGBT, MOS,...),relais, générateurs PWM ,FPAA

III.6.3.1. Les Convertisseurs Numériques Analogiques :

Définition : On souhaite à partir d'une information numérique, codée sur n bits, récupérer un signal analogique, image du numérique.

Principe : Chaque bit va être associé à un interrupteur qui connectera (1) ou non (0) une source (de courant) sur la sortie.

- sortie quantifiée et échantillonnée - filtrage souvent nécessaire !

Facteurs clefs : résolution, linéarité, temps de conversion, glitches : échantillonneur, bloqueur en sortie, bruit...

III.6.4. Interface homme machine :

> entrées de données (clavier, boutons poussoirs, interrupteurs à main, à pied) > dispositifs de pointage (souris, touchpad, stylos optiques)

> afficheurs (LED, afficheurs LCD, écrans CRT, sortie télévision)

III.6.5. Interfaces associées :

> multiplexage du clavier

> protection / isolation de l'environnement > alimentation des afficheurs

III.6.6. Les mémoires :

III.6.6.1. Mémoire non volatiles :

Une mémoire non volatile est une mémoire qui conserve ses données en l'absence d'alimentation électrique. On distingue les mémoires mortes (ROM), et les mémoires de type RAM non volatiles (NVRAM pour non-volatile RAM).

· stockage

- du programme (firmware)

- de données de calibration ou de configuration

· encore peu de disques durs, ou bien disques amovibles

· horloges temps réel (RTC) sauvegardées par batteries

- Il y'a plusieurs types (mask-ROM / OTP-ROM, EPROM, EEPROM, Flash, RAM sauvegardées par batteries).

III.6.6.2. Mémoire vive :

La mémoire vive, mémoire système ou mémoire volatile, aussi appelée RAM de l'anglais Random Access Memory (que l'on traduit en français par 'mémoire à accès direct'), est la mémoire informatique dans laquelle un ordinateur place les données lors de leur traitement. Les caractéristiques de cette mémoire sont :

Sa rapidité d'accès (cette rapidité est essentielle pour fournir rapidement les données au processeur) ;

Sa volatilité (cette volatilité implique que les données sont perdues dès que l'ordinateur cesse d'être alimenté en électricité).

Les Types :

> Statique: SRAM, SSRAM, ZBT-RAM, NoBL-RAM, > Dynamique : DRAM, SDRAM, DDRAM, ...

Les Fonction :

Fonctionnement du CPU

Acquisition / restitution de données à haut débit (tampons)

Le choix du type de RAM est souvent dicté par le type d'interface disponible sur le processeur

Chapitre III conception matériel

III.6.7. Circuit logique programmable « FPGA » :

Un circuit logique programmable, ou réseau logique programmable, est un circuit intégré logique qui peut être reprogrammé après sa fabrication.

Il est composé de nombreuses cellules logiques élémentaires librement assemblables.

La plupart des grands FPGA modernes sont basés sur des cellules SRAM aussi bien pour le routage du circuit que pour les blocs logiques à interconnecter.

FPGA jouant le rôle de coprocesseur afin de proposer des accélérations matérielles au processeur.

Quelques fonctionnalités particulières disponibles sur certains composants :

· blocs de mémoire supplémentaires (hors des LUT), souvent double-port, parfois avec mécanisme de FIFO,

· multiplieurs câblés (coûteux à implémenter en LUT),

· coeur de microprocesseur enfoui (dit hard core),

· blocs PLL pour synthétiser ou resynchroniser les horloges,

· reconfiguration partielle, même en cours de fonctionnement,

· cryptage des données de configuration,

· Sérialiseurs / désérialiseurs dans les entrées-sorties, permettant des liaisons série haut-débit, impédance contrôlée numériquement dans les entrées-sorties, évitant de nombreux composants passifs sur la carte.

III.6.8. Unité centrale de traitement (Central processing unit « CPU ») :

Le processeur, (ou CPU, Central Processing Unit, « Unité centrale de traitement » en français) est le composant essentiel d'un ordinateur qui interprète les instructions et traite les données d'un programme.

La vitesse de traitement d'un processeur est encore parfois exprimée en MIPS (million d'instructions par seconde) ou en Mégaflops (millions de floating-point operations per second) pour la partie virgule flottante, dite FPU (Floating Point Unit). Pourtant, aujourd'hui, les processeurs sont basés sur différentes architectures et techniques de parallélisation des traitements qui ne permettent plus de déterminer simplement leurs performances. Des programmes spécifiques d'évaluation des performances (benchmarks) ont été mis au point pour obtenir des comparatifs des temps d'exécution de programmes réels.

C'est le processeur qui apporte aux ordinateurs leur capacité fondamentale à être programmés, c'est un des composants nécessaires au fonctionnement de tous les types d'ordinateurs, associés aux mémoires primaires et aux dispositifs d'entrée/sortie. Un processeur construit en un seul circuit intégré est communément nommé microprocesseur, à l'inverse, certains fabricants ont développé des processeurs en tranches, dans ce cas les fonctions élémentaires (ALU, FPU, séquenceur, etc.) sont réparties dans plusieurs circuits intégrés spécialisés.

L'invention du transistor en 1947 a ouvert la voie de la miniaturisation des composants électroniques et le terme d'unité centrale (CPU) est utilisé dans l'industrie électronique dès le début des années 1960 (Weik 1961). Depuis le milieu des années 1970, la complexité et la puissance des

microprocesseurs n'a cessé d'augmenter au-delà de tous les autres types de processeurs au point qu'aujourd'hui les termes de processeur, microprocesseur ou CPU, s'utilisent de manière indifférenciée pour tous les types de processeurs.

Les processeurs des débuts étaient conçus spécifiquement pour un ordinateur d'un type donné. Cette méthode coûteuse de conception des processeurs pour une application spécifique a conduit au développement de la production de masse de processeurs qui conviennent pour un ou plusieurs usages. Cette tendance à la standardisation qui débuta dans le domaine des ordinateurs centraux (mainframes à transistors discrets et mini-ordinateurs) a connu une accélération rapide avec l'avènement des circuits intégrés. Les circuits intégrés ont permis la miniaturisation des processeurs dont les dimensions sont réduites à l'ordre de grandeur du millimètre. La miniaturisation et la standardisation des processeurs ont conduit à leur diffusion dans la vie moderne bien au-delà des usages des machines programmables dédiées. On trouve les microprocesseurs modernes partout, de l'automobile aux téléphones portables, en passant par les jouets pour enfants.

III.7. Conclusion :

L'évolution de la conception matérielle des systèmes embarqués présente l'avantage d'une intégration plus poussée qui va dans le sens des besoins en miniaturisation de ces systèmes mobiles. En revanche, le développement de ces systèmes fortement intégrés présente de nouvelles difficultés : à la différence des systèmes sur cartes où un prototype de chaque sous système pouvait être réalisé et testé séparément au fur et à mesure du développement, un SoC destiné à une cible ASIC doit avoir été développé entièrement avant de pouvoir être mis sur silicium. Le coût de fonderie d'un ASIC en faible quantité est en effet trop élevé pour qu'un prototype de chaque sous système soit réalisé.

Chapitre IV

Sécurité des systèmes embarqués

Chapitre IV sécurité des systèmes embarqués

IV.1.Introduction :

Les réseaux et systèmes informatiques prennent un rôle et une place chaque jour plus importants dans tous les aspects des activités humaines. Les situations multiples dans lesquelles il est indispensable de savoir définir et garantir leur sécurité concernent aussi bien les activités professionnelles qu'associatives ou personnelles. La sécurité se décline alors de nombreuses manières, par exemple dans le cadre des transactions électroniques mais également dans la protection des données, des informations, des personnes et des biens. Dans ce contexte, la sécurité comprend en particulier celle des systèmes, des logiciels, des protocoles, des architectures globales, des composants matériels, des réseaux tant filaires ou optiques que radios, des équipements d'extrémités, des moyens de stockage de l'information. Par ailleurs, le caractère distribué, ouvert, mobile, ubiquitaire, de beaucoup de systèmes complexifie grandement le problème et la recherche de solutions.

Par ailleurs, la sécurisation des systèmes d'information repose sur de nouvelles techniques de sécurisation algorithmique, mais aussi sur des principes physiques comme la cryptographie quantique ou la cryptographie par chaos.

L'informatique a un rôle crucial dans la sûreté de fonctionnement des systèmes technologiques critiques et/ou complexes, tels que les centrales nucléaires, les avions et engins spatiaux, les systèmes industriels de production continue (électricité, pétrole, chimie, métallurgie, sidérurgie), les grands ouvrages de génie civil (barrages, ponts, plateformes pétrolières), les véhicules et les infrastructures des systèmes de transport routiers et ferroviaires. En raison de la diffusion massive de capteurs de toutes natures, ces systèmes bénéficient à l'heure actuelle d'une instrumentation conséquente, et leur sûreté de fonctionnement passe par la conception d'algorithmes de traitement in-situ des données numériques ainsi disponibles. Sur la base des informations et connaissances disponibles (instrumentation, modèles), il s'agit alors en particulier d'opérer une véritable perception (détection, localisation, diagnostic) et réaction (correction, tolérance, maintenance) par rapport aux événements imprévus ou d'évolutions ou de déviations par rapport à un état ou un comportement de référence normal, souhaitable ou nominal. Les événements et déviations en question concernent aussi bien le système proprement dit que son environnement humain et technique, en particulier les infrastructures informatiques.

IV.2.Cryptologie :

IV.2.1 Introduction :

La cryptologie est la science du secret, elle se divise en deux branches :

> La cryptographie : qui étudie les différentes possibilités de cacher, protéger ou contrôler l'authenticité d'une information;

> La cryptanalyse : qui étudie les moyens de retrouver cette information à partir du texte chiffré (de l'information cachée) sans connaître les clés ayant servi à protéger celle-ci, c'est en quelque sorte l'analyse des méthodes cryptographiques.

La cryptographie doit garantir certains principes qualifiant la bonne sécurité d'un système:

1.

Confidentialité : grâce à un chiffrement pour que les données soient illisibles par une personne tierce et ainsi garantir que l'information est restée secrète de bout en bout.

2. Authentification : afin que personne ne puisse se faire passer pour la source de l'information, que la provenance des données soit garantie.

3. Intégrité : pour que les données ne puissent pas être modifiées sans qu'on ne s'en rende compte.

IV.2.2 Confidentialité :

La confidentialité est historiquement le premier but des études en cryptographie : rendre secrètes des informations.

Cela se réalise par un chiffrement mathématique des données qui utilise comme paramètre une clé. Le chiffrement consiste à appliquer une suite d'opérations sur un texte clair, pour obtenir un texte chiffré, aussi appelé cryptogramme, ne pouvant être déchiffré que par l'entité qui possède la clé adéquate.

Il existe deux catégories de chiffrements:

· Le chiffrement symétrique également appelé le chiffrement à clé secrète:

· Le principe est de chiffrer le texte clair avec une clé et de le déchiffrer avec la même clé ou une clé dérivée de celle-ci. La clé n'est connue que par les deux entités s'échangeant des informations.

Le chiffrement asymétrique également appelé le chiffrement à clé publique: Les clés utilisées pour le chiffrement et le déchiffrement sont différentes et ne peuvent être déduites l'une de l'autre par un observateur extérieur sans la connaissance des informations nécessaires. Une des clés peut être connue de tous tandis que l'autre doit rester secrète. Le but étant que tout le monde puisse à l'aide d'une clé publique chiffrer des données que seule l'entité possédant la clé secrète puisse déchiffrer. La vision d'un ensemble de textes chiffrés ne doit apporter aucune information sur le texte clair, c'est ce qu'on appelle la notion de sécurité sémantique (propre au chiffrement asymétrique).

Dans le cadre de la sécurité dans les systèmes temps réel qui doivent respecter des contraintes de temps, nous nous intéresserons plus particulièrement au chiffrement symétrique qu'il est préférable d'utiliser car le chiffrement asymétrique a été montré comme plus complexe au niveau du temps de calcul.

IV.2.3. Intégrité et authentification :

Le réseau reliant les entités n'étant pas toujours sûr, il est important de contrôler la provenance des informations et de s'assurer qu'elles n'ont pas été modifiées en chemin, ce sont respectivement les principes d'authentification et d'intégrité des données.

Afin de garantir ces deux principes, on utilise des codes d'authentification de message (MAC: Message Authentication Code). Un MAC est un code envoyé avec le message, il est aussi appelé hachage ou empreinte du message. Le hachage correspond au message et permet de garantir la validité de celui-ci. Il est obtenu à partir d'un algorithme MAC qui prend deux paramètres en entrée: le message dont on désire garantir l'intégrité et une clé secrète connue des deux entités s'échangeant ce message.

Chapitre IV sécurité des systèmes embarqués

La probabilité que des données différentes possèdent le même hachage est très faible, c'est ce qu'on appelle une « collision ». La probabilité de trouver une collision et que le message possédant le même hachage soit compréhensible par le récepteur est quasi nulle. Une modification même très légère des données provoque un changement radical au niveau du hachage obtenu. Si une modification a lieu entre la source et la destination, le hachage ne correspondra plus aux données et celles-ci seront rejetées par le récepteur.

Le fait d'utiliser une clé secrète partagée entre les deux entités en plus de la fonction de hachage garantit l'authenticité des données étant donné qu'un attaquant ne connaissant pas la clé ne peut envoyer des informations accompagnées d'un hachage correct de celles-ci.

Différentes méthodes existent pour créer une empreinte du message:

· une fonction de hachage utilisant une clé en paramètre en plus du message (ex : HMAC);

· un chiffrement par blocs (comme les méthodes CBC-MAC).

IV.3. Les menace de sécurités :

IV.3.1. Types d'attaquants (menaces) :

· Terroristes (but : destruction) ;

· Ennemis (but : causer des désagréments) ;

· Espions, services de renseignement (gouvernementaux, industriels) (but : informations) ;

· Concurrents industriels (but : prise de part de marché) ;

· Pirates (but : vol) ;

· Hackers (but : défi, jeux).

IV.3.2. Objectifs des attaques :

· Accéder aux données privées et secrètes pour accéder à un niveau supérieur d'information (exemple: clé de cryptage pour décoder un message crypté) ;

· Accéder aux données privées pour les modifier ou les détruire ;

· Copier les données de conception pour reconstruire ou améliorer un système ;

· Prendre en main un système pour le détourner de sa fonction ou pour le détruire.

IV. 3.3. Classement des attaques :

Il y'a des différentes manières pour classer ces attaques, et on peut les classés en deux catégories comme le montre la figure IV.1.

Figure .IV.1 : Classement des attaques

IV.3.3.1. Les attaques logicielles :

IV.3.3.1.1. Infections informatiques, codes malveillants :

Programmes simples qui exécutent un programme en tâche de fond (dans le cas de la bombe logique le départ du programme est retardé). Ils ne peuvent pas se reproduire, ils servent souvent à ouvrir une brèche cachée dans le système pour y faire pénétrer un pirate, par exemple : Cheval de Troie et Bombe Logique.

Programmes autoreproducteurs par exemple : Un ver est un virus très virulent qui se diffuse de façon planétaire.

IV.3.3.1.2. Vulnérabilités logicielles :

La plus part des systèmes embarqués ont une zone mémoire extérieure au SoC principal. Des données et des instructions sont échangés entre le processeur et la mémoire sur un ou plusieurs bus (adresse, instruction, donnée)

Menaces (logicielle ou matérielle) : Lecture non autorisée de données, Injection de code, Modification des données.

bus de donné

SoC
(sécurisé)

bus d'adresse

Mémoire
externe

IV.3.3.1.3. Modèle de menaces :

Hypothèse de départ : le SoC est dans un environnement sécurisé à contraire de la mémoire externe qui n'est pas dans un environnement sécurisé (voir la figure IV.2)

Chapitre IV sécurité des systèmes embarqués

Figure IV.2 : modèle de menaces

Dans ce cas il y'a deux modèles d'attaques :

1. Attaques passives : écoute du bus (bus probing) et l'objectifs de l'attaque par analyse horsligne du code est la reconstitution d'une clé de chiffrement, reconstitution de message, matière première pour préparer une attaque active.

2. Attaques actives : modification du contenu de la mémoire (memory tampering). Il y'a trois types d'attaques actives sont définies en fonction du choix fait par l'attaquant : 1' Spoofing: injection aléatoire de données.

1' Splicing: permutation spatial de données.

1' Replay (rejeu): permutation temporelle de données.

Les objectifs de ces attaques : détournement du code, réduire l'espace de recherche pour la reconstruction d'une clé ou d'un message.

IV.3.3.2. Les attaques matérielles :

IV.3.3.2.1. Vulnérabilités matérielles :

Plusieurs types de menaces peut être considérés en fonction de l'environnement et de la possibilité d'accès ou non à l'intérieure du système (voir la figure IV.3)

Figure IV.3 : types de menaces

Chapitre IV sécurité des systèmes embarqués

IV.3.3.2.2. Attaques physiques irréversibles (Invasive attacks, tampering) :

> Découpage du circuit intégré > Attaque chimique de la puce > Découpage du layout

> Analyse microscopique

> Reconstruction du layout

IV.3.3.2.3. Attaques physiques réversibles:

> Décapsulage : cette attaque utilisée dans les systèmes matériels portables, légers, peuvent être facilement substitué puis attaqués matériellement.

> Injection de fautes (non-invasive ou semi-invasive attacks) : les attaques par perturbation sont extrêmement puissantes et permettent à un attaquant de casser un système non protégé plus rapidement que n'importe quelle autre attaque par canaux auxiliaires. Par conséquent, ces attaques sont largement utilisées pour valider la sécurité des applications sensibles s'exécutant dans un environnement carte à puce. Et cette attaque est faite par :

> Glitch (power, clock) qui altéré le fonctionnement du système.

> Flash lumineux qui agit sur les technologies EPROM/E2PROM/Flash pour modifier une partie du système.

> Ionisation locales qui se fait par l'utilisation du Laser pour les mémoires CMOS SRAM.

IV.3.3.2.4. Les canaux cachés :

Les attaques par canaux cachés (auxiliaires) dans l'environnement de la carte à puce sont composées des quatre catégories présentées ci-dessus :

- analyse de temps d'exécution ;

- analyse de courant/de fréquences radio ;

- analyse du rayonnement électromagnétique ;

- attaques par perturbation (Bien que ce dernier type d'attaque n'utilise pas directement les informations disponibles par canaux auxiliaires, il est très souvent classé comme tel dans la littérature).

IV.4. Contres mesures :

1' Symptôme Gratuit (Symptom Free) : ne fournir aucune information par fuite pour éviter les attaques passives.

v' Consciente de sécurité (Security Aware) : être toujours conscient de son état et notamment de sa vulnérabilité dans le but d'être réactif.

v' Conscient d'activité (Activity Aware) : Analyser son environnement pour détecter une

activité irrégulière en embarquant des capteurs et des systèmes de surveillance.

1' Système agile (Agile System) : Etre flexible pour pouvoir rapidement répondre à une attaque

ou alors anticiper l'attaque.

v' Mise à jour du logiciel et de matériel (Software or Hardware update) : Remettre à jour facilement les mécanismes de sécurité en fonction de l'évolution des attaques.

v' Resistance contre les erreurs : Etre résistant aux sabotages et attaques physiques.

v' Efficacité (Efficient) : Rester performant : ressources limités des systèmes embarqués plus contraintes fortes (consommation de puissance et d'énergie, débit, latence, surface).

IV.5. Conclusion :

La sécurité des systèmes et des données est un problème critique pour nos sociétés développées a cause des : Coûts de plus en plus important, le nombre d'attaques logicielles explose, de plus en plus de systèmes embarqués mobiles et communicants, menaces fortes des attaques matérielles. Et pour aborder la sécurité des systèmes et des données qui subissent des attaques sont soft ou hard impliquant des protections soft ou hard, il faut envisager des solutions à tous les niveaux, du système au transistor, définir des politiques de sécurité (sécurisé suffisante au bon moment), définir des méthodes de conception sécurisée assurant les performances des systèmes, ne rien négliger (aspect humain, légal, logicielle, matérielle, extérieur, intérieur).

La sécurité sa concerne qui : l'informatique, l'électronique (embarquée en particulier), les télécommunications, les individus, les entreprises, la Société...

La sécurité des systèmes embarqués est donc cruciale aujourd'hui et doit être prise en compte dès leur conception sous peine de voir apparaître une armée de crackers prompts à venir planter votre belle chaudière high tech !

Conclusion général

Conclusion général :

L'évolution des technologies des systèmes sur puce « SoCs » offre aujourd'hui des perspectives d'intégration importante. Désormais, des systèmes complexes peuvent être intégrés dans des processeurs sur le même circuit SoC. D'autre part, les applications de compression vidéo sous contrainte d'exécution temps réel présentent des complexités énormes. C'est pourquoi, les architectures multiprocesseurs sur puce implémentant ces applications doivent être capables de supporter plusieurs fonctionnalités et de les mettre en oeuvre dynamiquement. Dans ce contexte, les méthodologies de conception doivent évoluer pour faciliter le développement, la validation et le prototypage de ces systèmes complexes.

Les concepteurs des systèmes électroniques sont confrontés à la complexité croissante des algorithmes mis en oeuvre et à la variété des cibles potentielles FPGAs et/ou DSPs.

Les concepteurs sont forcés de migrer, d'une part, à un niveau d'abstraction plus élevé pour le prototypage rapide de leurs applications sur des plateformes reconfigurables et d'autre part d'envisager la conception de systèmes MPSoC (Multiprocessor System on Chip) basés sur les NoC (Network on Chip). On a étudié un système embarqué dans son environnement, où les tâches prédéfinies ont un cahier des charges contraignant à remplir, qui peut être d'ordre :

1. Coût; prix de revient doit être le plus faible possible surtout s'il est produit en grande série.

2. Espace compté, ayant un espace mémoire limité de l'ordre de quelques Mo maximum. Il convient de concevoir des systèmes embarqués qui répondent au besoin au plus juste pour éviter un surcoût.

3. Puissance de calcul. Il convient d'avoir la puissance de calcul juste nécessaire pour répondre aux besoins et aux contraintes temporelles.

On a évoqué les systèmes embarqués de la première à la dernière génération en mentionnant les métiers pour la conception des systèmes sur puces et la conception des systèmes sur cartes.

L'utilisation d'un système embarqué dans la réception d'images satellites permet d'en apprendre beaucoup dans des domaines variés et sera comme la première thématique de recherche dans le futur proche. Enfin, en étudiant les systèmes embarqués, j'ai pu faire une percée dans ce domaine vaste, important et utile dans notre vie quotidienne ainsi que dans des domaines spécifiques.

Bibliographie

Bibliographie

INTERNET :

> http://richard.grisel.free.fr/Master_OSM/2_Introduction_Embedded_systems.pdf

> http://www.rfc1149.net/download/documents/12-os.pdf

> http://sen.enst.fr/ue/elec344/cours_architecture

> http://www.univ-valenciennes.fr/ROI/niar/Master1/Inem/ch2.ppt

> http://www.univ-valenciennes.fr/ROI/niar/Master1/Inem/ch3.ppt

> http://perso.citi.insa-lyon.fr/trisset/cours/MasterWeb/index.html

> http://pficheux.free.fr/articles/lmf/embedded/

> http://cllfst.tuxfamily.org/index.php?option=com_jotloader&section=files&task=download& cid=2_59926e273ae6768c4ce63de3d2735231&Itemid=78

> http://www-valoria.univ-ubs.fr/jp-ifsic/2006/pdf/exposes/IntroSystemesEnfouisFB.ppt

> http://www.unixgarden.com/index.php/embarque/les-systemes-embarques%%A0-uneintroduction

> ftp://ftp-developpez.com/kadionik/systeme/linux-embarque.pdf

> http://www.enseirb.fr/~kadionik/embedded/linux_SoC/linux_SoC.pdf

> http://deptinfo.cnam.fr/new/spip.php?pdoc3929

> http://www.ecole.ensicaen.fr/~lefebvre/cours/rse.pdf

> http://users-tima.imag.fr/vds/lpierre/M2Archi/B7.html

> http://www.electroniciens.aquitainelimousin.cnrs.fr/IMG/pdf/securite_materielle_des_systemes_et_des_donnees.pdf

> http://www.irit.fr/~Iulian.Ober/str/STR-1.1.IntroSTR.pdf

> http://fr.wikipedia.org/wiki/Syst%C3%A8me_embarqu%C3%A9

> http://www1.ifi.auf.org/rapports/tpe-promo10/tipe-pham_viet_hung.pdf

> http://tic.rcso.ch/Portals/0/docs/uml_for_embedded30.pdf

LIVRES :

> Conception des logiciels embarqués pour les systèmes monopuces, sous la direction de Lovic Gauthier, Lavoisier 2003

Mémoires de fin d'étude :

> Proposition d'une architecture mixte logiciel/matériel pour les algorithmes du traitement d'image 2007/2008

> La régulation d'une serre agricole à l'aide d'un contrôleur PID en logique floue 2006/2007

Glossaire

Glossaire :

A

Ada Est un langage de programmation orienté objet dont les premières versions remontent au

début des années 1980.

API Application Program Interface

Ensemble de routines standards destinées à faciliter au programmeur le développement d'applications.

ASIC Application Specific Integrated Circuit

Circuit intégré développé Spécifiquement pour une Application

B

BIOS Basic Input Output System

Système élémentaire d'entrée/sortie.

C

COLIF COdesign language independent format

Langage de représentation de la composition de systèmes hétérogènes embarqués en niveaux d'abstraction, en protocoles de communication et en langages de description.

CORBA Common Object Request Broker Architecture

Architecture commune de courtier d'objets de requête : une norme établie par l'Object Management Group (OMG) (groupe de gestion des objets), destinée à la communication entre objets répartis.

COSYMA Système digital de gestion des communications.

CPU Central Processor Unit

Partie principale d'un système, réservée aux traitements.

D

DSP Digital Signal Processor

Processeur spécialisé pour le calcul d'algorithmes de traitement de signal. DMA Direct Memory Access

L'accès direct à la mémoire.

E

eCos Système d'exploitation temps réel. Il permet de réaliser des applications temps réel.

F

FIFO First In First Out

Classe ou protocole de communication qui assure que les premières données envoyées sont les premières reçues.

FPGA Field Programmable Gate Array

Réseau prédiffusé programmable par l'utilisateur : Réseau prédiffusé de portes logiques qui est destiné à être programmé sur place, avant d'être utilisé pour une fonction particulière.

G

GSM Global System for Mobile Communications

I

IP Intellectual Property

Élément (logiciel ou matériel) dont le fonctionnement est connu et documenté, mais dont la structure interne est inconnue.

ITRS International Technology Roadmap for Semiconductors.

Organisation ayant pour but le développement des semi-conducteurs.

M

MCU Micro-Controller Unit

Puce constituée d'éléments intégrés lui permettant de fonctionner comme une unité autonome, et conçue spécifiquement pour contrôler un dispositif donné.

N

N2C Napkin-to-Chip

Extension de C utilisée dans l'environnement de conception CoWare pour la description des systèmes.

Nucleus RTOS Système d'exploitation temps réel.

O

OS Operating System

Un operating system ou système d'exploitation, est une couche logicielle permettant d'abstraire une architecture matérielle à la vue de l'application logicielle afin de gérer implicitement l'utilisation partagée des ressources, mais aussi de garantir la portabilité de l'application sur des architectures diverses.

P

PDA Personal Digital Assistant

Un assistant personnel ou ordinateur de poche est un appareil numérique portable, souvent appelé par son sigle anglais pour.

pSOS Système d'exploitation temps réel.

PC Personal Computer

Q

QNX (prononcé Q-N-X ou Q-nix) est un système d'exploitation UNIX commercial temps réel

compatible POSIX, conçu principalement pour le marché des systèmes embarqués. Il utilise un micro-noyau.

R

RAM Random Access Memory

Mémoire à accès direct.

ROM Read Only Memory

Mémoire morte.

RTL Register Transfer Level

Niveau d'abstraction pour la spécification des systèmes.

RTOS Real Time Operating System

Logiciel d'exploitation en temps reel.

S

SDL Specification and Design Language

Langage de haut niveau pour la spécification non-ambiguë des systèmes comportant des processus parallèles.

SoC System on Chip

Système monopuce - circuit intégrant sur une même puce différents composants fonctionnels (ex. mémoires, processeurs).

STB Set-top box

Adjoint de poste de télévision (ou littéralement boîte de dessus de poste).

Glossaire

SEP Simulation et Evaluation de Performance

T

TDMA Temporal Division Multiple Access

Accès multiple à répartition dans le temps, multiplexage temporel qui consiste à diviser le temps en petits intervalles. Les utilisateurs émettent alors sur des intervalles de temps différents.

U

UML Unified Modelling Language

Langage de modélisation, permettant de déterminer et de présenter les composants d'un système lors de son développement, ainsi que d'en générer la documentation.

V

VHDL Very high-scale integrated Hardware Description Language

Langage de description de système électronique numérique, basé sur une extension d'Ada.

W

Windows CE Windows Embedded Compact

Parfois abrégé WinCE, est une variation de Windows pour les systèmes embarqués et autres systèmes minimalistes, utilisée notamment dans les PC de poche ou Handheld. Il utilise un noyau distinct des autres Windows plutôt qu'une version allégée et supporte les architectures processeur Intel x86 et similaires, MIPS (jusqu'à CE 3.0), ARM et aussi Hitachi SH.






Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy








"Le don sans la technique n'est qu'une maladie"