1

Le présent tuto a été écrit à l'origine pour GT turbo, mais il est valable pour tous les réseaux à médium unique


la communication se fait en RS485 c'est la version "industrielle" (en différentiel) du RS232 qui de surcroit autorise le multipoint(c'est méga caricatural mais c pour que ce soit clair pour la suite). cependant, ça ne te fourni que la couche bas niveau. ensuite c'est à toi d'implémenter la couche de transfert de paquets et le protocole. Le plus simple ( à mon sens ) c'est de fonctionner soit par mâitre esclave soit par jeton. Personnellement je te conseille le jeton, il évite d'avoir un code spécifique maitre (qui sera plus gourmand ralentira la console et surchagera le réseau). Comment le faire, c'est simple, chaque console a un numéro d'ordre (ordre d'arrivée sur le réseau par exemple) (penses d'ailleurs à mettre une mini tempo de durée aléatoire avant l'entrée sur le réseau. une fois tout le monde connecté la première créée un jeton et le transmet sur le réseau (oui, contrairement au RS232, c'est "half duplex" un quand on cause on écoute pas vu qu'on utilise le même médium pour ça) tout le monde le lit mais seulement le numéro deux le traite... il passe à son voisin et ainsi de suite...

en résumé

1 allumage des consoles
2 arrivée sur le réseau de la première. lancement d'un compteur. mise en écoute
3.1 arrivée sur le réseau de la seconde, elle tente de prendre la parole et de demander à [1[0][/0]] son numéro d'identifiant. mise en écouté
3.2 arrivée de la 3ème elle tente de prendre la parole et de demander à [1[0][/0]] son numéro d'identifiant. [2] sait alors que le cercle s'est aggrandi, son suivant est désormais [3] et pas [1[0][/0]]. mise en écoute
3.3 arrivée de la 4ème elle tente de prendre la parole et de demander à [1[0][/0]] son numéro d'identifiant. [3] sait alors que le cercle s'est aggrandi, son suivant est désormais [4] et pas [1[0][/0]]. mise en écoute
3.4 arrivée de la 5ème elle tente de prendre la parole et de demander à [1[0][/0]] son numéro d'identifiant. [4] sait alors que le cercle s'est aggrandi, son suivant est désormais [5] et pas [1[0][/0]]. mise en écoute
...
3.X arrivée de la Nème elle tente de prendre la parole et de demander à [1[0][/0]] son numéro d'identifiant. [N-1] sait alors que le cercle s'est aggrandi, son suivant est désormais [N] et pas [1[0][/0]]. mise en écoute
4 pas d'autre arrivée, timeout dépassé sur [1[0][/0]]. [1[0][/0]] déclare à tout le monde que les inscriptions sont finies
5 lancement (synchronisé par 4) du jeu, [1[0][/0]] a le jeton, le transmet à [2] qui l'envoie à [3]... on sait le nombre de console en ligne, on sait le temps max pour traiter l'info si tempsmax*(nb_consoles+1) est dépassé, alors la connexion est en erreur... là soit tu mets un retry, soit tu réinit, soit tu interromps...
...
6 nécessité d'une communication de 4 à 7... 4 remplit le jeton et il tourne jusqu'à 7

le format d'un jeton peut être

[position] (numéro de la prochaine console sur le ring)
[nombre de consoles] (donnée qui doit rester fixe, mais qui peut être modifiée si un contrôle d'erreur redistribue les rang suite au départ d'une console)
[age] (+1 à chaque mouvement) un flush d'un jeton de age=XXX peut être envisagé
[N]nombre de segments "data"
[data](n) data (voir après)
[checksum]somme de contrôle si erronnée, on oublie et on demande à [1[0][/0]] de recréer un jeton
[fin de jeton](optionnel mais ça fait plus propre)

[data] doit avoir une taille fixe et peut se composer ainsi : [envoyeur|destinataire|rang de ce morceau|morceau|chksum]

ainsi quand c'est au tour d'une console, elle lit le jeton, regarde si elle est en destinataire de paquets, reconstitue les données avec les morceaux en les mettant en ordre avec les rangs, effectue les conrôles de routine, reconstitue le jeton sans les paquets qui lui étaient destinés et en ajoutant ce qu'elle a en buffer pour les autres et envoi du nouveau paquet avec ++ de l'age et de la position (modulo le nombre de consoles)

en cas d'erreur réseau, tu fais un envoi de jeton (quand c'est ton tour) à la console [0] qui peut servir de catchall...

