IMA5 2018/2019 P13 : Différence entre versions
(→Réalisation du Projet) |
(→Semaine du 01/10) |
||
Ligne 108 : | Ligne 108 : | ||
Du coté de RIOT, il faut modifier le makefile et le code d'exemple. | Du coté de RIOT, il faut modifier le makefile et le code d'exemple. | ||
+ | |||
+ | == Semaine du 08/10 == | ||
+ | Cette semaine a été consacrée à l'exploration des possibilités de réductions de taille des sources. | ||
+ | |||
+ | ===Contiki=== | ||
+ | Le programme d'exemple étant assez simple, il n'y à pas beaucoup de chose à modifier pour en réduire la taille. Il faut donc jouer sur les paramètres du fichier project-conf.h. Les paramètrs impactant la taille que nous pouvons modifier sont les suivants : | ||
+ | |||
+ | #define QUEUEBUF_CONF_NUM 4 | ||
+ | #define NBR_TABLE_CONF_MAX_NEIGHBORS 8 | ||
+ | #define NETSTACK_MAX_ROUTE_ENTRIES 0 | ||
+ | #define UIP_CONF_BUFFER_SIZE 100 | ||
+ | #define SICSLOWPAN_CONF_FRAG 0 | ||
+ | #define PROCESS_CONF_NO_PROCESS_NAMES 1 | ||
+ | #define UIP_CONF_TCP 0 | ||
+ | |||
+ | avec QUEUEBUF_CONF_NUM le nombre de message que doit pouvoir contenir le buffer de message. Plus cette varaible est faible, moins le programme prend de place en RAM mais plus il y a un risque d'engorgement. | ||
+ | NBR_TABLE_CONF_MAX_NEIGHBORS correspond aux nombres de voisins que le nodes peut gérer. Plus cette valeur est importante, plus le réseau est flexible, mais plus cela prend de la place en RAM. | ||
+ | NETSTACK_MAX_ROUTE_ENTRIES correspond au nombre de route sauvegarder dans la table rde routage. Plus cette valeur est importante, plus le réseau est réactif, mais comme nous sommes en mode "non storing mode", cette valeur doit être mise à zéro. | ||
+ | UIP_CONF_BUFFER_SIZE correspond à la taille en octet du buffer de message IPv6. La taille minimal pour l'intéropérabilité est de 1280 octets, mais si le réseau n'a pas vocation à être mis en relation avec d'autre réseau IPv6, comme dans notre cas, la taille de ce buffer peut être réduit. Comme un paquet RPL à une taille maximale d'environ 32 octets et l'entête IPv6 d'envoron 40 octets, une taille de buffer de 100 est suffisante. | ||
+ | SICSLOWPAN_CONF_FRAG correspond à l'utiliksation ou non du méchanisme de fragmentation des messages. Comme nos message seront normalement très court (moins de 10 octets), ce mechanisme ne devrait pas être utile et donc peut être retirer. Cela gagne de la place en RAM et en ROM. | ||
+ | PROCESS_CONF_NO_PROCESS_NAMES correspond au mechanisme de nommage des processus créés dans Contiki. Comme il n'y aura pas beaucoup de processus et qu'ils ne seront pas lu par un humain lors du fonctionnement, désactiver ce mechanisme permet de gagner de l'espace en ROM principalement. | ||
+ | UIP_CONF_TCP correspond à l'utilisation du mechanisme TCP. Comme le protocole UDP correspond à nos besoin, il n'est pas nécessaire d'intégrer les mechanismes de TCP. | ||
+ | |||
+ | De plus, dans le programme d'exemple, il y a de plus un mechanisme qu'il est possible de désactiver : les logs. En effet, Contiki propose un système avancé de log avec plusieurs niveaux permettant d'observer finement ce qu'il se passe durant le fonctionnement de l'OS. Passer de | ||
+ | |||
+ | #define LOG_LEVEL LOG_LEVEL_INFO | ||
+ | |||
+ | à | ||
+ | |||
+ | #define LOG_LEVEL LOG_LEVEL_NONE | ||
+ | |||
+ | permet aussi d'économiser un peu d'espace. | ||
+ | |||
+ | Avec ces modification, on arrive à | ||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | ! text !! data !! bss | ||
+ | |- | ||
+ | |41174 | ||
+ | |296 | ||
+ | |3492 | ||
+ | |} | ||
+ | |||
+ | On arrive donc en dessous des 4ko de RAM utilisée, mais il reste encore environ 10ko de ROM en trop. | ||
+ | |||
+ | |||
+ | |||
+ | ===RIOT=== | ||
+ | |||
+ | Comme je savais depuis mon projet IMA4 que RIOT occupait trop de place sur le cc430, j'ai pu rapidement tester des modifications afin de déterminer la taille prise en nmémoire. J'ai donc compilé le projet d'exemple gnrc_networking avec une carte proche du cc430 mais ayant plus de ROM et de RAM, le Tmote sky, ou telosB. Le resultat, sans modification préalable n'est pas encourageant : la compilation échoue car il y a un overflow de ROM de 14ko, sur les 48k disponible. La compilation n'indique pas d'overflow en RAM utilisé, mais le Tmote Sky ayant 10ko de RAM, ce n'est pas une chose à retenir car le cc430 n'en a que 4ko. | ||
+ | |||
+ | En modifiant le programme principale pour qu'il ne fasse rien, et en retirant dans le makefile l'inclusion de sources non nécessaire à notre projet (comme un shell), on arrive à un overflow de 7ko de ROM. | ||
+ | |||
+ | Avec ces même modifications, une compilation avec comme cible le cc430 indique un overflow en RAM de 1.6Ko de RAM. | ||
=Documentation= | =Documentation= | ||
=Documents Rendus= | =Documents Rendus= |
Version du 24 octobre 2018 à 09:38
Sommaire
Présentation générale
Description
La recherche de places de parking est une tâche fastidieuse, consommatrice de temps et polluante.
Objectifs
Pour remédier à ce problème, nous proposons de réaliser un ensemble composé :
- D'un capteur de détection de voiture :
- D'un système de transmission basé sur une carte "maison" (µC : CC430) déjà existante ;
- D'un système de stockage et de visualisation des places libres.
Préparation du projet
Cahier des charges
Choix techniques : matériel et logiciel
Liste des tâches à effectuer
Calendrier prévisionnel
Réalisation du Projet
Semaine du 17/09
En attendant un entretien avec les encadrants de projet pour mettre au point un cahier des charges précis, plusieurs recherches bibliographiques ont été effectuées.
Plusieurs solutions existent déjà pour effectuer la détection de voitures dans un parking, axées autours de trois méthodes :
- Détection avec un capteur par place
- Détection avec des capteurs en entrée et en sortie de parking
- Détection par caméra
Chaque solution présente des avantages et des inconvénients, qu'il faudra analyser afin de choisir la solution adaptée.
Le solution avec un capteur par place est précise et indique facilement et précisément l'occupation des places. Elle est de plus peu coûteuse en énergie par capteur, la détection ne devant pas être effectuée en permanence. En revanche cette méthode est coûteuse car nécessite un capteur par place, et implique une remontée d'informations complexe à mettre en place (sans fil ou filaire).
La solution avec des capteurs en entrée et en sortie est peu coûteuse et permet une remontée d'informations assez simple (peu de données à transmettre). En revanche elle n'est pas précise et indique seulement le nombre de voitures/places restantes dans le parking et non les places précises restantes. Elle est de plus coûteuse en énergie pour les capteurs, devant être actifs très souvent afin de ne pas manquer une voiture.
La solution par caméra est économe en matériel, une caméra pouvant être suffisante pour un parking entier, et permet de détecter précisément les places restantes. Elle n'est cependant pas pratique pour un parking souterrain, consomme beaucoup d'énergie par capteur et nécessite des capacités de traitement d'images hors de la portée d'un cc430. Elle peut cependant utiliser un serveur pour effectuer les calculs.
Des liens vers les études sont disponibles dans la partie Documentation
L'entretien avec les encadrant à de plus été préparer afin de pouvoir déterminer u cahier des charges précis. Les questions suivantes doivent être abordées :
- Objectifs précis du projet
- Localisation du parking, type de parking
- Durée de vie minimale des capteurs
- Type de détection voulu
- Budget
- Design du boiter du capteur
- Utilisation de RIOT imposée
- Quel type d'affichage
- Alimentation des capteurs
- Utilisation d'un serveur
- Utilisation du protocole RPL
Semaine du 24/09
Suite au rendez-vous du 21/09, les questions suivantes ont été écartées :
- Durée de vie minimale des capteurs
- Type de détection voulu
- Budget
- Design du boitier du capteur
- Quel type d'affichage
- Alimentation des capteurs
- Utilisation d'un serveur
En effets ces questions ne sont pas prioritaires et n'entreront dans l'équations que si le projet avance très vite.
- Objectifs précis du projet
L'objectif principal du projet est de déployer un réseau d'objets sans fils possédant des capacités de routage dynamique.
- Localisation du parking, type de parking
Le parking d'étude sera le parking de l'IRCICA, mais des essais en condition réel seront intéressant mais ne sont pas une priorité
- Utilisation du protocole RPL
Le routage dynamique devra préférentiellement être mis en place en respectant le protocole RPL
- Utilisation de RIOT imposée
RIOT OS n'est en aucun cas imposé, et l'utilisation d'un autre OS (Contiki a été évoqué) est parfaitement envisageable, voir même tenter une appproche sans OS.
Ayant déjà travaillé avec RIOTOS et le CC430, je sais qu'il peut y avoir des problème concernant la taille et l'occupation en RAM des OS. Ma première mission est donc de déterminer si le CC430 et ses 32ko de ROM et 4ko de RAM permettent l'utilisation des implémentations du protocoles RPL des différents OS de l'embarqués, ou si d'autres options plus simple (routage statique voir simple broadcast) sont à privilégier.
Semaine du 01/10
Durant cette semaine j'ai étudié l'impact en mémoire (ROM et RAM) des deux OS les plus adaptés aux premiers abord pour le projet : Contiki et RIOT. Les deux OS vantent une utilisation en ROM et RAM faible (environ 10ko de ROM et 2 ko de RAM), ce qui conviendrait parfaitement au besoin du projet. Malheureusement, ces tailles annoncées ne sont vrai que pour l'OS seul dans la plus grande majorité des cas, que ce soit pour RIOT ou Contiki. Le cc430 n'est pas supporté par Contiki, mais le Tmote Sky l'est, et est basé sur un msp430 de chez TI, comme le cc430. Utiliser le Tmote Sky afin d'établir la taille en ROM et RAM prise par les sources semble une option valide. Lors de la compilation des sources d'exemples RPL pour Contiki avec le Tmote Sky, sans modification au préalable de l'exemple, on option (grâce à la commande size sur linux) :
text | data | bss |
---|---|---|
43380 | 310 | 6958 |
soit 43380 octets de ROM utilisé et 310+6958=7268 octets de RAM utilisés, ce qui est bien supérieur à ce qui est disponible.
Du coté de RIOT, je savais que le programme d'exemple ne tenait pas dans le cc430, en effet il y a une surcharge de RAM de 2426 octets et de ROM de 32956 octets.
Dans les deux cas il est possible de réduire la taille de ce programme en retirant ce qui ne nous concerne pas.
De plus, afin d'être sur que le compilateur optimise la taille de l'exécutable, j'ai regardé la commande final des makefile de RIOT et Contiki en ajoutant
SHELL="sh -x"
à la fin de la commande make.
L'une des option de gcc pour optimisé en taille est l'option -0s, et cette option est bien présente pour les deux OS. Les gains en places ne peuvent donc pas être effectués grâce aux options du compilateur, mais doivent être effectués auprès du code source.
Les optimisations possibles chez Contiki se font en ajoutant un fichier project-conf.h dans le répertoire de l'exemple et d'y ajouter des #define pour restreindre certaines fonctionnalités.
Du coté de RIOT, il faut modifier le makefile et le code d'exemple.
Semaine du 08/10
Cette semaine a été consacrée à l'exploration des possibilités de réductions de taille des sources.
Contiki
Le programme d'exemple étant assez simple, il n'y à pas beaucoup de chose à modifier pour en réduire la taille. Il faut donc jouer sur les paramètres du fichier project-conf.h. Les paramètrs impactant la taille que nous pouvons modifier sont les suivants :
#define QUEUEBUF_CONF_NUM 4 #define NBR_TABLE_CONF_MAX_NEIGHBORS 8 #define NETSTACK_MAX_ROUTE_ENTRIES 0 #define UIP_CONF_BUFFER_SIZE 100 #define SICSLOWPAN_CONF_FRAG 0 #define PROCESS_CONF_NO_PROCESS_NAMES 1 #define UIP_CONF_TCP 0
avec QUEUEBUF_CONF_NUM le nombre de message que doit pouvoir contenir le buffer de message. Plus cette varaible est faible, moins le programme prend de place en RAM mais plus il y a un risque d'engorgement. NBR_TABLE_CONF_MAX_NEIGHBORS correspond aux nombres de voisins que le nodes peut gérer. Plus cette valeur est importante, plus le réseau est flexible, mais plus cela prend de la place en RAM. NETSTACK_MAX_ROUTE_ENTRIES correspond au nombre de route sauvegarder dans la table rde routage. Plus cette valeur est importante, plus le réseau est réactif, mais comme nous sommes en mode "non storing mode", cette valeur doit être mise à zéro. UIP_CONF_BUFFER_SIZE correspond à la taille en octet du buffer de message IPv6. La taille minimal pour l'intéropérabilité est de 1280 octets, mais si le réseau n'a pas vocation à être mis en relation avec d'autre réseau IPv6, comme dans notre cas, la taille de ce buffer peut être réduit. Comme un paquet RPL à une taille maximale d'environ 32 octets et l'entête IPv6 d'envoron 40 octets, une taille de buffer de 100 est suffisante. SICSLOWPAN_CONF_FRAG correspond à l'utiliksation ou non du méchanisme de fragmentation des messages. Comme nos message seront normalement très court (moins de 10 octets), ce mechanisme ne devrait pas être utile et donc peut être retirer. Cela gagne de la place en RAM et en ROM. PROCESS_CONF_NO_PROCESS_NAMES correspond au mechanisme de nommage des processus créés dans Contiki. Comme il n'y aura pas beaucoup de processus et qu'ils ne seront pas lu par un humain lors du fonctionnement, désactiver ce mechanisme permet de gagner de l'espace en ROM principalement. UIP_CONF_TCP correspond à l'utilisation du mechanisme TCP. Comme le protocole UDP correspond à nos besoin, il n'est pas nécessaire d'intégrer les mechanismes de TCP.
De plus, dans le programme d'exemple, il y a de plus un mechanisme qu'il est possible de désactiver : les logs. En effet, Contiki propose un système avancé de log avec plusieurs niveaux permettant d'observer finement ce qu'il se passe durant le fonctionnement de l'OS. Passer de
#define LOG_LEVEL LOG_LEVEL_INFO
à
#define LOG_LEVEL LOG_LEVEL_NONE
permet aussi d'économiser un peu d'espace.
Avec ces modification, on arrive à
text | data | bss |
---|---|---|
41174 | 296 | 3492 |
On arrive donc en dessous des 4ko de RAM utilisée, mais il reste encore environ 10ko de ROM en trop.
RIOT
Comme je savais depuis mon projet IMA4 que RIOT occupait trop de place sur le cc430, j'ai pu rapidement tester des modifications afin de déterminer la taille prise en nmémoire. J'ai donc compilé le projet d'exemple gnrc_networking avec une carte proche du cc430 mais ayant plus de ROM et de RAM, le Tmote sky, ou telosB. Le resultat, sans modification préalable n'est pas encourageant : la compilation échoue car il y a un overflow de ROM de 14ko, sur les 48k disponible. La compilation n'indique pas d'overflow en RAM utilisé, mais le Tmote Sky ayant 10ko de RAM, ce n'est pas une chose à retenir car le cc430 n'en a que 4ko.
En modifiant le programme principale pour qu'il ne fasse rien, et en retirant dans le makefile l'inclusion de sources non nécessaire à notre projet (comme un shell), on arrive à un overflow de 7ko de ROM.
Avec ces même modifications, une compilation avec comme cible le cc430 indique un overflow en RAM de 1.6Ko de RAM.