Si tu es en flux tendu sur ta FIFO la manière la plus simple de la vider consiste à la lire en boucle. La bonne séquence à faire c'est :
1) Acquitter les interruptions
2) Lire ta FIFO jusqu'à ce qu'un bit de status t'indique que la FIFO est vide
3) Quitter ton handler d'IT
Comme ton FPGA continue de te streamer des infos pendant ce temps il peut faire bouger ta GPIO d'IT pendant n'importe laquelle de ces étapes après l'acquittement. et ce n'est pas grave ! :)
Si des données arrivent entre 1 et 2 tu va les lire pendant l'étape 2. Une nouvelle interruption matérielle peut-être levée si la FIFO dépasse son seuil de déclenchement d'IT. Cela signifie qu'à la sortie de ton handler d'IT une nouvelle interruption est levée et que tu a vidé la FIFO à l'avance. ça te coûte quelques cycles d'exécution, pas très grave. C'est à mon avis en raison d'une situation de ce type que tu vois deux interruptions.
Si des données arrivent entre 2 et 3 tu va quitter ton handler alors que ta FIFO n'est pas vide. Aucun soucis, ils seront lus la prochaine fois.
Une des questions à se poser c'est en cas de fin de stream : ta FIFO peut contenir des informations utiles mais si elle en contient moins de la moitié le FPGA n'aura pas forcément levé une interruption.
Ce schéma est assez classique aussi tu le retrouvera dans plusieurs drivers. Si tu veux bien cerner ce qui peut se passer je t'invite à faire des diagrammes de séquences pour ton FPGA et ton drivers, voir quelles combinaisons d'événements peuvent se produire et évaluer si dans tous les cas tu ne crée pas une situation d'interblocage.
Cette dernière étape est un peu pénible mais d'expérience il vaut mieux se poser ces questions au moment ou tu écrit le driver. Sinon tu peux laisser passer des bugs invisibles qui transformeront ton système en une jolie petite brique et il sera en général assez pénible de comprendre d'où vient le problème.
[^] # Re: suite irq sauvegarde
Posté par teddyredm3cl . En réponse au message IRQ gpio sauvegarder pendant une disable_irq comment faire pour les reseter avant un enable_irq. Évalué à 2.
Si tu es en flux tendu sur ta FIFO la manière la plus simple de la vider consiste à la lire en boucle. La bonne séquence à faire c'est :
1) Acquitter les interruptions
2) Lire ta FIFO jusqu'à ce qu'un bit de status t'indique que la FIFO est vide
3) Quitter ton handler d'IT
Comme ton FPGA continue de te streamer des infos pendant ce temps il peut faire bouger ta GPIO d'IT pendant n'importe laquelle de ces étapes après l'acquittement. et ce n'est pas grave ! :)
Si des données arrivent entre 1 et 2 tu va les lire pendant l'étape 2. Une nouvelle interruption matérielle peut-être levée si la FIFO dépasse son seuil de déclenchement d'IT. Cela signifie qu'à la sortie de ton handler d'IT une nouvelle interruption est levée et que tu a vidé la FIFO à l'avance. ça te coûte quelques cycles d'exécution, pas très grave. C'est à mon avis en raison d'une situation de ce type que tu vois deux interruptions.
Si des données arrivent entre 2 et 3 tu va quitter ton handler alors que ta FIFO n'est pas vide. Aucun soucis, ils seront lus la prochaine fois.
Une des questions à se poser c'est en cas de fin de stream : ta FIFO peut contenir des informations utiles mais si elle en contient moins de la moitié le FPGA n'aura pas forcément levé une interruption.
Ce schéma est assez classique aussi tu le retrouvera dans plusieurs drivers. Si tu veux bien cerner ce qui peut se passer je t'invite à faire des diagrammes de séquences pour ton FPGA et ton drivers, voir quelles combinaisons d'événements peuvent se produire et évaluer si dans tous les cas tu ne crée pas une situation d'interblocage.
Cette dernière étape est un peu pénible mais d'expérience il vaut mieux se poser ces questions au moment ou tu écrit le driver. Sinon tu peux laisser passer des bugs invisibles qui transformeront ton système en une jolie petite brique et il sera en général assez pénible de comprendre d'où vient le problème.