l'avantage de ce système : tu ne peux pas avoir de collisions, vu que pour causer il faut le jeton, et qu'il n'y en a qu'un, le réseau n'est pas surchargé
inconvénient : la vitesse du réseau est inversement proportionnelle au nombre de ses membres

en prenant un maitre esclave (pour comparaison)
avantage : gestion centralisée
inconvénients : gestion centralisée gourmante en cpu sur une machine, transaction en étoile donc tous les trajets doublés. réseau saturé plus rapidement.

en caricatural
pour avoir en même temps 1a>b 2b>c 3b>e 4d>c 5e>a
avec jeton ça va donner 
a b c d e f g a b c (pour ceux qui causent)
  1 2   3     5   4
et en maitre esclave
a b a c a d a e a f a g a b a c
 1   2       3 5             4 



[EDIT(ajout)] Il est possible d'imaginer une solution hybride où chacun des points du réseau est maitre, et ce en ring. je m'explique a est maitre et dit ce qu'il a dire TOUT LE MONDE ecoute, quand a a fini de causer, b cause, tout le monde écoute...
avantage : amoindrit la charge du réseau, accélère les transferts
inconvénient : nécessite qu'électriquement parlant plusieurs points peuvent lire en même temps (ce qui n'est pas forcément garanti au niveau du courrant sur le câble)
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

2

Le présent tuto a été écrit à l'origine pour GT turbo, mais il est valable pour tous les réseaux à médium unique


