Sprechen Sie über die zyklische Redundanzprüfungstechnologie, die üblicherweise in eingebetteten Systemen verwendet wird!

In eingebetteten Produktanwendungen ist es häufig erforderlich, die Integrität von Systemdaten während der Speicherung oder Übertragung zu berücksichtigen.

Die sogenannte Integrität bezieht sich auf die Genauigkeit und Konsistenz von Daten in ihrem Lebenszyklus. Diese Daten können im EEPROM / FLASH gespeichert oder basierend auf Kommunikationsprotokollen übertragen werden. Sie können aufgrund externer Störungen, Programmfehlern oder sogar Systemeinbrüchen zerstört werden. Wenn diese Daten vor der Verwendung nicht überprüft werden, ist die Produktfunktion möglicherweise ungültig. In bestimmten Bereichen kann dies in schweren Fällen das Eigentum des Benutzers und sogar die Lebenssicherheit gefährden.

In diesem Artikel werden die am weitesten verbreitete zyklische Redundanzprüfungstechnologie sowie einige spezifische Erfahrungen mit STM32 behandelt.

Die sogenannte zyklische Redundanzprüfung (CRC: Cyclic Redundancy Check) ist ein Fehlererkennungsalgorithmus, der üblicherweise in Kommunikationsprotokollen oder Speichergeräten verwendet wird, um unerwartete Änderungen der Originaldaten zu erkennen. Es kann einfach so verstanden werden, dass die nützlichen Daten nach einem bestimmten Algorithmus berechnet, ein Merkmalswert extrahiert und an die nützlichen Daten angehängt werden. In der Anwendung werden die nützlichen Daten gemäß einem bestimmten Algorithmus extrahiert, um den Merkmalswert mit dem vorgespeicherten Merkmalswert zu vergleichen. Wenn er gleich ist, besteht die Überprüfung, andernfalls schlägt die Überprüfung fehl, um festzustellen, ob die Daten abnormal sind.

Warum Datenintegrität überprüfen (Datenintegrität)?

Daten können sich während der Speicherung und Übertragung ändern. Am Beispiel von Anwendungsszenarien für die Datenkommunikation gibt es ungefähr zwei Fehlermodi für häufige Fehler:

  • Einzelbitfehler : Nur ein Datenbit weist einen Fehler auf, wie in der Abbildung gezeigt:

  • Burst-Fehler: Zwei oder mehr Datenbits weisen Fehler im Codestream auf, wie in der Abbildung gezeigt:

Warum können diese Bitfehler auftreten? Bei der Kommunikation mit elektronischen Systemen handelt es sich um die physikalische Schicht, die Verbindungsschicht, das Kommunikationsmedium usw. Die physikalische Schicht moduliert hauptsächlich die ursprünglichen Binärdaten unter Verwendung eines bestimmten Codec-Prinzips und überträgt dann das modulierte Signal über die Sendeschaltung an das Übertragungsmedium. Das empfangende Ende verwendet die Empfangsschaltung, um die Informationen zu empfangen, zu demodulieren und in einem Binärcodestream wiederherzustellen. Bei diesem Prozess kann das Medium gestört werden, und die Empfangsschaltung, die Sendeschaltung, die Modulationsschaltung und die Demodulationsschaltung können aufgrund einiger Interferenzgründe arbeitslos sein und Bitfehler verursachen. Wenn zu diesem Zeitpunkt kein guter Mechanismus vorhanden ist, um die Richtigkeit der Daten sicherzustellen, wie z. B. bestimmte Steuerbefehle in einem Flugsteuerungssystem, CAN-Nachrichtendaten im Fahrzeugsystem, verwendet das System diese Fehlerdaten direkt, um das gesteuerte Objekt (wie den Motor) zu steuern , Motoren usw.) führt in schweren Fällen zu unermesslichen Lebens- und Sachkatastrophen.

