bleugafoto

Des photos, et des restes. le blog de ecaheti.

Archive pour la catégorie ‘code’

« Articles plus anciens

Plusieurs semaines après avoir reçu mon Raspberry Pi, je lui ai enfin trouvé une fonction intéressante, qui marche, et qui s’est bien adapté à mon installation informatique domestique (en gros, je n’ai rien pourri, du moins pas à ma connaissance).

Le but

L’objectif vite fait que je m’étais fixé, c’est un serveur de téléchargement. L’idée c’était de pouvoir lancer des torrents à distance pour récupérer d’obscure distribution linux ou bien encore faire bénéficier la terre entière d’une source supplémentaire pour Warsow 1.0. Oui, je suis un geek altruiste. Également à mon cahier des charges, pouvoir lancer des téléchargements directs, en passant par une interface web. En effet, si un coup de ssh + wget fait l’affaire, d’un point de vue commodité d’utilisation ce n’est pas top, surtout quand les ports différents du 80 sont bloqués au boulot. Et par dessus le marché, se débrouiller pour que cela soit accessible un peu tout le temps malgré l’IP dynamique de ma box.

Préambule

Je ne sortirais pas un pack de binaire pour faire le taf, car j’ai utilisé plein de brique différente pour remplir chaque tâche fixée, entre ce qui se télécharge, ce qui se configure sur la box, les bouts de code php, les configs de serveur web et les scripts linux, il y a un peu trop de bazars pour “faire un pack”. Certains passages peuvent être délicat, surtout si on connait que pouic à Linux et à Debian. De plus, je considère certain point comme acquis de base, genre l’installation de l’OS sur le R-Pi.

Tout ce qui est décrit est surtout inhérent à Debian et à Linux plutôt qu’au R-Pi lui-même, si vous avez un PC qui traine dans un coin et que vous voulez faire la même utilisation c’est très possible. Sauf qu’il y aura des moyens probablement plus simples, voir meilleurs. Typiquement, j’aurai pu installer Java puis JDownloader, et en terme de fonctionnalité j’avais déjà presque tout le boulot de fait. Sauf que JDownloader c’est vachement trop lourd pour le Raspberry, et surtout c’est pas terrible pour la partie ligne de commande (certaines fonctions ont refusé de se lancer parce qu’aucun serveur X ne tournait). Et sur un ARM11@700MHz avec 256Mo, le serveur X est utilisable, mais si on peut se passer de le faire tourner c’est pas plus mal, surtout sans écran…

Matériel

  • Un Raspberry Pi, évidement
  • Un chargeur 5V/850mA de téléphone avec son câble micro-USB
  • Un carte SD de 4go (classe 4 à la limite, classe 6 ou plus préférée)
  • Un disque dur USB (fabriqué avec un boitier Antec fanless et un disque sata dedans)
  • Un dongle USB Wifi - DLink DWA131, reconnue sans problème par l’OS.

Pourquoi me galérer avec du Wifi puisque j’ai de l’Ethernet à bord ? Et bien parce que ma box est dans mon salon, et que pour des besoins d’esthétique de ce dernier j’ai décidé de ne pas y coller mon serveur en kit. Etant donné que le R-Pi est proche de mon PC, j’ai donc câblé l’Ethernet entre les deux. Comme ça, j’ai une connexion directe au serveur en cas de besoin…

A noter au passage que j’ai également intercalé un hub USB avec alimentation externe afin d’éviter que la clé Wifi ne tire trop de courant du Raspberry. Je vous passe les détails électriques, mais ce n’est pas forcément une bonne idée de faire consommer de l’élec sur un si petit appareil.

Au final, j’ai quand même 3 prises de courant d’utilisée… C’est sur qu’on est moins sur un modèle de discrétion qu’un Raspberry tout seul, mais bon, au pire je fabriquerais une alim unique en partant de celle du disque dur externe, mais on verra plus tard.

Logiciels

Comme je le disais, c’est un amas de brique disponible sur le net, de fonction de l’OS, et deux trois configurations et scripts maison. Voilà dans l’ordre ou je l’ai fait les grandes étapes de réalisation. Tiens au passage, j’en profite pour citer un outil Windows sympa: HDDRawCopy 1.02. Je m’en sers pour faire des copy brut de la carte SD avant de tenter des trucs à la con pour pouvoir revenir à un état précédant en cas de besoin.

Bon, zou, on y va.

Installer l’OS

Soyons honnête, celui-là, vous le faites tous seul. D’ailleurs on peut voir ça comme un test d’admission. Si vous n’y arrivez pas, vendez vendre Raspberry Pi sur internet, vous en tirerez plus de satisfaction. Sinon, vous avez le Beginners Guide sur elinux.org, et surtout quand même dans la version Wheezy, la commande raspi-config qui permet de tout bien faire joli sans se fatiguer, et qui de surcroit se lance automatique au premier démarrage de l’OS. Profitez en pour utiliser la fonction qui permet d’assigner un maximum de RAM au CPU au détriment du GPU, complètement inutile dans notre application. Et tant qu’à faire changez le mot de passe de l’utilisateur de base… (protip hacking : le login/mdp par défaut, c’est pi/raspberry. Si vous tentez de vous connecter malicieusement au R-Pi de quelqu’un, commencez par testez ça.)

Configurer la partie réseau

Phase assez importante puisqu’une fois réalisé, votre Pi va enfin pouvoir devenir indépendant de son écran. Commencez par vérifier que votre dongle Wifi est reconnu (ne le cherchez pas si vous n’en avez pas…) avec un lsusb :

moi@tarte ~ $ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 005: ID 152d:2329 JMicron Technology Corp. / JMicron USA Technology Corp. JM20329 SATA Bridge
Bus 001 Device 006: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 007: ID 07d1:3303 D-Link System DWA-131 802.11n Wireless N Nano Adapter(rev.A1) [Realtek RTL8192SU]

On voit dans le bordel un machin D-Link, c’est que ça doit être bon. Vérifiez maintenant que vos deux interfaces réseaux apparaissent quand vous taper ifconfig. Vous devriez voir lo, eth0 et wlan0. Si vous n’utilisez qu’une connexion Ethernet et que vous avez connecté votre R-Pi à votre box, sa config réseau doit être bonne et un ping www.google.fr vous confirmera que votre Pi est connecté au monde. Sinon, un petit
moi@tarte ~ $ sudo nano /etc/network/interfaces
vous donnera accès au fichier de config des interfaces réseaux. Voici la mienne, avec la partie wifi avec clé wep en DHCP, et la partie Ethernet en IP fixe.
auto lo
iface lo inet loopback
auto wlan0
iface wlan0 inet dhcp
wireless-mode managed
wireless-essid mon_reseau
wireless-key ###CLE_WEP###
iface eth0 inet static
address 192.168.137.85
netmask 255.255.255.0

