Wer lebt gut in einem Mikrocontroller?



In welchem ​​Jahr - zählen, in welchem ​​Land - raten, stellte Fragen. Wie viel schneller ist ARM als AVR? Welches Modbus-Protokoll ist "schneller"? ASCII oder RTU?



Mit "Geschwindigkeit" meinen wir in diesem Fall die Anzahl der Prozessor-Maschinenzyklen, die erforderlich sind, um alle Aktionen des Protokolls auszuführen.

Die Leistungsstudie wird an der in engen Kreisen weithin bekannten ModBus Slave RTU / ASCII- Bibliothek durchgeführt, die auf die Mikrocontroller ATMega48 und STM32L052 portiert ist. Wir werden Informationen über das Modbus-Protokoll an den Weintek-Panel-Emulator ausgeben. Die Tests werden an einem Demo-Beispiel durchgeführt . Zusätzlich zu den Testergebnissen zeigt das Bedienfeld die Zustände der Modbus-Register an: diskrete Eingänge, diskrete Ausgänge, Register zum Lesen und Register zum Lesen / Schreiben. Das Panel berechnet auch die Anzahl der Fehler beim Datenaustausch mit dem Mikrocontroller. Das Testfenster ist in der Abbildung dargestellt.







Wir werden die Leistung bewerten, indem wir die Ausführungszeit der Protokollnachrichtenverarbeitungsfunktion messen. Wir werden die Ausführungszeit mit der Arbeiter-Bauern-Methode messen. Vor dem Start der Funktion setzen wir den Hardware-Timer zurück, dessen Zählfrequenz gleich der Taktfrequenz des Mikrocontrollers ist. Nach Ausführung der Funktion lesen wir die Timer-Werte und verarbeiten die Messergebnisse. Wir berechnen den minimalen, maximalen und durchschnittlichen Wert der Ausführungszeit der Funktion zur Verarbeitung von Nachrichten des Modbus-Protokolls.



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;
    ...

      
      





Die Forschungsergebnisse sind in der Tabelle zusammengefasst. Die Recherche wurde mit verschiedenen Bibliotheksoptionen durchgeführt:



  • ModBusUseTableCRC - Verwenden Sie die Tabellen-CRC-Berechnung.
  • ModBusUseErrMes - Verwenden Sie Meldungen zu logischen Protokollfehlern.


Und auch mit verschiedenen Compiler-Optimierungsstrategien.

Die ModBus Slave RTU / ASCII-Bibliothek unterstützt in einigen Fällen eine wichtige Funktion - eine Pause zwischen dem Empfang einer Anforderung vom Modbus Master und der Antwort des Modbus Slave. Die Untersuchung wurde mit Pausenwerten von 2 Millisekunden und 0 (dh ohne Pause) durchgeführt. Diese Werte sind in der Spalte der Tabelle "Pause P / P" angegeben. Die Spalte "Größe" gibt die Größe des Moduls an, das beide Funktionen zur Verarbeitung von Modbus-Nachrichten enthält (ModBusRTU (), ModBusASCII ()).







Nach Meinung des Autors ist es am zweckmäßigsten, die Leistung nach dem schlimmsten Fall zu bewerten, dh nach der maximalen Ausführungszeit der Funktion.



Nach gründlichen Überlegungen zu den Forschungsergebnissen können folgende Schlussfolgerungen gezogen werden:



  1. AVR ist nicht so langsam !!! Im Durchschnitt ist es bei gleicher Taktrate eineinhalb Mal langsamer als ARM. Und bei der Größenoptimierung (z. B. Varianten 13 und 15) nähert es sich praktisch ARM.
  2. Das ASCII-Protokoll ist im Vergleich zur RTU nicht nur langsamer in der Übertragungsgeschwindigkeit, sondern beansprucht auch viel mehr Mikrocontroller-Ressourcen.
  3. Die Verwendung von Meldungen zu logischen Fehlern des Protokolls beeinträchtigt die Leistung in keiner Weise.
  4. Mit der tabellarischen Methode zur Berechnung des CRC können Sie den Rechenaufwand des Mikrocontrollers um mehr als das Eineinhalbfache reduzieren.
  5. Die Verwendung einer Pause zwischen dem Empfangen einer Anforderung und dem Senden einer Antwort ermöglicht nicht nur, Konflikte auf dem RS-485-Bus zu vermeiden, sondern auch die Blockierungsfunktion der Verarbeitung von Nachrichten des Modbus-Protokolls zu verringern.


Welche anderen Schlussfolgerungen können gezogen werden?



Projekt auf GitHub



In einer Datei herunterladen




All Articles