# ARINC 653

ARINC 653 est un standard de partitionnement temporel et spatial de ressources informatiques. Ce standard définit également des interfaces de programmation et de configuration qui permettent d'assurer l'indépendance de l'application vis-à-vis du logiciel et du matériel sous-jacent.
Le principe de partitionnement permet la coexistence sur la même plateforme, de fonctions avioniques de niveaux DO-178B DAL (Design Assurance Level) différents, et permet un processus de qualification incrémentale de ces fonctions, ainsi qu'un processus de ségrégation des fournisseurs de fonctions.
Il définit une API de portabilité pour les logiciels applicatifs avioniques adoptée notamment par les architectures IMA (Integrated Modular Avionics) ou AMI (Avionique modulaire intégrée) en français.

## Généralités

Une fonction avionique est réalisée par une décomposition logicielle et matérielle traçable par rapport aux spécifications de cette fonction. Dans le cadre d'une architecture IMA adoptant l'interface A653, cette décomposition est effectuée de la manière suivante:
* le logiciel applicatif décomposé en une ou plusieurs partitions exécutées par une ou plusieurs plateformes dont l'interface est l'A653.
* une ou plusieurs plateformes IMA composée d'une interface A653, de son implémentation logicielle et matérielle.

## Historique
### A653

Publication originale du 04/10/1996.

### A653-1

Publication du 16/10/2003. L'évolution majeure de cette révision est l'introduction de l'IMA (§1.3.1)

### A653-2

Publication du 07/03/2006. Le changement majeur est la division de la norme en trois parties :
* Partie 1 : interface standard.
* Partie 2 : interfaces optionnelles d'extension.
* Partie 3 : procédure de test de conformité.
Cette version précise certains points. Le fait que le processus d'initialisation continue en mode NORMAL ou pas dépend de l'implémentation.

### Implémentations spécifiques

Le standard Airbus est un exemple de standard industriel né en 2001/2002, entre les publications A653 et A653-1, dans le cadre des premiers développements IMA sur le programme A380. La publication A653-1 s'inspire largement du standard Airbus. La portabilité d'une application n'est donc que partielle entre ce standard industriel et la norme A653.

## Logiciel applicatif

Chaque partition a son propre espace mémoire et temporel, la ségrégation étant assurée par le système d'exploitation. Au sein de chaque partition, le multi-tâches est autorisé. Le langage d'implémentation recommandé par la norme est Ada, bien que le C soit également mentionné. Un simple fichier d'interface des services est fourni en annexe.
La portabilité de l'application est assurée par l'utilisation stricte des services de l'API standard, et ne doit en aucun cas reposer sur des comportements liés à l'implémentation matérielle et logicielle de la plateforme.

### L'initialisation

L'initialisation de la partition A653 est fondamentale. Elle a pour objectif la création des ressources, la gestion des modes de démarrage et des pannes (avec le Error Handler).
La création des ressources (PROCESS, EVENT, SEMAPHORE…) est effectuée par l'appel des services CREATE_..... L'appel de ces services vérifie l'existence et la disponibilité des ressources demandées avant l'attribution d'un handler ou identifiant utilisable par l'application.
L'initialisation est effectuée au sein d'un processus pourvu d'une pile, et que l'on peut assimiler au "main" d'une application native. Ce processus se termine par l'appel du service SET_PARTITION_MODE.
L'A653-2 précise que l'implémentation de la plateforme peut laisser le processus s'exécuter après l'appel de ce service, mais l'application ne doit en aucun cas dépendre de ce point pour garantir sa portabilité.

### Le gestionnaire d'erreurs (Error Handler)