Le contenu du fichier tel que je l’utilise vous permet d’avoir une connexion wifi en DHCP sur votre réseau ultra protégé par clé Wep (je vous laisse l’ami Google pour les autres types de clé de chiffrement bien plus sécurisée) pour la partie Web, ainsi qu’une connexion “de backup” directement branché en ethernet sur votre PC. Il conviendra bien évidement d’utiliser une adresse IP sur le même sous-réseau sur le PC.

Connexion d’un disque dur USB

Je ne l’ai pas précisé, mais un boitier disposant de sa propre source d’alimentation est préférable, voir indispensable. Je vous parlais de l’alim du dongle wifi qui était limite, c’est encore plus critique avec un disque dur, nettement plus gourmand. Pour connecter un disque dur sous Linux, il faut le “monter” dans l’arborescence. En gros dire à l’OS “Quand tu détectes tel périphérique, affiche son contenu à tel endroit, de tel façon, avec tel droit”. Quand vous êtes sur la ligne de commande uniquement, il faudra taper la commande adequat une fois le disque dur connecté. Si vous avez lancé l’interface graphique LXDE, il se montera tout seul avec des paramètres génériques plutôt pas mal. J’ai donc profité de ce montage automatique pour recopier les paramètres et les mettre dans le fichier /etc/fstab afin d’avoir un montage automatique du disque dès le démarrage de l’OS.
Je récapitule :

  • Allez dans LXDE avec un startx.
  • Branchez le disque.
  • Récupérez les paramètres actuellement utilisé en tapant mount
  • Débranchez le disque
  • Créez le répertoire de montage la où bon vous semble (chez moi mkdir /media/disque_ext)
  • Editez le fichier fstab pour rajouter la ligne

/dev/sda1 /media/disque_ext auto rw,nosuid,nodev,allow_other,default_permissions 0 0

  • Dans la ligne de commande, tapez sudo mount -a pour monter tout ce qui est décrit dans fstab.

Voilà, vous avez normalement à présent un système qui monte son disque tout seul au démarrage et qui se connecte à l’Internet mondial. Et dès fois que votre box explose, vous gardez un accès via Ethernet.

Partager le contenu du disque

Bon, je ne vous le cache pas, c’est une partie qui m’a un peu fait chier. Si l’installation de base de samba (l’outil Linux qui permet de partager des fichiers “façon partage de fichiers Windows”) est très simple comme n’importe quelle installation sous linux, sa configuration est toujours un peu hasardeuse à mon gout. Mais au moins, on contrôle TRES finement le moindre droit d’accès.
Premier truc, installer samba :
sudo apt-get install samba
Ensuite viens la partie la plus marrante, celle où on va remercie Google d’exister, l’édition du fichier de configuration. Mon but à moi était d’avoir un repertoire publique, accessible par n’importe quel utilisateur de mon réseau, sans login ni mot de passe. Les plus “power user” d’entre vous voudront peut être également des répertoires par utilisateur, mais dans mon cas, le seul répertoire qui m’intéresse est celui dans lequel vont attérir tout les téléchargements lancés via torrent ou via direct download.
Le fichier de configuration de samba est le suivant : /etc/samba/smb.conf. Avant de tout pourrir parce que vous risquez de faire quelques essais à taton avant d’obtenir la bonne solution, faites une petite copie du fichier.
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.original
Ensuite, pour l’éditer :
sudo nano /etc/samba/smb.conf
Dans mon fichier, j’ai modifié le droit d’accès général (section ####### Authentication #######), qui est passé de
#security = user
à
security = share
J’ai également rajouter
map to guest = bad user
guest account = nobody

Et enfin j’ai inséré à la fin le bloc
[Partage]
comment = Public Storage
path = /media/disque_ext/
read only = no
public = yes
browseable = yes
guest ok = Yes
create mode = 777
directory mode = 777

pour désigner mon répertoire de partage. J’ai également changé les droits d’accès, de façon un peu brutale il est vrai, à mon disque externe. En effet, vous avez beau avoir le droit de passer l’étage d’authentification samba avec votre PC, ça n’octroit pas forcement le droit d’accéder à tout les répertoires du serveur. Un chmod sur le repertoire /media/disque_ext devrait faire l’affaire.
Dernière étape, à faire à chaque modification de /etc/samba/smb.conf, relancez le serveur samba :
sudo /etc/init.d/samba restart
Félicitation, si tout marche bien, vous avez un NAS. A noter au passage que votre R-Pi devrait apparaitre dans l’explorateur de réseau de Windows, mais la règle qui décide par quelle interface réseau vous y accédez m’est complètement inconnue. En effet, vous pouvez utilisez soit votre carte Wifi, qui étant connecté au même réseau que le serveur permet de s’y connecter, soit votre carte Ethernet. Le meilleur moyen que j’ai trouvé pour forcer Windows à utiliser une carte ou l’autre est d’entrer directement l’adresse IP correspondant à l’interface voulue dans la barre d’adresse de l’explorateur (ou via le menu “Executer”). Ainsi, en passant par \\192.168.137.85, vous utilisez l’IP que vous avez configurée pour Ethernet, et donc vous bénéficierez d’un débit nettement meilleur pour lire et écrire sur votre serveur. Tant qu’à automatiser les choses, j’ai créé dans Windows un disque réseau lié directement à mon repertoire de partage, m’évitant donc de me poser la question quand je veux récupérer mon DVD d’install de Ubuntu de 6Go.

Installer Transmission

Transmission est un client torrent un peu connu, à tel point que c’est celui fourni avec les distributions Ubuntu et leurs dérivées (LinuxMint, par exemple). Pour l’installation, comme d’hab c’est assez simple, il faut juste savoir que c’est le paquet transmission-remote et pas transmission tout court qui vous intéresse. Transmission-remote contient juste ce qu’il faut pour utiliser le client avec une interface web ou bien la ligne de commande. C’est le premier cas qui nous intéresse.
Ensuite vient la config de transmission, et cela se fait par le fichier /var/lib/transmission-daemon/info/settings.json
Il convient de modifier plusieurs choses, du genre :
accès par l’importe à partir de n’importe quelle adresse source : "rpc-whitelist": "127.0.0.1,*.*.*.*",
Nom de l’utilisateur : "rpc-username": "moi",
Mot de passe : "rpc-password": "les-fps-c-lol",
NB: cette ligne sera crypté au prochain restart du service
Port de connexion : "rpc-port": 1234,
Emplacement de téléchargement : "download-dir": "/media/disque_ext/",
Dernière étape, on redémarre le service pour prendre en compte les modifs
sudo service transmission-daemon start

Voilà, vous pourrez donc vous connectez à votre interface en allant sur http://server_ip:1234, en utilisant soit l’adresse du Wifi, soit celle de l’Ethernet.

L’interface web permet déjà quelques réglages sans avoir à toucher à settings.json, mais au besoin vous pourrez paramétrer un peu plus finement votre serveur en tapant dans le fichier.

Installer Lighttpd et PHP pour la suite

Alors non, mon but n’était pas d’hebergé un serveur web avec mon CV et mon blog, parce que 1) je ne cherche pas de taf, et j’ai déjà un blog que vous êtes dessus. Mais pour gérer les téléchargements directs, je n’ai trouvé que wget4web, qui est un ensemble de scripts CGI en Perl qui fonctionnent donc à partir d’une page web. Et pour le PHP, c’est que j’avais besoin d’information pour certain lien que seul PHP pouvait me fournir. Mais on verra cela dans les parties suivantes.