Gleiches gilt für Daten im Speichersystem. Im Allgemeinen werden beim Einschalten des Systems die Systemparameter, z. B. einige Kalibrierungsdaten, vom physischen Speichermedium geladen. Wenn einige Teile des Mediums beschädigt sind oder Softwarefehler dazu führen, dass die Daten ohne Prüfung der Datenintegrität falsch behandelt werden, werden diese Daten direkt auf die Systemsteuerung angewendet, was ebenfalls Sicherheitsrisiken verursacht.

Daher ist die Bedeutung von Datenintegritätstests offensichtlich. Es gibt viele gängige Datenintegritätsalgorithmen, wie z. B. einfache XOR-Prüfung, zyklische CRC-Redundanzprüfung, FEC-Vorwärtsfehlerkorrekturalgorithmus usw. Die zyklische Redundanzprüfung wird häufig in eingebetteten Systemen verwendet und wird häufig bei der Formulierung von Kommunikationsprotokollen, der Datenspeicherung sowie bei Komprimierungs- und Dekomprimierungsalgorithmen verwendet.

Die zyklische Redundanzprüfung verwendet die binäre Division als Algorithmusprinzip und verfügt über einen leistungsstarken Fehlererkennungsmechanismus. Dies kann realisiert werden, indem eine kleine Menge einer Hardwarelogikschaltung für die binäre Division verwendet wird. Für die Implementierung des Softwarecodes gibt es zwei Ideen und Strategien: Nachschlagetabellenmethode und Schichtberechnung. Die Suchmethode verwendet Raum für Zeit und die Schichtberechnungsmethode verwendet Zeit für Raum.

Was ist eine zyklische Redundanzprüfung?

Das mathematische Kernalgorithmusprinzip der zyklischen Redundanzprüfung basiert auf dem zyklischen Code, der die Informationen auf der Grundlage erweitert, dass die Informationen der Originaldaten nicht erhöht werden, und seine redundanten Eigenschaften bei sehr geringen Speicherkosten speichert. Der Algorithmus wurde 1961 von W. Wesley Peterson erfunden.

  • Die n-Bit-Binärdaten sind hier die effektive Informationslast. (Kann nützliche Informationen übertragen oder gespeichert werden)

  • Der m-Bit-Redundanzcode wird gemäß dem CRC-Algorithmus berechnet, dh der charakteristische Redundanzcode wird aus den zuvor gültigen Daten gemäß dem CRC-Prüfpolynom und dem CRC-Algorithmus extrahiert. Dies ist die wahre Bedeutung der Redundanz.

  • Was tatsächlich übertragen oder gespeichert wird, sind n + m-Bit-Binärdaten.

Hier ist ein Konzept: Polynom. Im CRC-Prüfalgorithmus kann das Polynom wie folgt verstanden und ausgedrückt werden:

Seine Essenz ist die mathematische Darstellung von Multi-Base, hier ist binär, also ist X 2.

Der grundlegende Algorithmusverarbeitungsprozess ist wie folgt:

Unter der Annahme, dass die zu sendenden gültigen Daten ein binäres Polynom M (x) sind und das Prüfpolynom P (x) vom Sender und Empfänger vereinbart wird und beide Parteien es wissen, sind hier die Bedeutungen mehrerer Polynome und verwandter Verarbeitungsverfahren:

Der Empfänger führt nach dem Empfang der Daten eine CRC-Prüfung durch. Der Rest ist 0 und die Prüfung wird bestanden.

Tatsächlich ist die Essenz von CRC der Berechnungsprozess der binären Polynomteilung, um redundante Codes zu erhalten. Die Essenz ist dieselbe, unabhängig von der Software-Suchmethode, der Verschiebungsberechnungsmethode oder der Implementierung einer reinen Hardwarelogikschaltung. Es ist vorteilhafter, die Verschiebungsberechnung für digitale Logikschaltungen zu verwenden, da fast keine CPU-Zeit benötigt wird.

Gemeinsames CRC-Check-Polynom

Was sind die gängigen CRC-Prüfpolynomoperatoren?