la communication se fait en RS485 c'est la version "industrielle" (en différentiel) du RS232 qui de surcroit autorise le multipoint(c'est méga caricatural mais c pour que ce soit clair pour la suite). cependant, ça ne te fourni que la couche bas niveau. ensuite c'est à toi d'implémenter la couche de transfert de paquets et le protocole. Le plus simple ( à mon sens ) c'est de fonctionner soit par mâitre esclave soit par jeton. Personnellement je te conseille le jeton, il évite d'avoir un code spécifique maitre (qui sera plus gourmand ralentira la console et surchagera le réseau). Comment le faire, c'est simple, chaque console a un numéro d'ordre (ordre d'arrivée sur le réseau par exemple) (penses d'ailleurs à mettre une mini tempo de durée aléatoire avant l'entrée sur le réseau. une fois tout le monde connecté la première créée un jeton et le transmet sur le réseau (oui, contrairement au RS232, c'est "half duplex" un quand on cause on écoute pas vu qu'on utilise le même médium pour ça) tout le monde le lit mais seulement le numéro deux le traite... il passe à son voisin et ainsi de suite...

en résumé

1 allumage des consoles
2 arrivée sur le réseau de la première. lancement d'un compteur. mise en écoute
3.1 arrivée sur le réseau de la seconde, elle tente de prendre la parole et de demander à [1[0][/0]] son numéro d'identifiant. mise en écouté
3.2 arrivée de la 3ème elle tente de prendre la parole et de demander à [1[0][/0]] son numéro d'identifiant. [2] sait alors que le cercle s'est aggrandi, son suivant est désormais [3] et pas [1[0][/0]]. mise en écoute
3.3 arrivée de la 4ème elle tente de prendre la parole et de demander à [1[0][/0]] son numéro d'identifiant. [3] sait alors que le cercle s'est aggrandi, son suivant est désormais [4] et pas [1[0][/0]]. mise en écoute
3.4 arrivée de la 5ème elle tente de prendre la parole et de demander à [1[0][/0]] son numéro d'identifiant. [4] sait alors que le cercle s'est aggrandi, son suivant est désormais [5] et pas [1[0][/0]]. mise en écoute
...
3.X arrivée de la Nème elle tente de prendre la parole et de demander à [1[0][/0]] son numéro d'identifiant. [N-1] sait alors que le cercle s'est aggrandi, son suivant est désormais [N] et pas [1[0][/0]]. mise en écoute
4 pas d'autre arrivée, timeout dépassé sur [1[0][/0]]. [1[0][/0]] déclare à tout le monde que les inscriptions sont finies
5 lancement (synchronisé par 4) du jeu, [1[0][/0]] a le jeton, le transmet à [2] qui l'envoie à [3]... on sait le nombre de console en ligne, on sait le temps max pour traiter l'info si tempsmax*(nb_consoles+1) est dépassé, alors la connexion est en erreur... là soit tu mets un retry, soit tu réinit, soit tu interromps...
...
6 nécessité d'une communication de 4 à 7... 4 remplit le jeton et il tourne jusqu'à 7

le format d'un jeton peut être

[position] (numéro de la prochaine console sur le ring)
[nombre de consoles] (donnée qui doit rester fixe, mais qui peut être modifiée si un contrôle d'erreur redistribue les rang suite au départ d'une console)
[age] (+1 à chaque mouvement) un flush d'un jeton de age=XXX peut être envisagé
[N]nombre de segments "data"
[data](n) data (voir après)
[checksum]somme de contrôle si erronnée, on oublie et on demande à [1[0][/0]] de recréer un jeton
[fin de jeton](optionnel mais ça fait plus propre)

[data] doit avoir une taille fixe et peut se composer ainsi : [envoyeur|destinataire|rang de ce morceau|morceau|chksum]

ainsi quand c'est au tour d'une console, elle lit le jeton, regarde si elle est en destinataire de paquets, reconstitue les données avec les morceaux en les mettant en ordre avec les rangs, effectue les conrôles de routine, reconstitue le jeton sans les paquets qui lui étaient destinés et en ajoutant ce qu'elle a en buffer pour les autres et envoi du nouveau paquet avec ++ de l'age et de la position (modulo le nombre de consoles)

en cas d'erreur réseau, tu fais un envoi de jeton (quand c'est ton tour) à la console [0] qui peut servir de catchall...

l'avantage de ce système : tu ne peux pas avoir de collisions, vu que pour causer il faut le jeton, et qu'il n'y en a qu'un, le réseau n'est pas surchargé
inconvénient : la vitesse du réseau est inversement proportionnelle au nombre de ses membres

en prenant un maitre esclave (pour comparaison)
avantage : gestion centralisée
inconvénients : gestion centralisée gourmante en cpu sur une machine, transaction en étoile donc tous les trajets doublés. réseau saturé plus rapidement.

en caricatural
pour avoir en même temps 1a>b 2b>c 3b>e 4d>c 5e>a
avec jeton ça va donner 
a b c d e f g a b c (pour ceux qui causent)
  1 2   3     5   4
et en maitre esclave
a b a c a d a e a f a g a b a c
 1   2       3 5             4 



[EDIT(ajout)] Il est possible d'imaginer une solution hybride où chacun des points du réseau est maitre, et ce en ring. je m'explique a est maitre et dit ce qu'il a dire TOUT LE MONDE ecoute, quand a a fini de causer, b cause, tout le monde écoute...
avantage : amoindrit la charge du réseau, accélère les transferts
inconvénient : nécessite qu'électriquement parlant plusieurs points peuvent lire en même temps (ce qui n'est pas forcément garanti au niveau du courrant sur le câble)
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

3

Il est donc possible de faire du calcul parallèle sur un cluster de Lynx ?

Tuto très intéressant, merci Vince top
Gare à celui qui touche a mes chips quand je code !