L’installation de Lighttpd est relativement conne, et c’est encore une fois la config qui s’avère plus délicate.
Pour l’installer, one more again :
sudo apt-get install lighttpd
Puis les extensions PHP
sudo apt-get install php5-common php5-cgi php5
Activation de l’extension PHP
sudo lighty-enable-mod fastcgi-php
Activation de l’extension CGI
sudo lighty-enable-mod cgi

L’activation de CGI va créer un fichier /etc/lighttpd/conf-enabled/10-cgi.conf, que vous modifierez de la façon suivante

$HTTP["url"] =~ “^/cgi-bin/” {
cgi.assign = (
“.cgi” => “/usr/bin/perl”,
)
}

pour spécifier à votre serveur quels binaires il devra utiliser lors d’un accès à un fichier .cgi .

On termine par dire serveur web de prendre en compte la nouvelle config
sudo service lighttpd force-reload

D’un point de vue facilité d’utilisation, il est pratique d’autoriser votre utilisateur linux du R-Pi à utiliser facilement le dossier /var/www/ dans lequel se trouve vos pages (genre éviter de faire des sudo à foison pour mettre des fichiers dans le repertoire).

Changez le propriétaire du dossier pour assigner le groupe www-data
sudo chown www-data:www-data /var/www
Donnez le droit d’écriture au groupe
sudo chmod 775 /var/www
Ajoutez votre utilisateur (”moi”) au groupe
sudo usermod -a -G www-data moi

Vous avez maintenant un serveur web capable d’executer des scripts en Perl et du PHP, et vous pouvez donc monter un site web 1.0 accessible à http://server_ip, en mettant vos pages dans /var/www/ .

Installer et configurer wget4web

On arrive à un point qui n’est plus très compliqué. Télécharger à la main (oui, des fois ça arrive!) l’archive contenant wget4web dans votre /var/www, en créant un répertoire cgi-bin au préalable.

cd /var/www
mkdir cgi-bin
cd cgi-bin
wget http://exir.ru/wget4web/wget4web-1.0.tar.gz

Et décompresser là directement dedans
tar xzf wget4web-1.0.tar.gz

Il vous faudra ensuite modifier /var/www/cgi-bin/wget4web/data/info.cgi dans lequel se trouve les emplacements de téléchargements ainsi que certaines autres infos intéressantes :

# Directory for Wget logs
$logsdir = "/media/disque_ext/logs";
# Directory for tasks for wget
$tasksdir = "/media/disque_ext/tasks";
# There save downloading files
$filesdir = "/media/disque_ext/p";

N’oubliez pas d’aller créer les répertoires logs et tasks à la racine de votre disque externe…

Puis, dans le fichier /var/www/cgi-bin/wget4web/data/users.cgi, ajouter les utilisateurs qui auront droit d’utiliser le service. La syntaxe est simple, chaque ligne contient un utilisateur, son mot de passe, et la mention admin pour accéder à quelques options de niveaux supérieurs :
moi|mo2pass|admin
lui|lololol

Vous avez maintenant accès à :
http://server_ip/cgi-bin/wget4web/add.cgi - Permet d’ajouter un téléchargement
http://server_ip/cgi-bin/wget4web/progress.cgi - Permet de voir les DL en cours
http://server_ip/cgi-bin/wget4web/admincenter.cgi - Permet de voir certaines statistiques et permettre la supression des téléchargement en cours.

Quand on lui demande télécharger un truc, ça fait le boulot. Le soucis c’est que les pages de stats ne fonctionnent pas bien. C’est un peu pénible, mais bon, on peut faire avec. J’ai vu un type proposer une version modifié, mais uniquement sous forme de binaire pour des Mybook de WD. Les binaires… chouette…

Voilà, vous disposez maintenant d’un serveur qui fait tourner des services de téléchargement divers, pour peu que vous connaissiez les adresses de chaque pas. C’est la où c’est super classe d’avoir un serveur http déjà prêt, vous allez pouvoir faire une page de résumer de tout les liens disponibles sur votre Raspberry.

Configuration de la box pour gérer tout ça de loin

Bon, c’est super cool, mais si vous pouviez manager tout ça de loin, genre avec votre smartphone pendant que vous êtes au pestacle de fin d’année de votre moutard, ça serait mieux. Dans l’idée, vous avez 3 ports à rerouter sur votre box. Le port 80 pour le serveur web, le port 1234 pour Transmission, et éventuellement, le port 22 pour vous connecter discretement en ssh (qu’évidement vous changerez, au moins sur la box, par mesure de sécurité).
Pour cela, utilisez Google qui vous dira comment facilement router les ports de votre box vers les ports TCP du Raspberry Pi.

Comment se debrouiller avec son IP dynamique

Je fais partie de cette frange de la population dont la box change régulièrement d’IP pour une raison qui m’échappe encore. Enfin, ce que je ne comprends pas, c’est pourquoi certains changent, et pas d’autre. Bref, peu importe, j’ai trouvé un truc. Vous pouvez tenter de vous debrouillez en vous inscrivant sur un site genre no-ip ou bien dyndns, ce que je n’avais pas envi de faire parce que 1) la dernière fois que j’ai essayé de faire un truc comme ça, j’ai pas réussi 2) j’ai mon propre site et j’avais envie de pouvoir m’en servir. La classe ultime aurait été de pouvoir créer un sous domaine qui m’amène directement sur le R-Pi. Mais cela n’est visiblement pas possible avec mon hébergeur. Pour remédier à ça, j’ai donc créé un script (merci au gens qui m’ont aidés à le faire!) qui se lance tout les 5min a l’aide des cron table de linux, qui va regarder mon adresse IP publique, et la compare avec la précédante (stockée dans un fichier texte).
Si l’adresse est identique, on ne fait rien, et si elle est différente, j’upload sur mon site un page web contenant une bête redirection vers la nouvelle adresse IP.
Pour récuper l’IP, je choppe la page de garde de icanhazip.com.