Le gestionnaire d'erreurs est créé par l'appel du service CREATE_ERROR_HANDLER dans la phase d'initialisation de la partition.
Dès lors que le gestionnaire d'erreurs a été créé avec succès, il est appelé quand une exception se produit.
Le gestionnaire d'erreurs est un processus non préemptable. Il peut être vu comme le processus de plus haute priorité.
Lorsqu'un événement (exception) asynchrone (interruption matérielle, date d'échéance de processus) ou synchrone (violation de segment mémoire) est détecté par la plateforme A653, le gestionnaire d'erreurs préempte le processus en cours d'exécution.
Ce processus est censé traiter la cause de l'exception par exemple stopper le processus fautif, envoyer un message de maintenance.
Lorsque le gestionnaire d'erreurs se termine par l'appel du service STOP_SELF, l'ordonnanceur est appelé et élit le processus READY le plus prioritaire.
La norme A653 ne précise pas de comportement dans le cas où le gestionnaire d'erreurs ne traite pas la cause de l'exception. Une implémentation possible de l'A653 est de rappeler immédiatement le gestionnaire d'erreurs, ce qui mènerait à une boucle infinie entre le processus fautif et le gestionnaire d'erreurs.
Le gestionnaire d'erreurs dispose du service GET_ERROR_STATUS pour obtenir des informations sur la source de l'exception et du contexte d'apparition (compteur de programme, identifiant de processus).
Le gestionnaire d'erreurs joue un rôle particulier avec le processus d'initialisation. Le comportement opérationnel d'une partition avionique dépend beaucoup de la conception de ce processus.

### La gestion de mode

La partition dispose d'un attribut de mode qui prend sa valeur parmi :
* COLD_START
* WARM_START
* NORMAL
* IDLE
Dans les modes COLD_START et WARM_START, le processus d'initialisation seul s'exécute jusqu'à sa fin.
En mode NORMAL, le processus d'initialisation est arrêté et les autres processus sont élus par l'ordonnanceur selon la priorité de chacun.
En mode IDLE, aucun processus n'est en cours d'exécution. En pratique, l'implémentation peut être d'exécuter un processus caché de priorité minimale effectuant une boucle infinie.
Le service SET_PARTITION_MODE permet de passer d'un mode à l'autre. Ce service peut être appelé par n'importe quel processus.
Le mode IDLE est le seul mode irréversible pour la partition. Il faut un événement externe, comme le redémarrage de la plateforme, peut faire sortir la partition de ce mode.

### Les processus ou PROCESS

Une partition comprend au moins un processus. Un processus est une unité logicielle qui s'exécute en concurrence avec les autres processus de la partition. Un processus dispose d'attributs statiques et dynamiques.
Les attributs statiques sont :
* Le nom
* Le point d'entrée
* La taille de la pile
* La priorité de base
* La période (une valeur particulière est utilisée pour APERIODIC)
* La capacité temporelle
* Le type de contrôle d'échéance (matériel par interruption timer ou logiciel par polling)
Les attributs dynamiques sont :
* La priorité courante
* La date d'échéance (DEADLINE)
* L'état du processus
Le processus prend l'un des états :
* DORMANT : arrêté
* READY : présent dans la liste des processus éligibles pour l'ordonnancement
* WAITING : en attente, absent de la liste des processus éligibles pour l'ordonnancement
* RUNNING : en cours d'exécution
L'état WAITING dispose de sous-états qui précisent la raison de mise en attente :
* attente sur suspension
* attente d'une ressource
* attente du mode NORMAL (en mode COLD_START ou WARM_START)
* attente de la période suivante…
L'ordonnancement des processus est préemptif à priorité fixe. L'ordonnanceur est déclenché par interruption matérielle (timer) ou par appel de services de l'API. L'ordonnanceur dispose de la liste de processus READY, examine leur priorité courante et élit le processus le plus prioritaire qui passe à l'état RUNNING. Le processus précédemment à l'état RUNNING passe à l'état READY.

### L'utilisation des services