Was sind neben der Komplexität verschiedener Prüfpolynome die Unterschiede aus Sicht der Anwendung? Aus Anwendungssicht spiegelt sich dies hauptsächlich in der Fehlerdiagnoserate wider. Sehen Sie sich den Fehlererkennungseffekt von CRC-16 und CRC-CCITT an:

  • Kann Einzelbit- und Doppelbitfehler vollständig erkennen

  • Fehler mit ungeraden Bits

  • Kann 16-Bit-Länge und Burst-Fehler unter 16 erkennen

  • Kann Fehler mit einer Länge von 17 Bit oder mehr mit einer Wahrscheinlichkeit von 99,997% erkennen

Die Auswahl verschiedener Prüfpolynomoperatoren hat unterschiedliche Erfolgsraten bei der Bitfehlerdiagnose, und natürlich ist auch der Berechnungsaufwand unterschiedlich. Lassen Sie uns den maßgeblichen IEC-Standard überprüfen. Die folgende Abbildung stammt aus "IEC61508-7".

Aus dem Obigen ist ersichtlich, dass CRC-8 eine Bitfehlerwahrscheinlichkeit von 99,6% diagnostizieren kann, während CRC-16 die Bitfehlerwahrscheinlichkeit auf 99,998% erhöhen kann.

Hinweis: IEC61508 ist der Funktionssicherheitsstandard der International Electrotechnical Commission (Funktionssicherheit elektrischer / elektronischer / programmierbarer elektroniksicherer Systeme).

Seit der Entwicklung der Technologie wurde in verschiedenen Branchen eine große Anzahl verschiedener Check-Polynom-Generatoren verwendet. Unten ist ein Screenshot von Wikipedia als Referenz:

STM32 CRC-Hardware-Peripheriegeräte

Wie in der folgenden Abbildung gezeigt, verfügt STM32 über eine integrierte CRC-32-Hardwareberechnungseinheit, die ein festes Polynom 0x4C11DB7 (hexadezimale Darstellung) realisiert, das zur Berechnung des Ethernet-Paketprüfcodes verwendet werden kann.

Alle STM32-Produkte verfügen über CRC-Peripheriegeräte, die Hardware-Unterstützung für CRC-Berechnungen bieten und Speicherplatz für Anwendungscode sparen. Der CRC-Prüfwert kann verwendet werden, um die Richtigkeit der übertragenen Daten zu überprüfen und um die Integrität der Daten während der Speicherung zu überprüfen. In IEC60335 wird auch akzeptiert, die Integrität von FLASH durch CRC-Überprüfung zu überprüfen. Bei der Anwendung der FLASH-Integritätsprüfung muss der CRC-Prüfwert des gesamten FLASH im Voraus berechnet werden (ohne das Byte, in dem der CRC-Wert am Ende gespeichert wurde) und am Ende des FLASH platziert werden. Berechnen Sie beim Starten oder Ausführen des Programms den CRC-Prüfwert des gesamten FLASH mit derselben Methode neu und vergleichen Sie ihn dann mit dem CRC-Wert, der am Ende des FLASH im Adressraum gespeichert ist.

EWARM unterstützt seit Version 5.5 die CRC-Berechnung von STM32-Chips. Die Berechnung des CRC-Prüfwerts für den gesamten FLASH und dessen Speicherung am Ende des FLASH kann in IAR abgeschlossen werden. Durch Konfigurieren der CRC-Berechnungsparameter von EWARM wird die CRC-Berechnung automatisch für den gesamten FLASH-Bereich durchgeführt, und das Berechnungsergebnis wird am Ende des internen FLASH-Bereichs platziert.

Sie fragen sich vielleicht, was ist der Anwendungswert davon? Nehmen Sie als Beispiel das programmbasierte Upgrade der MCU. Wenn während des Code-Upgrade-Prozesses die von der Bootloader-Upgrade-Schnittstelle übergebene Binärprogrammdatei nicht überprüft wird, können die während des Upgrade-Prozesses aufgetretenen Codefehler nicht rechtzeitig gefunden werden. Im Gegenteil, wenn dem ursprünglichen Code ein Prüfcode hinzugefügt wurde, führt das Upgrade-Programm nach Erhalt der Upgrade-Datei eine Check-Berechnung durch und vergleicht sie mit dem Check-Code am Ende der zu aktualisierenden Datei. Wenn sie nicht übereinstimmt, wird das Upgrade abgebrochen, sodass es nicht geändert wird. In den Chip wird ungültiger und sogar potenziell sicherer Code geschrieben.

  • Ändern Sie die Link-Datei, geben Sie den Speicherort der Prüfsumme in FLASH an und fügen Sie der Link-Datei die folgende Anweisung hinzu.