#!/bin/sh
FILE='redir.html'
rm $FILE
wget -O ip.txt http://icanhazip.com
cmp -s ip.txt ip_old.txt
if [ $? -eq 0 ]; then
echo “Same IP has previous, no need to change”
else
echo “IP different, will upload IP redirection”
echo “<html>” >> $FILE
echo “<head>” >> $FILE
echo -n “<title>Ma redirection</title>” >> $FILE
echo “<meta http-equiv=\”content-type\” content=\”text/html; charset=utf-8\” />” >> $FILE
echo -n “<meta http-equiv=\”refresh\” content=\”2; URL=http://” >> $FILE
sed -n ‘1p’ ip.txt >> $FILE
echo  “\”>” >> $FILE
echo “</head>” >> $FILE
echo “<body>” >> $FILE
echo “</body>” >> $FILE
echo “</html>” >> $FILE
./envoi_fichier_ftp
fi
mv ip.txt ip_old.txt
exit 0

Ce script en appelle un deuxième pour l’upload du fichier, le script envoi_fichier_ftp (Je reconnais m’être honteusement très inspiré de l’internet pour faire ce script):

#!/bin/sh
HOST='ftp.monsite.fr'
USER='moi'
PASSWD='***'
FILE='index.html'
ftp -n $HOST << END_SCRIPT
quote USER $USER
quote PASS $PASSWD
put $FILE fb/$FILE
quit
END_SCRIPT
exit 0

Je précise qu’il n’y a aucune nécessité d’avoir un site internet à soit pour faire marcher ce truc, vous pouvez très bien l’utiliser avec un monsite.free.fr.

Les plus attentifs (s’il y en encore, cet article est le plus long que j’ai fait, je crois. Je vais surement mettre des photos de dames pour donner du courage aux plus téméraires lecteurs) auront remarque que la redirection m’amené sur la racine de l’adresse ip externe… où il n’y a rien. En effet les script CGI sont http://server_ip_extern/cgi-bin/wget4web/***.cgi, et le serveur Transmission sur un port différent. Voilà donc l’occasion rêvée de faire une page de garde en PHP !

Si faire une une page avec les liens vers les CGI est plutôt simple, changer le port alors que, je vous le rappelle, l’on ne connait pas l’IP sur laquelle on se trouve est un poil plus compliqué. Enfin, une fois qu’on a la bonne variable PHP (merci au gens qui m’ont aidés à le faire, encore une fois), c’est plus simple. Voilà le petit bout de code qui m’a permis de faire un lien sur l’adresse IP en changeant de port :

<?php $ip = $_SERVER['SERVER_NAME']; ?>
<p><a href=”http://<?php echo $ip;?>:1234″>truc avec des torrents légaux</a>

Cela aura le bon goût de s’appliquer quelque soit votre IP d’accès, externe, interne via Wifi, interne via Ethernet
Le reste du fichier est du html tout ce qu’il y a de plus con, des liens, un titre pour faire joli, une CSS pour faire encore plus joli (ok… ça m’a servi pour éviter une répétition de l’image de fond). Vous pouvez même faire des trucs trop top avec des cadres, des frames, des gifs animés de david bastien, des photos de votre chien, mais rappelez vous une chose, tout cela tourne sur un tout petit serveur avec le petit upload de votre ADSL (les fibrés, vos gueules !), ne lui en demander pas trop !

Bon, ceci clos ce gros paté pour faire de presque A à Z un serveur de téléchargement. J’espère n’avoir rien oublié pour qu’au moins, de base, ça marche. Pour finir, je tiens aussi à préciser que ces travaux sont l’oeuvre d’un passioné un peu touche à tout, et pas vraiment un professionnel du domaine. Certains points sont donc clairement améliorable, et c’est avec une certaine humilité concernant l’ensemble de la réalisation que j’en parle. Je suis conscient qu’il existe peut être des failles ou des imperfections inadmissibles, et si vous aviez quelques conseils à prodiguer, allez y de bon coeur !

Sources
http://elinux.org/RPi_Adding_USB_Drives
http://elinux.org/R-Pi_NAS
http://sorrodje.alter-it.org/index.php?article29/seedbox-sur-micro-vks-avec-transmission”
http://www.penguintutor.com/linux/light-webserver
http://bredsaal.dk/using-shell-scripts-for-cgi-in-lighttpd
http://exir.ru/wget4web/

Raspberry Pi

Thursday 5 July 2012


Aujourd’hui, on va parler un peu de ce petit “ordinateur”. En effet, malgré sa taille et son encombrement plus que réduit, il faut bien reconnaitre qu’on y branche la même chose que sur une UC classique (clavier/souris/écran/alim/”disque dur”), et que ça permet de taper du texte, aller sur l’Internet, envoyer un mail, bref, des trucs qu’on sait déjà tous faire avec un PC classique, une console de jeu ou un smartphone.

Alors qu’est ce que ça fait d’intéressant ? Et bien en général, on y voit 3 applications majeurs :

  • Officiellement, les concepteurs du RPi le voit comme un support pédagogique low cost pour l’apprentissage du développement. La version de l’OS proposé de base, Debian,  embarque de quoi développer dans pas mal de langage différent (python, C, perl, …), avec des approches graphiques (scratch).
  • Pour les autres, une machine embarquant Linux et bouffant 2/3W qui fait un jolie petit serveur domestique (NAS, LAMP)
  • Et pour les radins, ça peut même faire un média center. En effet, si le processeur principal est clairement un peu out-of-date, il embarque un GPU qui à l’air de prendre en charge du 1080p

Et pour moi ? Et bien je me cherche encore. Ça sera de mauvaise foi de dire que j’ai pas eu le temps, car j’ai commandé la carte chez Farnell le 3 mars, et je l’ai reçu il y a 2 semaines. Ça fait un peu de délai oui. En tout j’en ai eu pour 39 euros, frais de port compris. J’ai bidouillé un peu, fait un NAS vite fait, pourri une fois l’OS, tellement que je l’ai déjà réinstallé, et au final je crois que je vais plutôt faire du dev avec, et ce qui me plairait c’est de faire clignoter des Leds. Ouais, faire clignoter c’est tellement chouette. Bon, en gros, interfacer un peu d’électronique avec pour pouvoir construire Optimus Prime.