Certains services demandent des précautions d'usage :
SUSPEND et RESUME : ces services permettent de suspendre et reprendre l'exécution d'un processus P2 depuis un processus P1. Si le processus P1 s'arrête, le processus P2 reste suspendu indéfiniment.
STOP : si un processus obtient une ressource, puis est stoppé par un autre processus, la ressource reste inaccessible indéfiniment. Il n'est pas recommandé à l'implémentation de ce service, de libérer les ressources acquises par le processus arrêté, car elles sont dans un état indéterminé.

## La plateforme

La plateforme est composée :
* d'une cible pourvue de ressources matérielles permettant de rendre des services déterministes. En particulier, le déterminisme temporel d'exécution des instructions et d'interruption est nommé temps réel. La cible doit satisfaire les contraintes d'exploitation : maintenance modulaire, conditions de température, de pression, d'hygrométrie, de rayonnement électromagnétique, de vibration…
* d'une couche d'abstraction matérielle de la cible d'exécution (board support package), qui diffère d'un système d'exploitation classique par la contrainte de partitionnement de toutes les ressources matérielles de la plateforme (mémoire, microprocesseur, périphériques d'entrées/sorties).
* de l'implémentation des services de la norme A653
* d'une interface de configuration de cette plateforme et du domaine d'utilisation logiciel associé
* d'outils embarqués ou non, pour réaliser les exigences d'instrumentation, de configuration, de maintenance, de vérification de déterminisme.

### La cible

La cible est généralement composée d'un microprocesseur, d'horloges de précision, de mémoire vive, de mémoire morte, et d'entrées-sorties.

### La couche d'abstraction matérielle

Elle fournit les services de bas niveau pour partitionner les ressources de la cible.
Elle utilise généralement les services de la MMU (memory management unit) de la cible pour effectuer le partitionnement spatial, c'est-à-dire exclure l'accès à la mémoire d'une partition depuis une autre partition. Ce mécanisme peut en outre être effectué ou complété par un ASIC externe sur le bus reliant le microprocesseur à la mémoire.
Le partitionnement temporel est généralement effectué par des horloges matérielles internes au microprocesseur ou dans un ASIC externe piloté par un oscillateur à quartz précis. Le séquencement temporel des partitions est configuré statiquement.
Les drivers permettent l'abstraction de l'interface des entrées-sorties avioniques : bus A429, bus AFDX, USB, CAN (Controller area network), entrées-sorties numériques et analogiques, mémoire non volatile.

### Les services

Les services sont répartis en 7 catégories :
* Gestion de la partition
* Gestion des processus
* Gestion du temps
* Gestion de la mémoire
* Gestion des communications inter-partition
* Gestion des communications intra-partition
* Gestion des pannes
Chaque catégorie comprend au moins un service de création de ressource. Son implémentation peut être statique ou dynamique. Si elle est dynamique, l'implémentation devra s'assurer de la cohérence avec le domaine d'utilisation comme la disponibilité des ressources physiques…
L'ensemble des services retourne un paramètre RETURN_CODE pointé en cas d'exception. Le type énuméré RETURN_CODE prend les valeurs suivantes :
* NO_ERROR : requête valide et le service est effectué nominalement.
* NO_ACTION : l'état du système est inchangé après l'appel du service.
* NOT_AVAILABLE : le service est temporairement indisponible.
* INVALID_PARAM : au moins un paramètre du service est invalide.
* INVALID_CONFIG : au moins un paramètre du service est incompatible avec la configuration courante de la partition.
* INVALID_MODE : le service est incompatible avec le mode courant de la partition.
* TIMED_OUT : le délai imparti à l'exécution du service a expiré. L'état du système n'a pas été modifié.
Les paramètres OUT sont valides si et seulement si RETURN_CODE vaut NO_ERROR.

#### La partition

