Architectures embarquées pour les ADAS

Depuis quelques années, le véhicule autonome est devenu un sujet très porteur, que ce soit au niveau de l’impact médiatique sur le grand public ou l’investissement des industriels. Pourtant le sujet n’est pas si nouveau, dès 1980 et 1990 un grand nombre de démonstrations autour du concept de la voiture autonome existait déjà. Par exemple, en octobre 1994, les véhicules VaMP et VITA-2 ont effectué un trajet en conduite autonome sur l’autoroute A1 à la vitesse de 130 km/h. Depuis les années 2010, un grand nombre d’industriels ont annoncé un intérêt dans le véhicule autonome. Cela concerne bien évidemment l’ensemble des constructeurs automobiles qui ont communiqué à ce sujet, mais également de nouveaux acteurs, jusque-là inconnu dans le monde de l’automobile, tel que Google ou Apple. Même le milieu du sport automobile s’intéresse de près à ce sujet, la FIA a annoncé en 2015 le lancement d’un championnat de véhicule autonome : Robotrace. À l’heure actuelle, plusieurs limitations techniques et législatives font que le véhicule autonome n’est pas encore commercialisé ni accessible au grand public. Cependant, les constructeurs automobiles proposent de plus en plus de systèmes permettant d’assister le conducteur, voire d’automatiser certaines tâches : il s’agit des systèmes d’aide à la conduite. Finalement, l’industrie automobile est aujourd’hui dans un tournant : un véhicule, autrefois un engin purement mécanique, est en train de se transformer en un système complexe comprenant de plus en plus de capteurs et avec une composante logicielle de plus en plus présente. Il est donc tout à fait logique que des géants du logiciel tels que Google ou Apple s’intéressent de près au véhicule intelligent. Cette transformation amène de nouvelles problématiques, notamment un besoin de plus en plus grand en termes de puissance de calcul embarqué dans le véhicule.

Parmi les capteurs utilisés par les constructeurs automobiles, beaucoup de systèmes d’aides à la conduite utilisent des caméras et des algorithmes de traitement d’images pour percevoir l’environnement autour du véhicule. Or, ces algorithmes représentent une charge de calcul intensive à cause d’une très grande quantité de données à traiter. En effet, une caméra transmet généralement plusieurs dizaines d’images par secondes, chaque image étant composée d’environ 1 million de pixels. Pour répondre à ce besoin croissant de puissance de calcul, les fabricants de semi conducteurs proposent depuis quelques années des systèmes embarqués à hardware mixte, ou à architectures hétérogènes. Ces systèmes intègrent sur une même puce plusieurs processeurs différents, permettant de proposer une grande flexibilité et une forte puissance de calcul. Cependant, à cause du caractère hétérogène, l’implantation d’un algorithme sur ce type de système est loin d’être triviale. De plus, du fait de la grande variété des calculateurs embarqués pour l’automobile, le choix d’une architecture de calcul pour embarquer une application donnée reste une opération très complexe pour le constructeur automobile.

Architectures embarquées pour les ADAS

Les fonctions ADAS citées précédemment nécessitent de la puissance de calcul pour pouvoir traiter les données issues des différents capteurs, prendre des décisions et agir en conséquence (pilotage d’actionneur, alarme, etc.), dans le milieu automobile on parle alors d’Electronic Control Units (ECUs). Les conditions et normes automobiles imposent que ces systèmes de traitement soient de faible coût, peu consommateurs et sûrs d’un point de vue fonctionnel (norme ISO 26262). Ainsi il existe sur le marché un grand nombre d’architectures utilisées pour embarquer des applications automobiles, on parle également de Systems-on-Chip (SoCs) qui intègrent, sur une même puce, l’ensemble des éléments nécessaires à l’ECU (processeurs, mémoire, périphériques d’interface, etc.).

Architecture type

De manière générale, une architecture de calcul embarquée est composée de différents éléments que l’on peut classer suivant deux catégories : les unités d’exécution et les unités de mémoire.