Alors si toi aussi tu te sens l’âme d’un bidouilleur de l’extrême et que tu veux tenter de faire des choses avec ton Pi Framboise voilà deux trois liens.

Le site de base, pour avoir des news trop bien genre “Tu peux acheter le boitier en Lego !” : www.raspeberrypi.org

Le wiki “officiel”, dans l’ensemble une bonne mine d’information : elinux.org/R-Pi_Hub

Le jour où vous recevez enfin votre Raspberry Pi, que vous avez installez elinux.org/RPi_Beginners. Vous y trouverez les 2 ou 3 trucs de base à savoir pour avoir une jolie Debian avec un compte à votre nom, configurer votre clavier, la langue du système, enfin bref, tout ce qui ce fait lors d’une installation sur un PC classique.

A partir du wiki j’ai extrais des liens vers des lib que je testerais WiringPi et les drivers de Mike McCauley. Ce sont des librairies en C permettant de jouer avec la partie GPIO. Les broches accessibles permettent également de faire d’autre type de communication, plus ou moins supportées également par ces drivers. Au pire ils ont l’air suffisamment bien documenter pour qu’avec la documentation du CPU du Raspberry Pi on puisse les compléter facilement.

Ah, j’oubliais, si l’achat d’un boitier n’a pas beaucoup d’intérêt, j’ai trouvé autre chose qui fait très joli :  le Starter Kit de SKPang. C’est un support pour le RPi avec une plaquette d’évaluation, ainsi que des leds, des résistances et interrupteurs. Ce qui ont fait un peu d’électricité/électronique au lycée auront une petite remonté de souvenirs émus. Pour commencer à faire du prototypage d’I/O vers le monde extérieur, ça m’a l’air pas mal du tout.

[PE-Ep5]: OS Temps Réel

Monday 9 April 2012

Parlons “embarqué” [Ep5]: OS Temps Réel

Je quitte un peu les bas fond de l’électronique pour évoquer un sujet nettement plus orienté développement logiciel.

OS Temps Réel Multitâche : Définition

Pour être précis, la définition que j’utilise. Un système temps est un système dont le temps de réaction associé à la moindre action est connu. Un OS Temps Réel (RTOS) est donc un ensemble de routines et de primitives respectant ces conditions. Par exemple le passage d’une tâche à une autre prend toujours le même temps.

Si on étend le concept, la mesure d’une grandeur physique par un capteur est dite “temps réel” quand on sait combien de temps cela prend. Si on attend une valeur au bout de 10s, et que la réponse arrive au bout de 12s, ça ne sert à rien, peu importe le reste (précision, etc.). Cela s’oppose donc à la notion de “temps réel” habituelle du grand public qui tourne plutôt autour de l’immédiateté.

Et le multitâche ?

C’est la possibilité qu’a votre OS de faire plusieurs choses en même temps. Comme vous êtes féru de technologie, vous savez très bien qu’un processeur n’exécute qu’une seul instruction à la fois par cœur (m’emmerdez pas avec votre hyperthreading, c’est pas vraiment le genre de truc qu’on gère dans un microcontrôleur), et on en arrive au fait que votre multitâche est en fait votre µC qui exécute un bout de tâche par-ci et un autre par-là.

Question bonus : un OS ? Genre on peut installer des applis et tout ?

Humm en général non. A part pour les Linux embarqué (et qui ne sont pas forcement temps réel, ucLinux par exemple, mais pas QNX qui lui l’est) qui se comportent comme des Linux, beaucoup d’OS embarqué sont compilés en même temps que le reste de l’application. Cela est évidemment possible car le cœur d’un OS n’est pas “très” compliqué. Une fois les drivers (oui, c’est au développeur de les coder et de les intégrer dans l’OS) et la Dame de Pique enlevés, il ne reste plus que l’ordonnanceur et les objets de l’OS.

Ordonnanceur ?

L’ordonnanceur  (ou scheduler pour les intimes), c’est ce qui fait que votre OS est multitâche. Je disais tout à l’heure que votre µC qui exécute un bout de tâche par-ci et un autre par-là, bon, en vrai votre µC ne fait que ce que le l’ordonnanceur lui demande. Pour bien comprendre comment ça marche, intéressons nous d’abord aux tâches, qu’on va bien nettoyer.

Une tâche est une routine qui s’exécute en boucle et qui peut avoir 3 états fondamentaux :

  • En cours (Running)
  • En attente (Waiting)
  • Prête (Ready)

On peut y rajouter d’autres attributs en fonction de l’OS comme par exemple un numéro de priorité, nécessaire pour beaucoup de système, mais pas obligatoire. L’idée de base, c’est que lorsque votre CPU exécute la tâche, elle est “Running”, quand elle va attendre un évènement elle va se mettre en “Waiting” sur cet évènement, quand l’évènement arrivera elle passera en “Ready”. Ensuite quand votre  ordonnanceur se posera la question fondamental “Quelle tâche vais-je donc exécuter maintenant ?” il verra votre tâche qui est “Ready”, un peu comme quand vous vous hâtiez de lever la main pour répondre à la maitresse.

Mais si j’ai trois tâches (soyons fou, A, B et C), et que 2 ou plus sont Ready en même temps, mon  ordonnanceur fait quoi ? Et bien ça dépend de l’OS. Premier cas, votre OS gère ce que l’on appelle le Round Robin, et dans ce cas il se débrouillera pour attribuer le même temps CPU à chaque tâche. Deuxième cas, votre OS ne gère pas le Round Robin et dans ce cas c’est le concept de priorité de la tâche qui entre en jeu.

Vous êtes probablement familier avec le concept de niveau de priorité parce que vous avez remarqué que, dans le gestionnaire de tâche de Windows, vous pouviez changer la priorité d’une tâche. J’ai jamais réellement su si ça pouvait avoir un effet bénéfique ou bien si cette option a été créé juste pour rendre instable le PC des téméraires les plus curieux. Mais je m’égares. Certain OS simplifie la gestion des priorités en interdisant que 2 tâches aient le même niveau de priorité. Lorsque c’est le cas, à la question “3 tâches sont Ready, laquelle passe en Running ?” la réponse est “celle du plus haut niveau de priorité”. Au passage j’élude vite fait les niveaux de priorité identiques : dans ce cas l’OS fait du Round Robin et attribut le même temps CPU aux tâches de même priorités.

