programmation de systèmes embarqués : systèmes temps réel et pruss
TRANSCRIPT
![Page 1: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/1.jpg)
EE3C Gestion des périphériques
Séance 7
Systèmes temps réelet PRUSS
Sébastien Combéfis 28 mars 2017
![Page 2: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/2.jpg)
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative CommonsAttribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
![Page 3: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/3.jpg)
Objectifs
Comprendre système temps-réel et contraintes
Contraintes temps-réel souples et fortes
Ordonnanceur de tâches préemptif ou non
Sous-système PRUSS de gestion du temps-réel
Sous-système PRUs sur la BBB et coopération CPU
Process de développement d’un programme temps-réel
3
![Page 4: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/4.jpg)
Merci !
Merci à Alexis Nootens pour son aide, 1
ma meilleure motivation !
1. Uniquement pour ce slide4
![Page 5: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/5.jpg)
Système temps-réel
![Page 6: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/6.jpg)
Temps-réel et Linux embarqué
Linux est par défaut non préemptif
Un processus en cours d’exécution ne peut être interrompu
Pas de support pour entrée/sortie où le timing est critique
Par exemple pour lire les valeurs d’un senseur ultrasonique
Garantie d’une réponse endéans une deadline (ms/µs)
Peu importe la charge actuelle sur le système
6
![Page 7: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/7.jpg)
Temps-réel hard et soft
Hard ou soft selon conséquences si deadline manquée
Catastrophique pour l’objet embarquant le système ?
Temps-réel souple si réduction qualité du service
Transmission vidéo, communication téléphonique...
Temps-réel fort si défaillance/incapacité du système
Direction assistée, robots auto-équilibrant...
Kernel Linux principal supporte le temps-réel souple
7
![Page 8: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/8.jpg)
Expérience BBB (1)
Script pour alterner l’état d’une LED le plus vite possible
En manipulant directement sysfs via Bash
Branchement sur P9_23 qui est GPIO1_17 (1 × 32 + 17 = 49)
#!/ bin/bashecho 49 > /sys/ class /gpio/ exportecho "out" > /sys/ class /gpio/ gpio49 / directionCOUNTER =0while [ $COUNTER -lt 100000 ]; do
echo 0 > /sys/ class /gpio/ gpio49 / valueecho 1 > /sys/ class /gpio/ gpio49 / valuelet COUNTER = COUNTER +1
doneecho 49 > /sys/ class /gpio/ unexport
8
![Page 9: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/9.jpg)
Expérience BBB (2)
Obtention d’une période ∼0.45ms donc fréquence ∼2.2 kHz
Fréquence pas très haute pour un contrôleur embarqué
De plus, consommation CPU très grande de l’ordre de ∼98.1%
Passer à C++ améliore fréquence, mais pas consommation
Deux pistes d’amélioration possibles sur la BBB
Périodique commuté haute fréquence avec PWM (∼1MHz)
Output non périodique haute fréquence avec PRU
9
![Page 10: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/10.jpg)
Ordonnancement de processus
Processus ordonnancés par le système d’exploitation
Décision de qui à droit au CPU pour s’exécuter
Linux pas préemptif, pas d’interruption d’un processus exécuté
Le processus consomme d’office tout son temps kernel
Ordonnancement préemptif propose des priorités sur les tâches
Interruption des tâches de plus basse priorité
Période de préemption de l’ordre de quelques microsecondes
10
![Page 11: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/11.jpg)
OS temps-réel (1)
Application temps-réel impose pas rythme à l’environnement
Pouvoir processer évènements dans des délais acceptables
Environnement provoque des interruptions sur le système
Application doit pouvoir suivre le rythme de l’environnement
Machine industrielle pour percer des doughnuts
Senseur identifiant qu’un doughnut approche
Vitesse tapis roulant vitesse, distance senseur et perforateur
Timing précis pour déclencher le hole puncher
11
![Page 12: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/12.jpg)
OS temps-réel (2)
Plusieurs caractéristiques distinguant RTOS de GPOS
Embarqué sans interface utilisateur (complexe)
Complètement déterministe
Contrôle sur l’OS, tâches prioritaires en premier
Un RTOS peut violer la règle de fairness des GPOS
Tous les processus reçoivent du temps CPU, tous interruptibles
Applications spécifiques nécessitant du temps-réel
Boucle de contrôle fermée, décision marketing...
12
![Page 13: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/13.jpg)
Domaine d’application
Industrie de mesure et contrôle
Robots sur chaine de production, senseur d’overheat detection...
Industrie aéronautique
Integrated Modular Avionics (IMA) réseau distribué de systèmesà bord, simulations en mode HIL...
Industrie des services financiers
Connexion de systèmes trading avec stock exchange
Tout le business multimedia
Processing d’information audio/vidéo pour perception humaine
13
![Page 14: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/14.jpg)
Linux préemptif
Possibilité d’obtenir du support temps-réel au niveau software
En modifiant le kernel Linux ou en ajoutant d’autres éléments
Trois options à des niveaux différents
Patcher le kernel Linux pour supporter la préemptionRecompiler le noyau avec CONFIG_PREEMPT_RT_FULL=y
Xenomai propose un co-kernel temps-réel appelé CobaltPlus prioritaire que kernel Linux, réagit à interruption hardware
Ne pas utiliser le Linux principal, mais un autre OS spécialiséLe no-OS StarterWare ou le QNX Neutrino RTOS
14
![Page 15: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/15.jpg)
Support hardware
Outsourcing opérations temps-réel à microcontrôleur low-cost
Arduino, Atmel AVR, TI Stellaris connecté en UART
Utilisation cape sophistiquée pour opérations temps-réel
Valent F(x) LOGi-Bone FPGA development boardProgrammé en Verilog ou VHDL pour calcul parallèle
Unités temps-réel programmables (PRUs)Le processeur AM335x de la BBB possède deux PRUs
15
![Page 16: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/16.jpg)
PRU
![Page 17: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/17.jpg)
Programmable Real-time Unit (PRU)
Programmable Real-Time Unit andIndustrial Communication Subsystem (PRU-ICSS)
Unités programmables spécialisées pour le temps-réel
Deux unités PRU disponibles sur le processeur AM335x
Cœur RISC sur 32 bits cadencé à 200MHz
Mémoire locale et partage des pins, interruption et mémoire
PRU-ICSS pas un accélérateur hardware de performances
Manipuler E/S et structure memory-mapped
Interface de communication (E/S simple, bit-banging...)
17
![Page 18: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/18.jpg)
AM355x
Diagramme blocs fonctionnel du processeur AM335x Sitara
18
![Page 19: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/19.jpg)
PRU-ICSS
Deux cœurs RICS 32 bits indépendants (PRU0 et PRU1)
Mémoire dédiée pour programme et pour données
Enhanced GPIO (EGP) pour GPIO rapides
Contrôleur d’interruption (INTC) pour notifier avec host
19
![Page 20: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/20.jpg)
Programmer le PRU-ICSS
Création d’un device tree overlay custom
Pour rendre les GPIOs disponibles
Écriture et compilation du code du programme hôte et PRU
Binaire pour PRU transféré par programme hôte sur PRU-ICSS
Bridge entre hôte et PRU-ICSS (interruption, mémoire...)
DTO
Code hôte (.c)
Code PRU (.p)
Compilateur C
Assembleur pasm
Prog. hôte C
Prog. PRU (.bin)
Programme PRU
Hôte Linux PRU-ICSS
20
![Page 21: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/21.jpg)
PRU-ICSS Enhanced GPIOs
PRU-ICSS a des pins GPIOs améliorées pr1_pruX_pru_r3Y_Z
X donne numéro du PRU (0 ou 1)
Y détermine input ou output (1 ou 0)
Z donne numéro de pin (de 1 à 16)
Configuration obligatoire du pin mux en mode 5 ou 6
Toutes les pins ne sont pas exportées, ni en entrée et sortie
21
![Page 22: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/22.jpg)
Configuration du DT (1)
Configuration de deux GPIOs classiques et deux enhanced
P9_11 reliée àgpio0[30] en output
P9_13 reliée à gpio0[31] en input
P9_27 reliée à pr1_pru0_pru_r30_5 en output
P9_28 reliée à pr1_pru0_pru_r31_3 en input
Nécessité de désactiver HDMI en conflit avec enhanced GPIOs
Présence à vérifier dans le fichier des slots
22
![Page 23: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/23.jpg)
Configuration du DT (2)
1 /dts -v1 /;2 / plugin /;3 / {4 compatible = "ti , beaglebone ", "ti , beaglebone - black ";5 part - number = "EBB -PRU - Example ";6 version = "00 A0";78 /* This overlay uses the following resources */9 exclusive -use = "P9 .11", "P9 .13", "P9 .27", "P9 .28", "pru0";
1011 fragment@0 {12 target = <& am33xx_pinmux >;13 __overlay__ {14 gpio_pins : pinmux_gpio_pins { // The GPIO pins15 pinctrl -single ,pins = <16 0x070 0x07 // P9_11 MODE7 | OUTPUT | GPIO pull -down17 0x074 0x27 // P9_13 MODE7 | INPUT | GPIO pull -down18 >;19 };20 pru_pru_pins : pinmux_pru_pru_pins { // The PRU pin modes21 pinctrl -single ,pins = <22 0x1a4 0x05 // P9_27 pr1_pru0_pru_r30_5 , MODE5 | OUTPUT | PRU23 0x19c 0x26 // P9_28 pr1_pru0_pru_r31_3 , MODE6 | INPUT | PRU24 >;25 };26 };27 };
23
![Page 24: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/24.jpg)
Configuration du DT (3)
1 fragment@1 { // Enable the PRUSS2 target = <&pruss >;3 __overlay__ {4 status = "okay";5 pinctrl - names = " default ";6 pinctrl -0 = <& pru_pru_pins >;7 };8 };9
10 fragment@2 { // Enable the GPIOs11 target = <&ocp >;12 __overlay__ {13 gpio_helper {14 compatible = "gpio -of - helper ";15 status = "okay";16 pinctrl - names = " default ";17 pinctrl -0 = <&gpio_pins >;18 };19 };20 };21 };
24
![Page 25: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/25.jpg)
Package PRU-ICSS
Debian comporte le package PRU-ICSS avec une série d’outils
Créer binaire avec PRU Assembler
Charger binaire avec PRU Linux Application Loader API
$ ls /usr/ include /pru*/usr/ include / pruss_intc_mapping .h /usr/ include / prussdrv .h
$ ls /usr/lib/ libpru */usr/lib/ libprussdrv .a /usr/lib/ libprussdrv .so /usr/lib/libprussdrvd .a /usr/lib/ libprussdrvd .so
$ pasm
PRU Assembler Version 0.86Copyright (C) 2005 -2013 by Texas Instruments Inc.
25
![Page 26: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/26.jpg)
Flash the LED (1)
Flasher une LED à 10Hz branchée sur une enhanced GPIO
Jusqu’à pression sur un bouton connecté sur une enhanced GPIO
Définition d’une série de constantes de configuration
1 // PRUSS program to flash a LED on P9_27 ( pru0_pru_r30_5 ) until a button2 // that is connected to P9_28 ( pru0_pru_r31_3 is pressed ). This program3 // was writen by Derek Molloy for the book Exploring BeagleBone45 . origin 0 // start of program in PRU memory6 . entrypoint START // program entry point (for a debugger )78 # define INS_PER_US 200 // 5ns per instruction9 # define INS_PER_DELAY_LOOP 2 // two instructions per delay loop
10 // set up a 50 ms delay11 # define DELAY 50 * 1000 * ( INS_PER_US / INS_PER_DELAY_LOOP )1213 # define PRU0_R31_VEC_VALID 32 // allows notification of program completion14 # define PRU_EVTOUT_0 3 // the event number that is sent back
26
![Page 27: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/27.jpg)
Flash the LED (2)
Boucles pour faire clignoter la LED
Test si le bouton est enfoncé en fin de code, et arrêter ou boucler
1 START :2 SET r30.t5 // turn on the output pin (LED on)3 MOV r0 , DELAY // store the length of the delay in REG04 DELAYON :5 SUB r0 , r0 , 1 // Decrement REG0 by 16 QBNE DELAYON , r0 , 0 // Loop to DELAYON , unless REG0 =07 LEDOFF :8 CLR r30.t5 // clear the output bin (LED off)9 MOV r0 , DELAY // Reset REG0 to the length of the delay
10 DELAYOFF :11 SUB r0 , r0 , 1 // decrement REG0 by 112 QBNE DELAYOFF , r0 , 0 // Loop to DELAYOFF , unless REG0 =01314 QBBC START , r31.t3 // is the button pressed ? If not , loop1516 END: // notify the calling app that finished17 MOV R31.b0 , PRU0_R31_VEC_VALID | PRU_EVTOUT_018 HALT // halt the pru program
27
![Page 28: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/28.jpg)
Flash the LED (3)
SET/CLR r30.t5 modifie bit 5 du registre 30 pour gérer LED
Bit contrôlant la pin output pr1_pru0_pru_r30_5
Registre 0 utilisé pour calculer le délai d’allumage/extinction
Fixé au départ à la valeur de la constante DELAY
Décrémenté de 1 avec SUB à chaque itération
QBBC START, r31.t3 lit bit 3 du registre 31 pour bouton
Bit contrôlant la pin input pr1_pru0_pru_r31_3
28
![Page 29: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/29.jpg)
Compilation
Compilation du programme avec l’assembleur pasm
Option -b pour fichier binaire en little-endian
Génération d’un fichier binaire à placer dans mémoire du PRU
Fichier de 52 bytes (soit 13 mots)
Sans soucis dans la mémoire de 8KB du PRU
29
![Page 30: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/30.jpg)
Programme principal (1)
Chargement du fichier binaire dans le PRU pour exécution
Ensuite attente du résultat de l’exécution
1 /** Program to load a PRU program that flashes an LED until a button is2 * pressed . By Derek Molloy , for the book Exploring BeagleBone3 * based on the example code at:4 * http :// processors .wiki.ti.com/ index .php/
PRU_Linux_Application_Loader_API_Guide5 */67 # include <stdio .h>8 # include <stdlib .h>9 # include <prussdrv .h>
10 # include <pruss_intc_mapping .h>1112 # define PRU_NUM 0 // using PRU0 for these examples1314 int main ( void )15 {16 if( getuid () !=0){17 printf ("You must run this program as root. Exiting .\n");18 exit( EXIT_FAILURE );19 }
30
![Page 31: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/31.jpg)
Programme principal (2)
1 // Initialize structure used by prussdrv_pruintc_intc2 // PRUSS_INTC_INITDATA is found in pruss_intc_mapping .h3 tpruss_intc_initdata pruss_intc_initdata = PRUSS_INTC_INITDATA ;45 // Allocate and initialize memory6 prussdrv_init ();7 prussdrv_open ( PRU_EVTOUT_0 );89 // Map PRU ’s interrupts
10 prussdrv_pruintc_init (& pruss_intc_initdata );1112 // Load and execute the PRU program on the PRU13 prussdrv_exec_program (PRU_NUM , "./ ledButton .bin");1415 // Wait for event completion from PRU , returns the PRU_EVTOUT_0 number16 int n = prussdrv_pru_wait_event ( PRU_EVTOUT_0 );17 printf ("EBB PRU program completed , event number %d.\n", n);1819 // Disable PRU and close memory mappings20 prussdrv_pru_disable ( PRU_NUM );21 prussdrv_exit ();22 return EXIT_SUCCESS ;23 }
31
![Page 32: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/32.jpg)
Qualité temps-réel
Signal produit en sortie ne contient plus de jitter
Contrairement à la version brute avec pin GPIO simple en Bash
Réduction de la consommation du CPU car délégation au PRU
Seulement 0.2% du CPU consommé
32
![Page 33: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/33.jpg)
Caractéristiques du PRU
Mémoire composée de registres et mémoire GP locale
32 registres 32 bits : 0 pour indexer, 1–29 GPR et 30–31 SPR
Mémoire GP locale du PRU mappée sur l’hôte Linux
Data RAM0 et RAM1, et une mémoire partagée
Jeu d’instructions de type RISC avec ∼45 instructions
Arithmétique, logique, reg load/store, program control flow
33
![Page 34: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/34.jpg)
Performance
Possibilité de faire flasher la LED à une fréquence ∼10MHz
Avec le code présenté précédemment
Déclenchement de la LED environ 30 ns après pression bouton
Lumière parcourt 9m dans le vide (3.108 m/s)
Son parcourt 1/100mm dans l’air, niveau de la mer (340m/s)
Possibilité de créer des signaux à très hautes fréquences
Output horloge dédiée en UART à 192MHz
34
![Page 35: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/35.jpg)
Livres de référence
ISBN978-1-118-93512-5
ISBN978-0-596-52968-0
35
![Page 36: Programmation de systèmes embarqués : Systèmes temps réel et PRUSS](https://reader031.vdocuments.fr/reader031/viewer/2022022415/5a66e0e67f8b9a91298b45eb/html5/thumbnails/36.jpg)
Crédits
Photos des livres depuis Amazonhttps://www.flickr.com/photos/energeticspell/4095522584https://www.flickr.com/photos/andrewsan/8648625518
36