La partition est définie par son mode et sa condition de démarrage.
Le mode peut prendre les valeurs suivantes :
* IDLE : la partition est arrêtée. Aucun process n'est exécuté. Une implémentation classique est une boucle infinie, attendant une interruption de changement de partition ou un redémarrage matériel.
* COLD_START : la partition est en cours d'initialisation. Le démarrage est ralenti par les tests des analyses safety.
* WARM_START : la partition est en cours d'initialisation. Le démarrage est rapide, souvent pendant le vol.
* NORMAL : l'ordonnancement des processus se déroule normalement.
Les services :
* GET_PARTITION_STATUS : retourne le statut courant de la partition.
* SET_PARTITION_MODE : change le mode courant de la partition.
Le passage en mode NORMAL positionne :
* Les périodes des processus périodiques à la prochaine période de la partition (pour les synchroniser), en ajoutant un délai éventuel avec le service DELAYED_START.
* Les dates d'échéance des processus.

#### Les processus

* GET_PROCESS_ID : retourne l'identifiant unique d'un process existant d'après son nom.
* GET_PROCESS_STATUS : retourne l'état d'un processus existant d'après son identifiant.
* CREATE_PROCESS : crée un processus dont le nom est passé en paramètre.
* SET_PRIORITY : modifie la priorité d'un processus existant d'après son identifiant.
* SUSPEND_SELF : suspend le processus courant (RUNNING).
* SUSPEND : suspend un processus existant d'après son identifiant.
* RESUME : reprend l'exécution d'un processus existant d'après son identifiant.
* STOP_SELF : termine le processus courant (RUNNING).
* STOP : termine un processus existant d'après son identifiant.
* START : démarre le processus d'après son identifiant.
* DELAYED_START : démarre un processus périodique d'après son identifiant, après un délai.
* LOCK_PREEMPTION : verrouille la préemption pour protéger une section critique.
* UNLOCK_PREEMPTION : déverrouille la préemption.
* GET_MY_ID : retourne l'identifiant unique du processus dont le nom est passé en paramètre.

#### La gestion du temps

* TIMED_WAIT : met en attente le processus courant pendant un temps donné.
* PERIODIC_WAIT : met en attente le processus périodique jusqu'à la prochaine période.
* GET_TIME : retourne le temps en valeur absolue.
* REPLENISH : retarde la date d'échéance du processus d'un délai supplémentaire.

#### La gestion mémoire

La partition est libre de gérer sa mémoire. Aucun service n'est spécifié à cette fin.

#### Les queues de messages

* CREATE_QUEUING_PORT
* SEND_QUEUING_MESSAGE
* RECEIVE_QUEUING_MESSAGE
* GET_QUEUING_PORT_ID
* GET_QUEUING_PORT_STATUS

#### Les messages échantillonnés inter-partition

* CREATE_SAMPLING_PORT
* WRITE_SAMPLING_MESSAGE
* READ_SAMPLING_MESSAGE
* GET_SAMPLING_PORT_ID
* GET_SAMPLING_PORT_STATUS

#### La gestion des pannes (health monitoring)

* REPORT_APPLICATION_MESSAGE
* CREATE_ERROR_HANDLER
* GET_ERROR_STATUS
* RAISE_APPLICATION_ERROR

#### Les queues de messages intra-partition

* CREATE_BUFFER
* SEND_BUFFER
* RECEIVE_BUFFER
* GET_BUFFER_ID
* GET_BUFFER_STATUS

#### Les messages échantillonnés intra-partition

* CREATE_BLACKBOARD
* DISPLAY_BLACKBOARD
* READ_BLACKBOARD
* CLEAR_BLACKBOARD
* GET_BLACKBOARD_ID
* GET_BLACKBOARD_STATUS

#### Les événements

* CREATE_EVENT
* SET_EVENT
* RESET_EVENT
* WAIT_EVENT
* GET_EVENT_ID
* GET_EVENT_STATUS

#### Les sémaphores

* CREATE_SEMAPHORE
* WAIT_SEMAPHORE
* SIGNAL_SEMAPHORE
* GET_SEMAPHORE_ID
* GET_SEMAPHORE_STATUS