Vous l’avez compris, on ne peut avoir qu’une seule tâche en Running. Quand les trois sont Ready, on exécute (la pauvre!) celle de plus haut niveau de priorité. Et quand les trois sont Waiting on … ben on fait quoi ? Et bien on se touche la bite ! On utilise une tâche système qui s’appelle la tâche “Idle”. Un microcontrôleur de base ne peut pas “s’arrêter de tourner”, il faut donc lui filer du grain à moudre même si c’est pour lui dire de tourner en rond (astuce belge, le mettre dans une pièce ronde et lui dire de chercher une frite qui se trouve dans un coin). La tâche Idle c’est du vent, une boucle infinie vide. Travaux pratique : faites Ctrl+Shift+Echap et trier par “CPU” dans la liste des process. Et le grand gagnant est… Processus Inactif du Système ! La tâche Idle de Windows, celle qu’exécute l’OS quand il n’y a rien à faire.

Au final, pourquoi un OS dans l’embarqué ?

Ça, c’est la vrai question. Première réponse : surement pas pour accélérer votre code. En effet, passer d’une tâche à l’autre à un coup en terme de RAM et en terme de temps CPU. Si votre appli est ultra optimisée complètement rédigée en assembleur avec un taux d’occupation CPU de 100%, ne rêvez pas, un OS ne vous créera que des ralentissements.

En revanche il est possible que votre appli fasse plein de petites choses différentes, ai besoin d’une communication vers l’extérieur, fasse un contrôle de process dont le temps de réaction est de l’ordre de la milliseconde, tout en contrôlant des variables provenant de capteurs divers, affiche des données statistiques sur un petit écran LCD, etc. Là, un OS peut être utile. En organisant les différentes fonctions de votre applications en différentes tâches, vous posez dissocier les process internes. En choisissant judicieusement vos niveaux de priorité par la suite, vous aurez votre OS qui gérera tranquillement ce que vous lui avez demander sans avoir à vous tapez une grosse machine d’état pour savoir comment organiser votre communication par rapport à votre acquisition de température. Virtuellement les deux se font en même temps.

Et il n’y a pas que l’organisation en tâche qui rend un OS pratique. Il y aussi tout les objets systèmes que votre OS pourra vous proposer. Je n’ai pas abordé le sujet des timer OS, des sémaphores et des boites à lettre, mais ces objets de synchronisation permettent à vos tâches de communiquer entre elles, tout en mettant en place des systèmes sécurisés prêts à emploi.

En attendant un article complémentaire sur quelques mécanismes internes, les objets systèmes et un lave-linge, si le sujet intéresse il y a toujours plein de doc sur les Internettes.

Si vous avez manquez les épisodes précédents :

Pour résumer, on avait parlé des opérations de bases d’un processeur et du câblage d’un boitier mémoire ridiculement petit. Un boitier de RAM, c’est bien, plusieurs boitiers, c’est mieux!

J’ai décidé aujourd’hui, en pleine semaine de solde, d’acheter un peu de mémoire flash pour mon montage, dans le but de sauvegarder les résultats de mes calculs même une fois que mes composants seront privés d’électricité (Si je vous dis que la RAM est volatile ça va ? ça ne vous choque pas ? très bien). Et comme c’était les soldes, j’ai eu le droit avec mon boitier de Flash F4k16 (4k de flash 16bit, soit 8 kilooctets de données) à un boitier de RAM M1k (rappel, 1k de ram 8bit, soit 1 kilooctet de données) offert ! Formidable !

Câblage

Nous avions vu la dernière fois que pour câbler notre boitier, nous avions du brancher 4 “catégories” de fil : le bus d’adresse, le bus de donnée, le Read/Write et le Chip Select. Pour les bus, c’est très con, on tire les fils qui vont bien. Pour la RAM, le câblage est identique à celui réalisé précédemment (10 fils, A0 à A9). Pour la flash, la plage d’adresse du boitier de flash étant plus grande (4 est supérieur à 1), il va falloir tirer plus de fils entre le processeur et le boitier. Deux de plus pour être précis. Attention, démonstration ! 4k veut dire 4096 adresses différentes, allant de 0 à 4095. 4095 en binaire vaut 111111111111. Pas la peine de compter les 1, il y en a 12. D’où mes deux fils de plus. Les esprits fins de certains lecteurs auront remarqués que je vais tenter d’interfacer un boitier avec 16bit de data sur un microprocesseur 8 bits. Ben… les promotions Carrefour étaient sur les boitiers 16 bits, que voulez vous que j’y fasse ! Déjà, c’est quoi la différence entre un boitier 16 bits et un boitier 8 bits ?

Interlude “Mathématiques, Hexadécimal et autre décalage logique”.

Je vous ai décrit la fois précédente mon boitier de ram comme un tableau Excel de 1024 lignes dont le contenu pouvait varier entre 0 et 255. Et bien le boitier 16 bit est un tableau dont les valeurs peuvent varier entre 0 et (2^16) - 1, soit 65535. On peut également le voir comme un tableau avec 2 colonnes (au hasard, on va appeler la colonne de droite LSB pour Less Significant Byte, et celle de gauche par MSB pour Most Significant Byte. Attention, en fonction du contexte, le B peut vouloir dire Bit également), dont la valeur peut varier entre 0 et 255.

En multipliant le contenu de la case MSB par 256 et en ajoutant le LSB, on retrouve une valeur 16 bits. Pourquoi cette multiplication par 256 ? Prenons quelques exemples concrets. Et branchez votre cerveau dégourdi, on va faire des multiplications. Par deux, c’est super balèze. En binaire, 0 vaut 0 et 1 vaut 1 (si vous avez un doute, vérifiez avec la calculette de Windows, trop bien pour les conversions). 2 = 10 4 = 100 8 = 1000 Votre esprit aiguisé aura remarqué avec brio que pour passer de 2 à 4 et de 4 à 8, on dirait qu’on a juste rajouté un 0 ! Et oui, vous pouvez vérifier avec par exemple avec 3 (11) et 6 (110). La multiplication par 2 en binaire, c’est un décalage logique de 1 bit vers la gauche. Et par conséquent, une division par 2 est un décalage logique vers la droite : si on décale 14 (1110) d’un bit vers la droite, ça donne 111, soit 7. Par conséquent du conséquent, un décalage de 2 bit vers la gauche implique une multiplication par 4; 3 bit donne une multiplication par 8, etc. Alors what iz ze point avec mon boitier 16 bit ? Et bien votre MSB représente la partie 8 bit haute de votre nombre 16 bit. Elle est donc décaler de 8 bit, et donc est multiplier par 2^8 = 256. Ainsi, si votre MSB vaut 255, que votre LSB vaut 255, votre nombre 16 bit vaut 255 x 256 + 256 = 65535.

Retour à mon montage