place at end of ROM_region { ro p .checksum };    

Diese Anweisung gibt an, dass der CRC-Wert am Ende des FLASH-Bereichs platziert werden soll. Es ist das Ende des gesamten FLASH-Bereichs, nicht das Ende des Anwendungscodes. Auf diese Weise wird die Position des CRC-Werts festgelegt und ändert sich nicht mit der Codegröße. 

  • Konfigurieren Sie die Parameter der Prüfsummenseite

Beschreibung der IAR-Prüfsummenseite (Version 6.4 und höher)

Die Prüfsummenseite von IAR ist in zwei Teile unterteilt:

  • Der rot eingekreiste Teil : Definiert den CRC-Bereich, der in FLASH berechnet werden muss, und den Füllwert der freien Bytes.

  • Der Einstellungsteil der Prüfsummenberechnungsparameter: Prüfsummengröße: Wählen Sie die Größe der Prüfsumme (Anzahl der Bytes) aus.
    Ausrichtung: Geben Sie die Ausrichtung der Prüfsumme an. Wenn es leer gelassen wird, ist die Standardeinstellung 2-Byte-Ausrichtung.

    Algorithmus: Wählen Sie den Algorithmus der Prüfsumme aus

    Komplement: Gibt an, ob eine Komplementberechnung durchgeführt werden soll. Wenn Sie "Wie besehen" wählen, wird keine Komplementberechnung durchgeführt.

    Bitreihenfolge: Die Reihenfolge der Bitausgabe. MSB zuerst, das hohe Bit jedes Bytes kommt zuerst. LSB zuerst, das niedrige Bit jedes Bytes ist zuerst.

    Bytereihenfolge innerhalb eines Wortes umkehren: Bei Eingabedaten die Reihenfolge jedes Bytes innerhalb eines Wortes umkehren.

    Anfangswert: Anfangswert berechnet durch Prüfsumme 

    Prüfsummeneinheitsgröße: Wählen Sie die Einheitengröße für die Iteration aus, unabhängig davon, ob es sich um 8-Bit-, 16-Bit- oder 32-Bit-Einheiten für die Iteration handelt.

  • IAR-Konfiguration, wenn das STM32-CRC-Peripheriegerät die Standardkonfiguration verwendet

STM32CRC-Peripheriekonfiguration:

POLY = 0x4C11DB7 (CRC32) 

Initial_Crc = 0Xffffffff 

Eingabe- / Ausgabedaten werden nicht invertiert 

Eingabedaten: 0x08000000 ~ 0x0801FFFB. (Die letzten 4 Bytes werden verwendet, um den berechneten CRC-Wert zu setzen.)

Während des Experiments wurde festgestellt, dass "Ausrichtung" keinen Einfluss auf den berechneten CRC-Wert zu haben schien. Die Konfiguration von "Umgekehrte Bytereihenfolge innerhalb des Wortes" und "Prüfsummengröße" hat jedoch eine bestimmte Beziehung. Wenn der letztere 32-Bit wählt, können Sie den ersteren nicht prüfen. Wenn der letztere 8-Bit wählt, müssen Sie "Bytereihenfolge innerhalb des Wortes umkehren" prüfen. Sie können sich auch auf die folgende Abbildung beziehen:

Für Versionen unter IAR v6.4 gibt es keine Option "Prüfsummeneinheitsgröße". Die Referenzkonfiguration lautet wie folgt:

Wie schreibe ich Code?

Wie oben beschrieben, kann diese Anwendung verwendet werden, um Daten in Flash zu überprüfen. Der Referenzcode lautet wie folgt:

