Interruption de fonction bloquante
Bonjour,
Je programme actuellement sur une carte de développement implémentant une partie du protocole 802.15.4 (couches basses du ZigBee) pour un projet avec mon école. Or je me suis rendu compte que la carte fournie n'implémentait pas de couche MAC, c'est pourquoi j'ai commencé à en développer une toute simple. Le détail de la MAC n'est pas important en fait, c'était juste pour situer le contexte.
Voilà le topo :
- Je lance un thread en récéption qui effectue la boucle suivante :
Code:
1 2 3 4
| while(1) {
Recevoir données (fonction bloquante)
Traiter données
} |
- Je lance un thread en émission qui lui boucle sur :
Code:
1 2 3 4
| while(1) {
Attendre données à envoyer (bloquante)
Envoyer les données
} |
Le premier problème qui s'est posé est l'accès concurrent au medium de communication (c'est du sans fil, pas de duplex), il a donc fallu rajouter un mutex pour réserver le droit d'émettre ou de recevoir. Le code ressemble donc à ça :
Code:
1 2 3 4 5 6
| while(1) {
Verrouiller mutex
Recevoir données (fonction bloquante)
Deverrouiller mutex
Traiter données
} |
Code:
1 2 3 4 5 6
| while(1) {
Attendre données à envoyer (bloquante)
Verrouiller mutex
Envoyer les données
Deverrouiller mutex
} |
Le problème que j'ai maintenant, c'est le fait que la fonction de réception est bloquante, et qu'il me faudrait un moyen pour que l'émetteur prenne le pas sur le récepteur (signal, interruption) et le force à libérer le medium (sauf si il est en train de recevoir des données) dans le cas où il veut émettre. J'ai déjà préparé un peu le terrain en donnant au thread émetteur une référence vers le thread récepteur (pointeur vers le thread).
Je ne m'y connais pas spécialement en C et j'aimerais avoir un avis pour m'éclairer... A moins que quelqu'un ait une idée complètement différente sur le sujet !
Note : Je travaille sur une carte de développement, qui utilise Mantis OS, je ne dispose PAS de toutes les fonctions standardes du C... mais proposez tout de même !