J'ai une conversion ADC périodique (toutes les 50 micro-secondes) et j'utilise le résultat pour faire d'autres calculs et mettre à jour les registres de charge PWM. L'ADC est déclenché par le compteur ascendant du PWM matériel et doit être effectué exactement à ce moment-là. J'utilise un Teensy 3.2 (ARM M4) et bien que ce soit une bête, je dois être aussi rapide que possible avec l'ADC pour pouvoir saisir le reste des calculs avant le début du prochain cycle de service.
L'idée générale d'opérer plus rapidement semble être d'utiliser DMA qui transfère les résultats de conversion directement dans la mémoire système sans impliquer le processeur, ce qui ressemble à
ADC_result -> DMA -> SRAM,
Mais après cela, je dois récupérer le résultat de la SRAM pour le traiter, ce qui ressemble à:
ADC_result -> DMA -> SRAM -> CPU -> enfin traité.
Bien sûr, ne pas impliquer le DMA est beaucoup plus lent:
ADC_result -> CPU -> SRAM -> CPU -> enfin traité.
Ma question est, puisque je dois mettre le résultat de la conversion dans le processeur pour être traité de toute façon, ne puis-je pas simplement le stocker directement dans les registres du processeur sans impliquer du tout DMA ou SRAM et le processus est immédiat?
ADC_result -> CPU -> enfin traité.
Je voudrais faire quelques remarques pour clarifier davantage la nature de mon problème et tester les éventuelles lacunes dans ma compréhension.
Premièrement, d'après ce que j'ai compris, le DMA est principalement utilisé lorsqu'il y a une véritable journalisation à faire et que nous utiliserions le processeur en parallèle, surtout si les données fournissant le périphérique sont considérablement plus rapides / plus lentes que le processeur. Ce n'est pas mon cas, car tous les calculs suivants dépendent du résultat de la conversion ADC et j'ai très peu de données envoyées toutes les 50 micro-secondes plutôt que d'énormes morceaux.
Deuxièmement, il n'y a aucune garantie que je pourrai utiliser librement les registres du processeur, car ils sont soumis à l'optimisation du compilateur et pourraient être totalement ignorés (en utilisant le mot-clé register en C).
Je serais ravi d'entendre vos commentaires à ce sujet, surtout si ma compréhension est quelque peu imparfaite ou tout simplement fausse.