Sur le schéma, on voit que j’ai câblé les fils D0 à D7, soit ma colonne “LSB”. Je vais donc pouvoir y accéder sans problème comme sur le boitier de RAM. Pour le MSB (fils D8-D15), je ne vais rien en faire, puisque de toute façon, j’ai un microprocesseur 8 bit (enfin en vrai je vais les câbler à la masse pour éviter les perturbations de signaux mais ce n’est pas le sujet). Vous avez donc compris que je vais gâcher la moitié de la mémoire flash car je ne pourrais en l’état pas y accéder, ni en lecture ni en écriture. Mais puisque je vous dis que c’était les soldes ! Il me reste donc 2 signaux à caser : R/W et CS. R/W peut se câble comme un bus, directement sur chaque composant. Par contre pour CS, c’est un peu plus siouxe.

La source de CS (ce titre de paragraphe n’est là que pour faire monter mes stats Google)

Si vous vous rappelez de l’article précédent (c’est le cas j’en suis sur), vous savez que le CS permet au processeur de désigner à qui il s’adresse, pour qui sont destinés les valeurs qui transitent sur les bus de donnée/adresse. Et manque de bol, je viens de regarder dans la documentation technique (datasheet) du processeur, je n’ai qu’un seul sortie CS ! OMG LOL WTF §§!! Je ne peux pas utiliser le même signal CS sur mes trois boitiers puisque dans ce cas, j’écrirais dans les trois boitiers en même temps, mais surtout la lecture va se faire également en même temps et la si un boitier veut coller 5Volts sur le bus (pour écrire un 1, je rappelle) et que l’autre veut mettre 0 Volts (pour écrire un 0) ça va faire un sacré bordel. Comment vais-je donc faire ? Et bien je vais faire du décodage d’adresse. Qu’est ce que donc ?

Définir le mapping mémoire

Dans un premier, on prend un papier et un crayon, et on organise son merdier. J’ai 2 boitiers avec 1024 adresses, et un boitier avec 4096 adresses. Mon micro, lui, avec son bus d’adresse 16 bit, peut adresse 2^16 soit 65536 adresses différentes. En gros, va falloir organiser les trois plages des boitiers dans l’espace adressable total du µC. Mon premier choix, c’est de dire : j’aligne tout. D’ailleurs c’est tellement une bonne idée que je vais la garder. On n’a qu’à dire que les 1024 premières adresses sont pour le premier boitier de RAM, les 1024 suivantes pour le deuxième boitier, et les 4096 suivantes sont pour la flash. En résumé :

J’ai maintenant une idée de ce que je veux obtenir, je peux ENFIN passer à la gestion de mon Chip Select.

Le décodage d’adresse

Ce qui va faire la différence entre les datas qui vont dans RAM1, RAM2 et Flash, c’est la plage d’adresse que j’ai attribué à chaque composant. Je vais donc me servir de mon bus d’adresse et d’un peu de porte logique pour faire la différence entre les boitiers, j’activerai alors le CS de chacun des boitiers de façon indépendante.

Rappel de logique combinatoire (oui, on en voit des choses aujourd’hui!)

Principe de base : combiner des signaux électriques pour réaliser des opérations logiques. Les briques de bases qui vont nous servir aujourd’hui (il y en a d’autre) sont la porte ET (symbole logique “.”, symbole informatique “&”), la porte OU (symbole logique “+”, symbole informatique “|”) et la porte NON (symbole logique “/”, symbole informatique “!”). Vous rentrez un ou plusieurs signaux sur les entrées, et vous obtenez un résultat de l’autre côté. On appelle “table de vérité” le principe de comportement de la porte.

Alors pourquoi je parle de ça ? Et bien simplement car grâce à plusieurs portes logiques bien placées, on va pouvoir réaliser une “équation logique” qui va permettre de diriger notre signal CS (oui, je rappelle qu’au départ on parlait de lui, avant que vous ayez eu cette idée stupide d’écrire tl;dr). Si on regarde le mapping mémoire, en particulier les bits de poids fort (les plus à gauche), on voit que les combinaisons qu’ils composent sont propres à chaque composant. Si les bits A10, A11, A12, A13, A14 et A15 sont à zéro, on est sur d’être sur la plage mémoire de RAM1. Puis avec A10 à 1 et A11-A15 à 0, on est sur d’être sur RAM2. Pour le boitier flash, c’est un peu plus tordu car il occupe un nombre plus important de combinaison de A10-A15, mais il existe tout un art concernant la simplification d’équation logique. Nous allons les écrire vite fait, présenter le câblage de notre “décodeur”. Nous cherchons à couper notre CS en trois signaux pour chacun des boitiers : CS1 pour RAM1, CS2 pour RAM2 et CS3 pour la flash.

CS1 = CS.(/A10./A11./A12./A13./A14./A15) : pour activer CS1, il faut avoir CS à 1, et tout les autres à 0

CS2 = CS.( A10./A11./A12./A13./A14./A15) : pour activer CS1, il faut avoir CS à 1, et tous les autres à 0 sauf A10

CS3 = CS.( (/A10. A11./A12./A13./A14./A15) + (A10.A11./A12./A13./A14./A15) + (/A10./A11.A12./A13./A14./A15) + (A10./A11.A12./A13./A14./A15) ) je vous laisse comprendre, comparez ça au mapping un peu plus haut.

Voici donc notre circuit logique qui va nous produire nos trois Chip Select différents. Il sera donc impossible d’adresser en même temps deux composants.

Cependant, il faut être franc, il existe en général des boitiers programmables ou ce genre de boulot, vous simplifiant clairement la tâche. D’ailleurs j’en ai trouvé un par terre, je vais tout de suite le mettre sur mon schéma final !

Voilà, on a encore amélioré notre système embarqué. Vous collez ça avec un alim au fond d’une machine à laver, et vous avez un système capable de :

  • Charger des data qui viennent de la mémoire flash
  • Faire des calculs
  • Ecrire les résultats dans une mémoire externe deux fois plus grande que la dernière fois
  • Faire plein de sauvegarde en flash

Il ne lui manque plus qu’un brin de communication, mais je me le garde pour plus tard. Vous devez déjà bien avoir la gerbe après avoir lu tout ça !

Si vous avez manqué le début, il y a presque un an.

Fonctionnement de base d’un système à microprocesseur.

Le microprocesseur

