Plate-forme Java embarquée TINI Sébastien Jean IUT de Valence Département Informatique v2.1, 3 décembre 2009 Introduction TINI, en bref Qu’est ce que TINI ? http://www.maxim-ic.com/products/microcontrollers/tini/ TINI (Tiny INternet Interface) = plate-forme embarquée Micro-contrôleur + périphériques = module Très faible encombrement (taille d’une barette DIMM) Faible coût (70$) Faible consommation Haut degré de connectivité Ethernet, 1-Wire, CAN, I2C, RS232 en standard Programmable en C ou en Java Mémoire RAM sauvegardée par pile Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 1 / 52 Introduction TINI, en bref TINI : applications Contrôle industriel Supervision de capteurs/actionneurs Conversion de protocoles Passerelle industrielle Collecte d’informations, traitement local, puis redistribution via un réseau IP ou téléphonique Supervision d’installation via le web (cf. Tynamo) Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 2 / 52 Introduction Architecture matérielle DS80C390 Micro-contrôleur compatible 80C51 Optimisé pour une exécution 3 fois plus rapide 40 MHz, 5.5 V 4 kio de SRAM interne polyvalente Code, données, pile Adressage jusqu’à 4 Mio Mapping des périphériques d’IO en mémoire 16 interruptions (dont 6 externes), 3 timers 16b, 1 watchdog Accelérateur mathématique, 4 ports TTL 8b 2 contrôleurs CAN 2.0B, 2 ports série Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 3 / 52 Introduction Architecture matérielle DS80C400, DS80C410 et DS80C411 Evolution du DS80C390 75 MHz, 3.3 V 64 kio de ROM (firmware), Adressage jusqu’à 16 Mio 1 kio (DS80C400) ou 72.5 kio (DS80C41x) 4 timers 16b (Vs 3 pour le DS80C390) 8 ports TTL 8b (Vs 4 pour le DS80C390) 3 ports série (Vs 2 pour le DS80C390) 1 contrôleur CAN 2.0B (excepté sur DS80C410) 1 contrôleur Ethernet 10/100 Mb/s, 1 contrôleur 1-Wire (master) Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 4 / 52 Introduction Architecture matérielle Modules Insertion du micro-contrôleur au sein d’un « module »permettant d’obtenir une brique intégrable, avec SRAM et ou Flash additionnelle, pile, . . . Exemple : module DSTINIm400 Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 5 / 52 Introduction Architecture matérielle Modules TINI à base de DS80C390 DSTINI512-KIT 512 kio de SRAM externe 512 kio de Flash externe 1 contrôleur Ethernet 10 Mb/s, 1 contrôleur 1-Wire Pile pour la sauvegarde SRAM DSTINI1M-KIT 1 Mio de SRAM externe 512 kio de Flash externe 1 contrôleur Ethernet 10 Mb/s, 1 contrôleur 1-Wire Pile pour la sauvegarde SRAM Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 6 / 52 Introduction Architecture matérielle Modules TINI à base de DS80C4xx DSTINIm400 et DSTINIm410 1 Mio de SRAM externe 1 Mio de Flash externe 1 RTC Support pour 1 interface Ethernet additionnelle Pile pour la sauvegarde SRAM Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 7 / 52 Introduction Architecture matérielle Sockets Placement du module sur un « socket »permettant d’obtenir un dispositif autonome, avec connectique, écran, . . . Exemple : socket DSTINIs400 Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 8 / 52 Introduction Architecture système Composants systèmes BootLoader (4 kio) Mise à jour de l’environnement d’exécution (via port série) Environnement d’exécution TiniOS (environ 400 kio avec librairies natives) Sous-système I/O : pilotes de périphériques, pile TCP/IP (si besoin) Sous-système mémoire : système de fichiers, tas, garbage collector Sous-système processus : ordonnanceurs JVM (environ 40 kio) API de gestion du matériel Nécessite 512 kio de SRAM externe minimum Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 9 / 52 Introduction Architecture système Bootstrap 1 PowerOn Reset provoqué par la mise sous tension 2 Exécution du BootLoader Possibilité de court-circuiter le démarrage via External Reset pour mise à jour de l’environnement d’exécution 3 Initialisation de l’environnement d’exécution Vérification de l’intégrité du tas et du système de fichiers Initialisation des pilotes de périphériques Création des processus initiaux (GC + application primaire) 4 Démarrage de l’application primaire Application Java Taille limitée à 64 kio Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 10 / 52 Introduction Architecture système Processus, fichiers Processus et threads Processus → applications C ou Java 8 maximum, ordonnancement Round-Robin 8ms Threads → threads Java 16 à 32 maximum, ordonnancement Round-Robin 2ms Système de fichiers Unix-like Permissions, propriétaires, groupes Pas de liens symboliques Allocation de blocs de 512 octets en SRAM (persistante) Montage NFS possible via API Java Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 11 / 52 Introduction Architecture système Protocoles et services réseaux Protocoles IPv4, IPv6 (TiniOS v1.1x) TCP, UDP IGMP, ICMP, PPP Services Clients : DHCP, SMTP, FTP, DNS Serveurs : FTP, TELNET, HTTP Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 12 / 52 Introduction Architecture système JVM et API Java TiniOS v1.0x Compatible JDK 1.1.8 java.lang, java.io, java.util, java.net, java.comm Support pour tous les types primitifs Support JNI (méthodes natives en assembleur) Pas de sérialisation, de réflexion, ni de chargement dynamique de classe TiniOS v1.1x Compatible JDK 1.4 java.lang, java.io, java.util, java.net, java.comm Support pour tous les types primitifs Support JNI (méthodes natives en assembleur) Sérialisation, réflexion, chargement dynamique de classe, RMI Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 13 / 52 Introduction TINI SDK TINI SDK Logiciels à embarquer TiniOS + JVM (v1.0x ou v1.1x) Slush (application primaire standard) Outils de mise à jour du firmware MTK (Windows uniquement) JavaKit (multi-cibles, basé sur JavaComm) Outils de développement TiniConvertor Application Java Vérification de compatibilité et conversion .class vers .tini Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 14 / 52 Introduction TINI SDK Slush Interpréteur de commandes extensible à la Unix, écrit en Java Gestion du système de fichiers Création de fichiers/répertoires, permissions, . . . Administration système Gestion de comptes utilisateurs, . . . Configuration réseau Configuration d’interfaces et de services Exécution d’applications Java Redirection des entrées/sorties standard, exécution en arrière-plan Session utilisateur via liaison série ou telnet Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 15 / 52 Installation Matériel et logiciels Matériel Module DSTINIm400 Socket DSTINIs400 Alimentation 5V (500 mA min) Câble série DCE-DTE (droit) Câble Ethernet RJ45 croisé Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 16 / 52 Installation Matériel et logiciels Logiciels Station de développement Système quelconque (de préférence MacOS X ;-) ) JDK 1.5 (ou 1.4), éventuellement Eclipse RxTx 2.1.7 (ou JavaComm) TINI SDK http://files.dalsemi.com/tini/index.html TiniOS v1.17 Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 17 / 52 Installation Matériel et logiciels TINI SDK Décompactage de l’archive dans un répertoire tini1.17 Firmware, slush Outils de chargement SDK Java Documentation + Javadoc API SDK C Sources des outils Exemples d'applications Java et C Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 18 / 52 Installation Matériel et logiciels TINI SDK (suite) Sous-répertoire bin Slush TiniOS Outils de chargement Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 19 / 52 Installation Chargement du firmware et de Slush Connexion PC-TINI Connexion série via port Serial0 (DCE) Remarque : seulement 4 broches utilisées RX, TX, GND Utilisés pour le transfert de données DTR Utilisé pour provoquer un External Reset Débrayable en général sur le socket (cf. jumper J14 sur DSTINIs400) Sur station de développement, tini.jar dans le classpath Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 20 / 52 Installation Chargement du firmware et de Slush JavaKit Sur station de développement : java JavaKit Remarque : JavaKit utilise le paquetage javax.comm et RxTx définit le paquetage gnu.io → modification des sources (JavaKit ou RxTx) nécessaire Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 21 / 52 Installation Chargement du firmware et de Slush JavaKit : choix du module Sélection du type de module (ici TINIm400) Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 22 / 52 Installation Chargement du firmware et de Slush JavaKit : ouverture du port Nom du port (dépend de la plate-forme) Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 23 / 52 Installation Chargement du firmware et de Slush JavaKit : External Reset Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 24 / 52 Installation Chargement du firmware et de Slush JavaKit : Chargement de TiniOS + JVM Load File ... Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 25 / 52 Installation Chargement du firmware et de Slush JavaKit : Chargement de TiniOS + JVM (fin) Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 26 / 52 Installation Chargement du firmware et de Slush JavaKit : Chargement de Slush, initialisation du tas Chargement de Slush Procédure identique au chargement de TiniOS (via menu File) Initialisation du tas Remplir de 0 la zone réservée au tas Pour DSTINIm400 : (autres, cf. documentation !) B0 (sélection de la banque de mémoire 0, 64 kio) F0 (remplissage avec des 0) Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 27 / 52 Installation Chargement du firmware et de Slush JavaKit : Premier redémarrage Commande EXIT (ou simplement E) Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 28 / 52 Utilisation de Slush Commandes générales Login Au démarrage 2 utilisateurs existent : Administrateur : root, avec comme mot de passe tini Utilisateur : guest, avec comme mot de passe guest L’interpréteur de commandes supporte : La redirection des entrées-sorties vers des fichiers via <, > et >> L’exécution en tâche de fond, via & logout : Clôture de la connexion reboot : Redémarrage du système Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 29 / 52 Utilisation de Slush Commandes générales Aide et gestion des utilisateurs help : Aide en ligne Sans paramètre : Liste de toutes les commandes disponibles Avec en paramètre un nom de commande : Aide sur l’utilisation d’une commande spécifique useradd : Ajout d’utilisateur Distinction utilisateur/administrateur via un niveau de privilège userdel : Suppression d’un utilisateur Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 30 / 52 Utilisation de Slush Commandes générales Gestion des utilisateurs (fin) who : Liste des utilisateurs connectés (via série, telnet ou ftp) whoami : Identité de l’utilisateur courant passwd : Modification du mot de passe (d’un utilisateur) Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 31 / 52 Utilisation de Slush Commandes générales Variables d’environnement, historique, script, . . . setenv : Gestion des variables d’environnement history : Liste des 5 dernières commandes exécutées source : Exécution d’un script (ensemble de commandes) su : Exécution d’une commande en mode privilégié Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 32 / 52 Utilisation de Slush Commandes générales Messages, état du système. . . date : Gestion de la date système echo : Affichage d’un message wall : Diffusion d’un message à tous les utilisateurs stats : Visualisation de l’état du système Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 33 / 52 Utilisation de Slush Gestion de fichiers Système de fichiers initial, navigation Arborescence initiale : Répertoire etc, contenant les fichiers : passwd : fichier de mots de passe (masqués) .startup : script de configuration (modifiable) exécuté au lancement Répertoire tiniext Localisation des classes étendant l’environnement Java Similaire à jdk/lib/ext dans un JDK/JRE classique cd : Déplacement dans un sous-répertoire pwd : Identification du répertoire courant Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 34 / 52 Utilisation de Slush Gestion de fichiers Enumération, affichage, création/suppression, . . . ls ou dir : Enumération du contenu d’un répertoire cat : Affichage d’un fichier md ou mkdir : Création de répertoire rm ou del : Suppression de fichier rd ou rmdir : Suppression de répertoire Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 35 / 52 Utilisation de Slush Gestion de fichiers Copie, renommage, droits cp ou copy : Copie de fichiers/répertoires mv ou move : Déplacement/renommage de fichiers/répertoires append : Concaténation de fichiers touch : Rafraîchissement de la date de dernière modification d’un fichier chmod : Modification des droits d’accès sur un fichier/répertoire chown : Modification du propriétaire d’un fichier Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 36 / 52 Utilisation de Slush Processus et réseau Gestion de processus df : Visualisation de la mémoire libre ps : Visualisation des processus en exécution kill : Terminaison d’un processus wd : Gestion du watchdog Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 37 / 52 Utilisation de Slush Processus et réseau Gestion du réseau hostname : Affectation d’un nom d’hôte à la Tini ipconfig : Visualisation ou modification de la configuration réseau Configuration manuelle ou via DHCP Remarque : sauvegarde en mémoire persistante recommandée ping : Test d’accessibilité d’une machine distante startserver : Démarrage d’un service réseau Serveur de session série, serveur TELNET, serveur FTP stopserver ou downserver : Arrêt d’un service réseau Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 38 / 52 Utilisation de Slush Processus et réseau Gestion du réseau (fin) netstat : Visualisation des connexions TCP actives nslookup : Résolution DNS (client) arp : Visualisation de la table d’adresses MAC ftp : Client FTP sendmail : Client SMTP Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 39 / 52 Utilisation de Slush Java Gestion d’applications Java, extension de Slush addc : Extension de Slush, via classes Java java : Exécution d’une application Java gc : Exécution forcée du Garbage Collector Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 40 / 52 Développement d’applications API Tini Java pour la Tini TiniOS 1.1x → JDK1.4 1 application Java = 1 processus 8 processus (gc et Slush sont 2 processus) maximum 32 threads Java maximum 255 attributs statiques et 255 attributs non statiques par classe 63 variables locales par méthodes Taille maximale des classes converties = 32 kio 24 sockets maximum Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 41 / 52 Développement d’applications API Tini API de base com.dalsemi.system Abstraction du matériel et primitives systèmes com.dalsemi.comm Communication série com.dalsemi.fs Système de fichiers com.dalsemi.onewire.* Communication iButton, . . . com.dalsemi.shell Interprétation de commandes, . . . (base de Slush) com.dalsemi.tininet.* Communication réseau, DHCP, DNS, ICMP, PPP Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 42 / 52 Développement d’applications API Tini API de base (suite) Optimisation de certaines classes pour la Tini Définition de sous-classes à utiliser de préférence javax.comm.SerialPort com.dalsemi.comm.TINISerialPort java.io.File com.dalsemi.fs.DSFile java.net.DatagramSocket com.dalsemi.tininet.TINIDatagramSocket java.net.MulticastSocket com.dalsemi.tininet.TINIMulticastSocket Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 43 / 52 Développement d’applications API Tini Paquetage com.dalsemi.system Classe BitPort Manipulation au niveau bit des broches du processeur Classe BytePort Manipulation au niveau octet des broches du processeur (si supporté) Classe DataPort Manipulation des périphériques d’IO mappés en mémoire Classe Clock Manipulation de l’horloge temps-réel Classe TINIOS Configuration et obtention de l’état du système Classe Debug Méthodes utilitaires pour la mise au point logicielle Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 44 / 52 Développement d’applications API Tini API optionnelle API de base = classes déjà présentes dans l’environnement API optionnelle = classes à charger si utilisées par les applications Support CAN, SPI, I2C Serveur HTTP Fonctionnalités PPP avancées Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 45 / 52 Développement d’applications Génération de code Edition/compilation d’une application Edition Classique, avec ou sans IDE (Eclipse par ex.) Compilation Spécification d’une cible (si utilisation d’un JDK >1.4) -source=1.4 -target=1.4 Spécification des classes de bases (java.lang, api tini) à utiliser pour la compilation -bootclasspath=<tiniSDK>/bin/tiniclasses.jar Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 46 / 52 Développement d’applications Génération de code Conversion, chargement et exécution d’une application Conversion Utilisation de l’outil TiniConvertor Chargement Utilisation de FTP Exécution Sous Slush : java myapp.tini Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 47 / 52 Développement d’applications Exemple Application exemple Simplification (à l’extrême) de l’exemple Blinky fourni par Dallas Code de l’exemple package fr.iutvalence.pedago.tini.examples; import com.dalsemi.system.BitPort; class BlinkModuleLed { public static void main(String[] args) { BitPort bp = new BitPort(BitPort.Port5Bit2); while (true) { bp.clear(); try {Thread.sleep(1000);} catch (InterruptedException ie) {} bp.set(); try {Thread.sleep(1000);} catch (InterruptedException ie) {} } } } Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 48 / 52 Développement d’applications Exemple Compilation de l’application Fichier BlinkModuleLed.java supposé être dans src Fichier tiniclasses.jar supposé être dans lib Fichier BlinkModuleLed produit dans build Compilation javac -d build -source=1.4 -target=1.4 -bootclasspath=lib/tiniclasses.jar src/BlinkModuleLed.java Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 49 / 52 Développement d’applications Exemple Conversion de l’application Outil TINIConvertor Inclus dans tini.jar Vérification des classes (respect des contraintes) Conversion dans un format plus léger et facilitant le chargement Format .tini Possibilité de regrouper dans un même fichier plusieurs classes, dont une application (détectée automatiquement) Utilise un référentiel de dépendances, pour faciliter l’édition de lien Fichier tini.db (inclus dans le SDK) Conversion java TINIConvertor -f build/BlinkModuleLed.class -o tini/blink.tini -d lib/tini.db Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 50 / 52 Développement d’applications Exemple Chargement, exécution de l’application Chargement : 1 Connexion sur le serveur FTP (supposé activé) de la Tini 2 Dépôt du fichier blink.tini Exécution : 1 Ouverture d’une session sur la Tini (via série ou telnet) 2 Déplacement dans le répertoire où se trouve blink.tini 3 Lancement en tâche de fond via java blink.tini & Arrêt via ps et kill Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 51 / 52 Développement d’applications Exemple Fin ! Sébastien Jean (IUT Valence) Java embarqué, Tini v2.1, 3 décembre 2009 52 / 52