/*-1- 配置CRC外设 */ 
  CrcHandle.Instance = CRC; 
 
  /* 默认二进制多项式使能 */ 
  CrcHandle.Init.DefaultPolynomialUse    = DEFAULT_POLYNOMIAL_ENABLE; 
 
  /* 默认初值设置 */ 
  CrcHandle.Init.DefaultInitValueUse     = DEFAULT_INIT_VALUE_ENABLE; 
 
  /* 输入数据不反转 */ 
  CrcHandle.Init.InputDataInversionMode  = CRC_INPUTDATA_INVERSION_NONE; 


 /* 输出数据不反转 */ 
  CrcHandle.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLED; 
 
  /* 输入数据基本单元长度为32bit */ 
  CrcHandle.InputDataFormat              = CRC_INPUTDATA_FORMAT_WORDS; 
 
  if (HAL_CRC_Init(&CrcHandle) != HAL_OK) 
  { 
    /* 初始化错误 */ 
    Error_Handler(); 
  } 
 
  pdata = (uint32_t*)ROM_START; 
 
  /*##-2- 调用HAL库利用硬件CRC外设对ROM区计算CRC-32校验码*/ 
  uwCRCValue = HAL_CRC_Calculate(&CrcHandle, pdata, ROM_SIZEinWORDS);


Zusammenfassung

Für CRC-Anwendungen können Sie auch reine Softwarelösungen schreiben, die auf Polynomoperatoren basieren. Im Internet gibt es viele vorgefertigte Codes. Die Grundidee ist nichts anderes als die Nachschlagetabellenmethode und die Schichtberechnungsmethode. Der Unterschied besteht darin, dass einer Speicherplatz im Austausch für Recheneffizienz opfert und der andere Computerzeit opfert, um Speicherplatz zu sparen. Die Auswahl basiert auf der umfassenden Berücksichtigung des entworfenen Systems und hängt im Allgemeinen vom Anwendungsszenario ab.

  • Verwenden Sie den CRC-Algorithmus, um den redundanten Code der Blockdaten zu berechnen. Einige Artikel und Standards nennen diesen redundanten Code eine Signatur. In der tatsächlichen Anwendung wird der durch Berechnung der gültigen Daten erhaltene Prüfcode mit dem vorgespeicherten Prüfcode verglichen. Wenn sie gleich sind, besteht die Prüfung, andernfalls schlägt die Prüfung fehl. Natürlich können die Originaldaten und der gespeicherte Prüfcode auch an den Prüfalgorithmus übergeben werden. Wenn das Ergebnis 0 ist, besteht die Prüfung, andernfalls schlägt sie fehl.

  • Für die Datenkommunikation wird im Allgemeinen ein gültiger Datenprüfcode am Ende der Nachricht hinzugefügt, und der Empfänger überprüft die Datenintegrität der empfangenen Nachricht.


1. Analysieren Sie die Auswirkungen der "Interpretierbarkeit" auf die künstliche Intelligenz aus einer eingebetteten Perspektive!

2. [MCU] Register, Standardbibliothek, HAL-Bibliothek, LL-Bibliothek, so viele Bibliotheken! Wie fragst du mich zu wählen?

3. Wie viele Schritte gibt es, um eingebettete Projekte unter Linux zu entwickeln?

4. Woher kennt das Programm selbst seine Größe? Dies ist eine Frage, ob ein Huhn ein Ei legt oder ein Ei ein Huhn legt!

5. Inländische integrierte Entwicklungsumgebung hilft inländischem RISC-V, das Monopol ausländischer Giganten in der Chiptechnologie zu brechen

6. Wie realisieren Sie bei der Embedded-Entwicklung das LCD-Display?

Haftungsausschluss: Dieser Artikel wird online reproduziert und das Copyright liegt beim ursprünglichen Autor. Wenn Sie in Urheberrechtsfragen verwickelt sind, kontaktieren Sie uns bitte. Wir werden das Urheberrecht anhand der von Ihnen bereitgestellten Materialien zur Urheberrechtsbescheinigung bestätigen und die Vergütung des Autors zahlen oder den Inhalt löschen.

Ich denke du magst

Origin blog.csdn.net/DP29syM41zyGndVF/article/details/109881592
Empfohlen
Rangfolge