
|
- une tâche rapide prioritaire H, de période ph
- une tâche lente non-prioritaire L, de période pl (ph
>
pl)
- H communique une valeur H2L à L, immédiatement (i.e. L
utilise, quand elle est activée, la dernière valeur
calculée par H)
- L communique une valeur
L2H
à
H,
avec un retard
logique (i.e. H utilise toujours la valeur calculée au
cycle pl strictement
passé, et non pas la dernière valeur calculée, ce
qui serait indéterministe).
Remarques :
- ce schéma de
communication peut être programmé et simulé en
Simulink
- le code glue correspondant
(à base de buffers) pourrait
être généré automatiquement, mais l'outil
actuel sim2lus n'est pas
encore tout à fait opérationnel : on doit donc
écrire ce code
directement en C à la main,
- pour que ça fonctionne,
on a impŕativement besoin d'un buffer H2L et un "double-buffer"
pour L2H/L2Hnext :
- si H est active, mais pas L, elle reçoit la valeur
L2H, H2L doit être mémorisé au cas où L en
ait besoin plus tard
- si
L est active, mais pas H, elle reçoit la valeur H2L, la valeur
de
L2Hnext est recopiée dans L2H, et L commence à
calculer une
nouvelle valeur qu'elle stockera dans L2H,
- si les
deux sont actives en "même temps", la valeur de L2Hnext est
recopiée
dans L2H, et H calcule avec cette nouvelle valeur L2H, comme elle est
prioritaire, elle calcule un nouveau H2L, puis, seulement L commence
à
calculer avec ce nouveau H2L, pour produire une nouvelle valeur L2Hnext.
- En étant un peu malin, on n'a
jamais besoin de "recopier" L2Hnext dans L2H,
ce
qui
peut
être pénalisant pour des données de
grande taille. On
utilise un tableau à deux éléments, plus un index
(0 ou 1) qui indique
qui est le L2Hnext courant ; L écrit via cet index,
et H lit dans l'index opposé. Le changement de buffer est juste
un "swap" de l'index.
- Il existe plusieurs
manières d'implémenter en C/Osek ce schéma de
communication, on en détaille deux ci-dessous.
|