Unités d’exécution
Une unité d’exécution permet d’exécuter un fil d’instructions (calculs et/ou accès mémoire) également appelé thread. Elle est composée de plusieurs unités élémentaires qui sont activées d’une manière sélective suite au décodage de différents types d’instructions. On distingue ainsi les unités élémentaires suivantes :
— Unité arithmétique et logique délivrant les opérations d’additions, ou/et logique, etc. (nombre entier et virgule fixe).
— Unité de multiplication se chargeant d’appliquer les multiplications ou les multiplications – accumulations.
— Unité de calcul en virgule flottante permettant d’effectuer des opérations sur les variables à virgule flottante (additions et multiplications).
— Unités de calcul spécifique : unités optionnelles qui encapsulent une implémentation hardware spécifique d’une ou plusieurs instructions (par exemple cos, sin, etc.).
— Unité de branchement gérant les instructions du type condition (comme if ) ou boucle (comme for). Elles sont souvent liées à des unités de prédictions qui peuvent mettre en place une exécution spéculative du fil d’instruction.
— Unité d’adresse permettant le calcul d’adresses, par exemple accès à la n e valeur d’un vecteur par l’opérateur [n].
— Unité Load & Store se chargeant de faire l’interface entre les registres du processeur et la mémoire du système, en utilisant les unités d’adresses.

Unités de mémoire
Les unités de mémoire permettent de stocker de l’information. Généralement, on caractérise la mémoire par sa capacité de stockage (quantité d’information), sa bande passante (vitesse d’échange de l’information) et sa latence (délai pour obtenir une information). Il existe plusieurs niveaux de mémoires, allant du voisinage le plus proche des unités d’exécution (mémoires très rapides mais de très petite taille) au stockage de masse, beaucoup plus lents (comme les mémoires non-volatiles).

Registre Les registres constituent la mémoire la plus rapide d’un processeur. Les résultats des instructions sont généralement stockés sur des registres avant d’être sauvegardés en mémoire (par le biais d’instruction Load & Store). Le nombre et la taille des registres (souvent 32 ou 64 bits) varient d’un processeur à l’autre.

Mémoire cache La mémoire cache correspond à la mémoire tampon entre le processeur et la RAM. Pour des raisons d’efficacité, elle est structurée en plusieurs niveaux de caches : L1, L2 et parfois L3, qui peuvent être uniques ou partagées entre plusieurs unités d’exécution ou cœurs d’un même processeur. Il s’agit de mémoires ayant de faibles latences d’accès mais de faibles capacités de stockage (en général pas plus de quelques Mo). Le cache agit comme une mémoire temporaire permettant de stocker des données préalablement utilisées, pour diminuer le temps d’un accès ultérieur. Ainsi, lorsque l’unité d’exécution cherche à accéder à une donnée qui se trouve déjà dans le cache, on parle alors de cachehit, l’accès sera très rapide. Dans le cas contraire, on parle de cache-miss, la latence d’accès sera beaucoup plus lente. Remarquons qu’il existe plusieurs politiques et stratégies pour gérer la mémoire cache. Dans le cas de l’écriture, on distingue deux politiques :

— l’écriture immédiate (writhe-through) qui fait en sorte que les données sont écrites à la fois dans le cache et dans la mémoire centrale pour garantir une cohérence entre les différents niveaux de mémoire,
— l’écriture différée (write-back) qui évite des écritures répétées dans la mémoire centrale en se permettant de garder une différence entres les données dans le cache et celles présentes dans la mémoire. Les lignes du cache non cohérentes avec la mémoire centrale sont marquées d’un dirty bit .

RAM ou mémoire vive Il s’agit de la mémoire principale du système, elle permet de stocker de grande quantité de données (quelques Go). Cependant accéder de manière répéter à la RAM est souvent coûteux en termes de temps d’exécution à cause de sa forte latence. Notons que la majorité des mémoires RAM d’aujourd’hui sont qualifiées de double data rate (DDR). Ainsi, elles sont capables de transférer des données à la fois sur le front montant et le front descendant de l’horloge de la mémoire, soit deux transactions par coup d’horloge.

Mémoire non-volatile Cette mémoire conserve les données en l’absence d’alimentation électrique (utilisée notamment pour le stockage de l’OS), elle a souvent plusieurs centaines de Go de mémoire. On peut citer les disques durs, mémoires flashs (clés USB, cartes SD, etc.). Elle est cependant assez peu utilisée lors de l’exécution d’un programme temps-réel à cause de ses performances catastrophiques (sauf dans le cas d’applications spécifiques comme la gestion de base de données).