Voilà, il est beau hein, votre nouveau processeur de la marque “Generic 081628″. Il est cadencé à 28 gHz, possède un bus de donné de 8 bit, un bus d’adresse de 16 bit et quelques autres machin que je me réserve pour plus tard. Vous vous dîtes “Reste plus qu’à le plugger sur ma carte mère et …” et non, désolé, on fait de l’embarqué, il n’y a pas de carte mère qui accepte les Generic 081028. Va falloir tout faire à la main, comme des hommes. Un processeur tout seul, ça ne fait pas grand chose. Pour simplifier, ça ne dispose que de registres, d’une unité de calcul arithmétique et logique. Le Generic 081628 possède 4 registres de données 8 bits et 5 registres d’adresse 16 bits. Dans un registre 8 bits on peut mettre une valeur entre 0 et (2^8 - 1) soit 255. Dans un registre d’adresse 16 bits, on peut stocker entre 0 et (2^16 - 1) soit 65535. Voilà, on est bien avancé avec ça. Mais c’est déjà pas mal parce qu’on va pouvoir lui faire faire des choses trop bien (la suite est une adaptation d’assembleur adapté par moi même) :

  • Mettre 38 dans RD0 (registre de donnée numéro 0)
  • Mettre 2 dans RD1 (registre de données numéro 1)
  • Additionner RD0 et RD1 et mettre le résultat dans RD0.

Formidable ! A la fin de la manip, vous avez donc 40 dans RD0 et 2 dans RD1. Nous avons donc vu une des opérations de base du micro. Éventuellement on aura pu faire une soustraction, une multiplication, voir même une division dans vos rêves les plus fou.

Comme vous pouvez le constater, le 081628 ne pourra stocké au maximum qu’une valeur de 8 bit sur ses quatre registres. Soit une mémoire de … 4 octets. Pas terrible hein ? Nous allons donc rajouter un petit machin :

La mémoire externe

Et oui, la fameuse RAM de votre PC ! Notre micro est bien pauvre en espace  mémoire, nous allons donc lui rajouter un boitier mémoire de 1 kilooctet. Oui, c’était les soldes, il était en promo je me suis fais plaiz’. Mais comment le brancher à mon micro? Un boitier mémoire de type Generic M1K possède  10 pin (pattes) d’adresse, 8 pin de données et 2 autres pin dont je vais parler un peu plus tard.

Alors comment ça marche ? Sur le principe c’est plutôt simple : ce boitier peut contenir 1024 valeur 8 bits (1024 octet, depuis le temps vous l’aviez compris). Imaginez simplement un tableau Excel de 1024 case, avec des valeurs comprises entre 0 et 255. On place la valeur logique sur les fils du bus d’adresse l’indice du tableau dans lequel on veut écrire, par exemple 10, et sur le bus de donnée on colle la valeur qu’on veut écrire dans la mémoire, par exemple 82. Les novices perspicaces se demandent déjà : “Mais diantre, comme écrit on 82 sur des fils ?”.

Le binaire, le décimal et l’hexadécimal

Bien vu l’aveugle, et bonne question. L’informatique, c’est de l’électronique à la base. Sur un fil, le plus simple c’est soit d’appliquer une tension (en Volt), soit de rien faire du tout. On a donc 2 états électriques possible (et le concept du binaire apparait…). Le micro de cet article peut appliquer une tension de 0V, ou bien de 5V. Le 0 valant un 0 logique, et le 5V le 1 logique. En transformant 82 en une suite de 0 et de 1 (Conversion en binaire) qui vaut 01010010, on peut appliquer zéro ou 5V sur le bus de donnée du micro. Le bus de donnée est composé de 8 fils, nommés D0 à D7; électriquement nous avons donc :

  • D0 à 0 : 0V
  • D1 à 1 : 5V
  • D2 à 0 : 0V
  • D3 à 0 : 0V
  • D4 à 1 : 5V
  • D5 à 0 : 0V
  • D6 à 1 : 5V
  • D7 à 0 : 0V

Câblage

Nous allons relier les 8 fils du bus de donnée du micro au 8 fils de donnée du boitier mémoire. Le boitier mémoire est capable de faire la différence entre 0 et 5V, il va donc être capable de déchiffrer notre 82. Mais pour en faire quoi ? Suivant le modèle du bus de donné, le micro va placer la valeur 10 sur le bus d’adresse.

Sur le même principe, les 16 fils du bus d’adresse sont nommés A0 à A15 et sont connectés sur le boitier mémoire. Alors comment qu’on fait pour coller 16 fils sur un boitier où il n’y en a que 10 ? Bonne question… ou pas. On va faire simple : brancher les 2 A0 ensemble, les 2 A1, etc jusqu’à A9. Le micro va mettre 5V sur le fil A1 et A3 (10 en binaire donne 1010).

Voilà donc les bonnes informations présentes sur les bus, le boitier mémoire fait donc son taf, et récupère la data 82 pour la coller à l’adresse 10. Vous qui avez l’air égayer et joyeux comme des poulets sous exta, je sens poindre en vous un remarque pertinente : sur le schéma du boitier ya deux fils dont j’ai pas parlé! Oui, j’y viens. Un boitier mémoire, ça sert à stocker, mais si on peut relire c’est encore mieux. Pour ce faire, le boitier mémoire possède une entrée “R/W”. Toujours sous exta, vous devinez facilement que le R, c’est read, et que le /W c’est write. Voilà. C’est tout con. Vous avez un fil dédié sur le micro qui va dire si on écrit vers un périphérique (notre exemple où le micro place la data sur le bus de donnée) ou bien si on lit (c’est alors le boitier mémoire qui placera la data sur le bus, le micro ira lire les niveaux de tension).

Le dernier fil n’est pas CS comme counter strike, mais CS comme Chip Select. Le CS, c’est un peu le doigt du microcontrôleur chef d’orchestre qui désigne le périphérique qui doit parler. Tant que l’entrée CS d’un composant est non active, il n’écoute pas, ne parle pas, il ferme sa gueule ce boitier mémoire de merde. Voilà, notre système ressemble donc à ça :

Voilà, c’est un système qui sait :

  • Prendre des données dans une mémoire externe
  • Faire des calculs
  • Ecrire les résultats dans une mémoire externe.

Nous avons vu que notre boitier mémoire contient 1024 octets et est connecté sur les fils A0 à A9. La zone mémoire adressable va donc de l’adresse 0×0000 à l’adresse 0×03FF (1023 en décimal). Et si maintenant on voulait rajouter 1k de mémoire supplémentaire ? Et bien on le brancherait de la même façon (D0-D7; A0-A9; R/W) sauf pour le CS qui lui devra être différent. En effet on utilisera une deuxième sortie Chip Select du micro pour permettre de parler soit au premier boitier, soit au deuxième, et ainsi ne pas se mélanger les pinceaux.

Je vais m’arrêter la pour le moment, car je sais que le sujet peut mener rapidement à une indigestion. Au programme de la prochaine fois : décodage d’adresse, mapping mémoire et liaison série.