En quelle année - comptez, dans quel pays - devinez, posez des questions. Combien plus rapide est ARM que AVR? Quel protocole Modbus est "plus rapide"? ASCII ou RTU?
Par «vitesse», dans ce cas, nous entendons le nombre de cycles machine processeur nécessaires pour exécuter toutes les actions du protocole.
L'étude de performance sera réalisée sur la bibliothèque ModBus Slave RTU / ASCII , largement connue dans les cercles étroits , portée sur les microcontrôleurs ATMega48 et STM32L052. Nous fournirons des informations via le protocole Modbus à l'émulateur de panneau Weintek. Les tests seront effectués sur un exemple de démonstration . En plus des résultats des tests, le panneau affiche les états des registres Modbus: entrées TOR, sorties TOR, registres de lecture et registres de lecture / écriture. Le panneau calcule également le nombre d'erreurs dans l'échange de données avec le microcontrôleur. La fenêtre de test est représentée sur la figure.
Nous évaluerons les performances en mesurant le temps d'exécution de la fonction de traitement des messages de protocole. Nous mesurerons le temps d'exécution en utilisant la méthode ouvrier-paysan. Avant de démarrer la fonction, nous réinitialisons la minuterie matérielle, dont la fréquence de comptage est égale à la fréquence d'horloge du microcontrôleur, après avoir exécuté la fonction, nous lisons les valeurs de la minuterie et traitons les résultats de mesure. Nous calculons la valeur minimale, maximale et moyenne du temps d'exécution de la fonction de traitement des messages du protocole Modbus.
while(1)
{
TIM6->CNT=0;
ModBusRTU();
//ModBusASCII();
tcurent=TIM6->CNT;
if(tcurent<tmin)tmin=tcurent;
if(tcurent>tmax)tmax=tcurent;
avg32=avg32-(avg32>>16)+tcurent;
tavg=avg32>>alfa;
...
Les résultats de la recherche sont résumés dans le tableau. La recherche a été menée avec différentes options de bibliothèque:
- ModBusUseTableCRC - Utiliser le calcul CRC de table;
- ModBusUseErrMes - Utilisez des messages sur les erreurs de protocole logique;
Et aussi avec différentes stratégies d'optimisation du compilateur.
La bibliothèque RTU / ASCII de l'esclave ModBus prend en charge, dans certains cas, une fonction importante - une pause entre la réception d'une requête du maître Modbus et la réponse de l'esclave Modbus. La recherche a été réalisée avec des valeurs de pause de 2 millisecondes et 0 (c'est-à-dire sans pause), ces valeurs sont indiquées dans la colonne du tableau "Pause P / P". La colonne "Taille" indique la taille du module, qui comprend les deux fonctions de traitement des messages Modbus (ModBusRTU (), ModBusASCII ()).
De l'avis de l'auteur, il est le plus opportun d'évaluer les performances par le pire des cas, c'est-à-dire par le temps d'exécution maximum de la fonction.
Après avoir longuement réfléchi aux résultats de la recherche, les conclusions suivantes peuvent être tirées:
- AVR n'est pas si lent !!! En moyenne, il est une fois et demie plus lent que ARM à la même vitesse d'horloge. Et dans le cas de l'optimisation en taille (par exemple, les variantes 13 et 15), on se rapproche pratiquement de l'ARM.
- Le protocole ASCII, en comparaison avec RTU, est non seulement plus lent en vitesse de transmission, mais prend également beaucoup plus de ressources de microcontrôleur.
- L'utilisation de messages sur les erreurs de protocole logique n'affecte en aucune façon les performances.
- La méthode tabulaire de calcul du CRC permet plus d'une fois et demie de réduire l'utilisation des ressources de calcul du microcontrôleur.
- Utiliser une pause entre la réception d'une requête et la transmission d'une réponse permet non seulement d'éviter les conflits sur le bus RS-485, mais aussi de réduire la fonction de blocage du traitement des messages du protocole Modbus.
Quelles autres conclusions peut-on tirer?