alors je récappétes pour voir si j'ai compris:
1) ton capteur acquisitionne en interne à 40Khz (25µs) ?
2) tu veux mesurer tout les 10Hz (dumoins dixième/s) ?
ton débit d'objets physique à trier est de 10 objets/s ?
heu si je comprends bien, si tu comptes 10 fois par secondes, entre chaque comptage c'est 4000 acqusition qui est fait par le capteur ?
j'ai bon ou je suis trop fatigué ?
dans tous les cas, ton thread semble choper en boucle les mesures depuis le port d'e/s, et tu fais un modulo (je crois t'avoir compris) à un endroit pour dire: yeah là j'ai un truc qui est passé devant le capteur et je dois le compter.
alors effectivement ça poses plusieurs problèmes:
un thread qui tourne en boucle sans fin à capturer, forcément ça bouffe tout le temps cpu, et en plus lorsque le noyau donne la main à un autre thread pendant un ou plusieurs timeslices, tu loupes des acquisitions matérielles qui pourront comporter des passages d'objets.
donc en gros quand ton thread tourne, tu peux rien faire d'autre (détection d'image non effectuée), et quand il tourne pas tu va louper des objets physiques à trier.
le problème viens du modèle de "communication" avec le capteur optique: pris comme ça il est tout simplement pourri, et inexploitable.
alors la seule solution vue l'implémentation de la communication avec le capteur serait de:
1) que le thread compteur chope les aquisitions que tous les 10 hz (100ms) comme ça les autres thread pourront bosser
2) comme le compteur ne se fera tous les 10hz, si il n'est pas calé, il va louper TOUS les objets passant devant le capteur.
il faut donc créer un système de "synchronisation".
pour cela, il faudrait pouvoir se caler avec le passage des objets, et dans le cas de ton implémentation matérielle de communication, la seule solution serait de boucler sans fin dans le thread compteur pour choper le premier passage d'objet, et ainsi se caler ainsi pour toutes les passages suivants.
donc en gros:
a) tous threads coupés
b) activation thread compteur en mode "calage" (temps cpu maximal)
c) une fois thread compteur "calé", tous les autres thread sont activés, et le thread compteur est mis en mode "mesure" où le thread sera, après chaque capture, mis en sommeil pour 100 ms.
l'ordonnanceur du noyau rendra alors la main aux autres threads pour bosser.
NOTE: évidemment il faudra faire une implémentation subtile, car le moment où le thread compteur sera rendu actif par le noyau toutes les 100ms peut très légèrement varier, le thread peut faire l'acquisition un peu trop avant ou après (et louper le passage), donc par exemple acquérir en boucle jusqu'a 5-10ms toutes les 95ms (ce qui permet de se recaller en cas de glissement d'horloge )
-------------------------
donc voilà c'est la seule solution que j'entrevoies avec le mode d'aquisition de ton capteur optique, pour que le thread compteur ne rate pas d'objets et qu'il ne prenne pas tout le temps cpu pour rien.
--------------------------
après si tu peux améliorer ou faire améliorer la manière de capturer ce qui viens du capteur:
avoir une logique qui teste pour toi ce qui passe devant le capteur et qui déclenche une interruption matérielle lors du passage d'objet. (interruption qui débloque le thread compteur par exemple)
ceci en faisant une lecture blocante dans le thread compteur sur un périphérique qui recevra un octet ou une donnée au moment du pasage d'un objet. (port série/parallèle ? ou carrément carte ISA ou PCI avec un asic maison sport ?)
------------------------------
voilà pour le moment c'est la seule contribution que je peux apporter.
désolé si je suis hors-sujet ou que j'ai dit des conneries
Message édité par bjone le 24-07-2003 à 03:43:14