Processeurs
Le terme de processeur désigne un système électronique capable d’effectuer des opérations et ne se limite pas uniquement au Central Processing Unit (CPU). Un processeur est composé d’une ou plusieurs unités d’exécution et de certaines unités mémoire comme les mémoires cache. Un processeur peut intégrer plusieurs cœurs (on parle alors de multicœur), il est alors capable d’exécuter plusieurs threads simultanément et donc dispose de plusieurs unités d’exécution. Remarquons que le nombre de cœurs n’est pas toujours égal au nombre d’unités d’exécution, par exemple les processeurs Intel sont capables d’exécuter simultanément 2 threads par coeur (soit 2 unités d’exécution par cœur) grâce à l’Hyper-Threading .

Le calcul parallèle 

Certaines architectures ont la particularité d’être conçues pour procéder aux différents calculs de manière parallèle. Au vu des différents types de parallélisme, il est possible de définir plusieurs classes auxquelles peuvent se rattacher les différentes architectures de calcul. Ainsi, la taxonomie de FLYNN [1972] définit quatre classes :
— SISD (Single Instruction Single Data) : le calcul s’effectue de manière séquentielle, il n’y a aucune forme de parallélisme. Cela concerne les architectures n’étant pas capables d’effectuer plusieurs calculs de manière simultanée, effectuant les opérations les unes à la suite des autres (au maximum une instruction par cycle d’horloge). Par exemple un CPU monocœur, monoscalaire pipeliné appartient à cette classe.
— MISD (Multiple Instruction Single Data) : plusieurs opérations sont appliquées en même temps à une donnée unique. Très peu d’architectures se rattachent à cette classe.
— MIMD (Multiple Instruction Multiple Data) : capable d’effectuer plusieurs opérations sur différentes données de manière simultanée. Cela concerne les systèmes présentant plusieurs unités d’exécution, ces architectures sont donc capable d’effectuer des calculs concurrentiels sur plusieurs données.
— SIMD (Single Instruction Multiple Data) : une opération est appliquée à plusieurs données en même temps. Il s’agit de ce que l’on appelle des opérations ou architectures vectorielles.

Le rapport de stage ou le pfe est un document d’analyse, de synthèse et d’évaluation de votre apprentissage, c’est pour cela rapport-gratuit.com propose le téléchargement des modèles complet de projet de fin d’étude, rapport de stage, mémoire, pfe, thèse, pour connaître la méthodologie à avoir et savoir comment construire les parties d’un projet de fin d’étude.

Table des matières

INTRODUCTION
1 Contexte et problématiques
1.1 Introduction
1.2 Systèmes d’aide à la conduite
1.3 Architectures embarquées pour les ADAS
1.4 Analyse de l’embarquabilité
1.5 Démarche proposée
1.6 Références
2 Traitement d’images et architectures hétérogènes
2.1 Introduction
2.2 Traitement d’images pour les ADAS
2.3 Architectures hétérogènes pour les ADAS
2.4 Limitations et évolutions
2.5 Références
3 Méthodologie d’analyse d’embarquabilité
3.1 Introduction
3.2 Algorithmes et contraintes temps-réel
3.3 Optimisation du mapping
3.4 Méthodologie globale
3.5 Références
4 Caractérisation d’architectures de calcul
4.1 Introduction
4.2 État de l’art
4.3 Configuration et compilation
4.4 Vecteurs de test low-level
4.5 Vecteurs de test mid-level
4.6 Vecteurs de test high-level
4.7 Vers la prédiction de performances
4.8 Références
5 Prédiction de performances
5.1 Introduction
5.2 Travaux existant sur la prédictions de performances
5.3 Méthodologie de prédiction de performances
5.4 Résultats
5.5 Mapping et pipeline d’exécution
5.6 Références
6 Résultats et applications
6.1 Introduction
6.2 Odométrie visuelle
6.3 Détection de piétons
6.4 Références
7 Conclusion
CONCLUSION

Lire le rapport complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *