home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 10 / crc.dok < prev    next >
Encoding:
Text File  |  1989-04-24  |  13.8 KB  |  372 lines

  1.  
  2. CRC-Sicherung per Software
  3.  
  4.  
  5. von Günter Born
  6.  
  7.  
  8. Wenn binäre Daten zwischen Verarbeitungskomponenten ausgetauscht
  9. werden, ist damit zu rechnen, daß Störungen die Informationen verfäl-
  10. schen. Um das Problem zu beheben, existieren verschiedenartige Ver-
  11. fahren, unter anderem auch der "cyclic-redundancy-check".
  12.  
  13. Da das Thema CRC-Sicherung teilweise recht stiefmütterlich behandelt
  14. wird, insbesondere was konkrete Softwarealgorithmen angeht, zeigt der
  15. folgende Beitrag die Grundlagen des CRC-Verfahrens. Implementierungen
  16. für verschiedene Sprachen sind auf einer TOOLBOX Spezial-Diskette
  17. ausgearbeitet und erhältlich.
  18.  
  19. Die CRC-Prüfung, zum Beispiel in Floppy Controllern, erfolgt in der
  20. Regel mittels spezieller Bausteine. In der täglichen Praxis treten
  21. jedoch immer wieder Fälle auf, wo entsprechende Hardwarekomponenten
  22. aus den unterschiedlichsten Gründen nicht einsetzbar sind. Hier kann
  23. eine softwaremäßige CRC-Berechnung gute Dienste leisten.
  24.  
  25. Eine Hauptaufgabe der Datenkommunikation besteht in der Fehlerer-
  26. kennung und -korrektur. Da Fehlerkorrekturen recht aufwendig sind,
  27. wird diese Methode nur dort angewandt, wo die Daten nicht, oder nur
  28. mit großem Aufwand, wiederbeschaffbar sind (z.B. Satellitenüber-
  29. tragung). In allen anderen Fällen reicht eine sichere
  30. Fehlererkennung, da der Sender die Daten gegebenenfalls neu
  31. übertragen kann.
  32.  
  33. Bei einfachen Anwendungen erfolgt die Sicherung mittels Paritätsbits
  34. (z.B. Terminal- und Druckerverbindungen). Verbesserte Über-
  35. tragungsverfahren verwenden Längs- und Querparitätsprüfungen zur Er-
  36. höhung der Sicherheit. Gemeinsam ist allen Varianten die leichte Rea-
  37. lisierbarkeit, aber auch das Problem, daß Mehrfachfehler nicht immer
  38. sicher erkannt werden können. Aufbauend auf dieser Erkenntnis
  39. benutzen höherwertigere Übertragungsverfahren die CRC-Methode zur
  40. Codesicherung (z.B. HDLC / SDLC, Floppy- / Plattenaufzeichnung,
  41. etc.). Durch Auswahl geeigneter Sicherungspolynome kann die ge-
  42. forderte Fehlerzahl pro Nachricht sicher erkannt werden.
  43.  
  44. Da diese Aufgabe aufwendiger als eine reine Paritätsprüfung ist,
  45. verwendet man in der Regel spezielle Bausteine. In der Praxis kommt
  46. es jedoch immer wieder vor, daß eine CRC-Sicherung erforderlich wird,
  47. ohne daß entsprechende Hardware eingesetzt werden kann. Ein Beispiel
  48. ist die Implementierung von zeichenorientierten Übertragungsproze-
  49. duren mit einer Fehlererkennung per cyclic-redundancy-check. Hier
  50. kommt dann nur eine Softwarelösung in Frage. Da nicht alle
  51. Prozessoren mit entsprechenden Befehlen ausgestattet sind, wird nach-
  52. folgend gezeigt, wie man zu einer Lösung gelangt.
  53.  
  54.  
  55. Grundlagen der CRC-Berechnung
  56.  
  57.  
  58. Bevor wir uns mit konkreten Algorithmen zur CRC-Berechnung beschäf-
  59. tigen, soll noch kurz auf die Grundlagen eingegangen werden.
  60.  
  61. Eine Folge von n Binärzeichen (Bsp. 1001 0000) werde mit:
  62.  
  63. Repro1 (75 x 15)
  64.  
  65. bezeichnet. Diese Folge läßt sich dann als binäres Polynom vom Grade
  66. n darstellen,
  67.  
  68. Repro2 (75 x 15)
  69.  
  70. mit dem Koeffizienten a,,tn. I(x) wird im folgenden als
  71. Informationspolynom bezeichnet, da es die Folge von Binärzeichen
  72. (Information) beinhaltet. Der Grad des Polynoms wird durch die Länge
  73. der Folge B bestimmt.
  74.  
  75. Es existiert nun ein weiteres Polynom G(x) vom Grad k < n, d.h. der
  76. Grad ist kleiner als der des Informationspolynoms, welches nicht
  77. durch andere binäre Polynome darstellbar (irreduzibel) ist.
  78.  
  79. Repro 3 (75 x 15)
  80.  
  81. Das Informationspolynom wird nun mit x,,hk (k = Grad G(x))
  82. multipliziert und dann durch das Generatorpolynom G(x) dividiert.
  83.  
  84.  
  85.  
  86. Repro 4 (75 x 30)
  87.  
  88.  
  89. Das Restpolynom R(x) mit dem Grad k wird nun an das Informationspoly-
  90. nom angehängt. Das Ergebnis wird als Codepolynom C(x) bezeichnet.
  91.  
  92. Repro 5 (75 x 15)
  93.  
  94. An Stelle der ursprünglichen Binärzeichenfolge B finden wir nun eine
  95. Codefolge, in der B um die Koeffizienten von R(x) ergänzt wurde. Das
  96. zugehörige Codepolynom C(x) besitzt die Eigenschaft, daß es durch
  97. G(x) ohne Rest teilbar ist /1/.
  98.  
  99.  
  100. Repro 6 (75 x 30)
  101.  
  102.  
  103.  
  104.  
  105. Diese Eigenschaft wird nun zur Informationssicherung ausgenutzt: Eine
  106. Folge von Binärzeichen (Koeffizienten des Informationspolynoms I(x))
  107. wird durch ein Generatorpolynom G(x) dividiert. Die Koeffizienten des
  108. entstehenden Restpolynoms (CRC-Code) werden an die Nachricht
  109. angehängt. Auf der Empfängerseite wird die eintreffende Zeichenfolge,
  110. einschließlich des Divisionsrestes, durch das vereinbarte
  111. Generatorpolynom dividiert. Ist der Divisionsrest Null, dann wurde
  112. die Zeichenfolge korrekt empfangen. Andernfalls sind Fehler während
  113. der Übertragung aufgetreten. Der Grad des Generatorpolynoms bestimmt
  114. dabei die Zahl der Mehrfachfehler, die sicher erkannt werden können.
  115.  
  116.  
  117. Ein Beispiel
  118.  
  119.  
  120. Das Verfahren soll nun an Hand eines kleinen Beispiels überprüft
  121. werden. Es soll die Binärzeichenfolge 1001100101 übertragen werden.
  122. Als Generatorpolynom wird:
  123.  
  124.    G(x) = x,,h3 + x + 1 (Grad k = 3)
  125.  
  126. gewählt. Aus der Binärzeichenfolge ergibt sich das
  127. Informationspolynom zu:
  128.  
  129.  
  130. Repro 7 (75 x 23)
  131.  
  132.  
  133. Die Division von I(x) * x,,h3 durch G(x) liefert folgendes Ergebnis:
  134.  
  135.  
  136.  
  137.  
  138. Repro 8 (75 x 40)
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146. Damit ergibt sich das Codepolynom zu:
  147.  
  148. Repro 9 (75 x 15)
  149.  
  150. An die ursprüngliche Zeichenfolge wird der Divisionsrest 101
  151. angehängt.
  152.  
  153.  
  154.  
  155. Repro 10 (75 x 30)
  156.  
  157.  
  158. Das Ergebnis wird nun übertragen und auf der Empfängerseite durch das
  159. gleiche Polynom G(x) dividiert. Bei korrekter Übertragung ergibt
  160. sich:
  161.  
  162.  
  163.  
  164.  
  165. Repro 11 (75 x 40)
  166.  
  167.  
  168.  
  169.  
  170.  
  171. Eine Division des Codepolynoms C(x) durch x,,h3 führt auf das
  172. ursprüngliche Informationspolynom I(x) und damit auf die Binärfolge
  173. 1001100101 zurück. Tritt nun während der Übertragung eine Störung
  174. auf, muß sich dies bei der CRC-Berechnung im Empfänger bemerkbar
  175. machen. Unter der Annahme, daß die empfangene Nachricht:
  176.  
  177.         1011100001101
  178.  
  179. zwei Fehler enthält, ergibt sich folgende Rechnung:
  180.  
  181.  
  182.  
  183.  
  184. Repro 12 (75 x 40)
  185.  
  186.  
  187.  
  188.  
  189.  
  190. Übertragungsfehler können also leicht durch
  191. R(x) <> 0 erkannt werden.
  192.  
  193. Die CRC-Sicherung beruht also darauf, eine Zeichenfolge bitweise
  194. durch ein Generatorpolynom zu dividieren. Die Bitfolge, sowie der
  195. Divisionsrest, sind dann zu übertragen. Im Empfänger wird der
  196. eintreffende Bitstrom (Nutzzeichen und Divisionsrest) durch das glei-
  197. che Polynom dividiert. Falls ein Divisionsrest <> 0 auftritt, liegt
  198. ein Übertragungsfehler vor.
  199.  
  200. In der Praxis werden häufig Generatorpolynome mit dem Grad 8,12,16,32
  201. eingesetzt, um bei byteorientierter Bearbeitung Abspeicherung und
  202. Handhabung zu vereinfachen.
  203.  
  204.  
  205. Die Umsetzung in ein numerisches Verfahren.
  206.  
  207.  
  208. Nun soll aber die trockene Theorie verlassen werden. Es stellt sich
  209. die Frage, wie obige Erkenntnis in die Praxis umsetzbar ist. Die ge-
  210. zeigte Polynomdivision ist sicherlich nicht sehr effektiv auf dem
  211. Rechner zu realisieren. Glücklicherweise läßt sich eine binäre Divi-
  212. sion jedoch auf Verknüpfungen von Schiebeoperationen mit Additionen
  213. (mittels Exclusiv ODER) zurückführen. Damit ist die CRC-Berechnung
  214. nach einem Schema gemäß Bild 1 darstellbar.
  215.  
  216. Hierbei wurde das häufig verwendete Generatorpolynom:
  217.  
  218. Repro 13 (75 x 15)
  219.  
  220.  
  221. gewählt. Eine binäre Zeichenfolge, z.B. ein Text, wird nun Bit für
  222. Bit in den Generator eingespeist. Dieser berechnet die CRC-Summe
  223. durch fortlaufende XOR und Schiebeoperationen. Am Ende des Vorganges
  224. liegt die 16 Bit CRC-Summe zur weiteren Auswertung vor. In Bild 2
  225. wird der Ablauf während der CRC-Berechnung der Zeichen 55H, 88H, CCH
  226. gezeigt.
  227.  
  228. Die Realisierung eines solchen Generators per Hardware ist durch zu-
  229. sammenschalten einzelner Digitalbausteine leicht möglich. Interessant
  230. wird dieser Ansatz bei Verwendung von PLA (Programmable Logic Array)
  231. oder ASIC (Application Spezific Integrated Circuit) Komponenten. Hier
  232. kann der gesamte Generator unter Umständen auf einem Chip
  233. untergebracht werden.
  234.  
  235.  
  236. Realisierung eines CRC-Generators per Software
  237.  
  238.  
  239. Nun haben wir bereits einige Anhaltspunkte zur Realisierung eines
  240. CRC-Generators. Durch Übertragung des oben aufgezeigten Prinzips in
  241. einen geeigneten Algorithmus, kann die CRC-Berechnung aber auch soft-
  242. waremäßig erfolgen. Es gibt z.B. Prozessoren, die bereits
  243. entsprechende Befehle vorsehen. Bei Mikroprozessoren ist dies jedoch
  244. im allgemeinen nicht der Fall. Hier muß ein entsprechendes Programm
  245. erstellt werden.
  246.  
  247. Vor der Erstellung muß ein geeigneter Algorithmus formuliert werden,
  248. der als erstes ein 16 Bit CRC-Register reserviert. Dies kann entweder
  249. in Form einer Variablen, oder als Register des Prozessors, erfolgen.
  250. Dann ist die zu übertragende Zeichenkette in einzelne Bytes zu
  251. unterteilen. ASCII-Zeichen liegen in der Regel bereits als Bytes vor.
  252. Für die Berechnung wird nun jedes Byte Bit für Bit über die XOR-
  253. Funktion mit dem CRC-Register verknüpft. Der Ablauf schematisch:
  254. ,,l
  255.   clear CRC.Reg
  256.   LOOP über alle Zeichen
  257.    lese Zeichen
  258.    LOOP über alle 8 Bits des Zeichens
  259.     carry := CRC.Reg XOR Zeichen
  260.     shift right (Zeichen)
  261.     shift right (CRC.Reg)
  262.     IF carry = 1 THEN
  263.      CRC.Reg := CRC.Reg OR 8000H {* shift MSB *}
  264.      CRC.Reg := CRC.Reg XOR Polynom {* xor Bits *}
  265.     ELSE
  266.      CRC.Reg := CRC.Reg AND 7FFFH {* clear MSB *}
  267.     ENDIF
  268.    END {* LOOP über 8 Bit *}
  269.   END {* LOOP über alle Zeichen *}
  270.  
  271. Dieser Algorithmus läßt sich nun recht einfach in Form eines
  272. Programmes implementieren. Wie dies zum Beispiel für den Intel 8086
  273. Prozessor aussieht, wird im Listing (Bild 3) gezeigt.
  274.  
  275. Ein Großteil der Anwender setzt nun aber Hochsprachen zur
  276. Softwareentwicklung ein und obiges Programm läßt sich wegen der
  277. Parameterübergabe per Register nur in Assemblerroutinen einbinden.
  278. Geeignete Algorithmen für verschiedene Hochsprachen finden Sie auf
  279. der "TOOLBOX-Spezial X: CRC-Softwaresicherung", die solche Routinen
  280. für die Intel 80x86 Prozessoren in Assembler und Turbo Pascal 4/5
  281. enthält. Die CRC-Berechnung reduziert sich dann auf den Aufruf der
  282. Prozedur (z.B. in Turbo Pascal):
  283.  
  284.  CRC (CRCregister, Zeichenpuffer, Zeichenzahl)
  285.  
  286. und die Einbindung der entsprechenden Bibliotheksroutine.
  287. Beispielprogramme in Turbo Pascal 4/5 und Quick Basic 4.x
  288. demonstrieren den Umgang mit den Bibliotheksmodulen.
  289.  
  290.  
  291. Weitere Optimierungen
  292.  
  293.  
  294. Die Implementierung des Algorithmus in Assembler bringt bereits eine
  295. erhebliche Effizienzsteigerung gegenüber Lösungen in Hochsprachen.
  296. Trotzdem bleibt die Frage, ob sich das Verfahren im Hinblick auf die
  297. Verarbeitungsgeschwindigkeit noch steigern läßt. Eine Analyse des Al-
  298. gorithmus zeigt, wo Optimierungen Sinn machen: Das Auslesen der
  299. Zeichen aus dem Puffer kostet zwar Zeit, ist aber unvermeidbar. Da
  300. jeweils nur ein Zugriff pro Zeichen erfolgt, bringt eine Optimierung
  301. nur wenige Vorteile. Anders sieht es aber bei der Bearbeitung des
  302. Zeichens aus, da für jedes Zeichen die innere Schleife 8 mal
  303. durchlaufen wird. Jede noch so kleine Optimierung wirkt sich deshalb
  304. drastisch auf das Laufzeitverhalten aus. Aber wie kann der
  305. Algorithmus noch verbessert werden?
  306.  
  307. Im Assembler hilft es, wenn alle Zwischendaten nicht im Speicher,
  308. sondern in den Registern des Prozessors gehalten werden können. Aber
  309. ganz befriedigend ist dieses Verfahren immer noch nicht. Schön wäre
  310. es, wenn die Zahl der Schleifendurchläufe verringert werden kann:
  311. Hier hat uns die Betrachtung der Hardwarelösung unbewußt in eine
  312. Sackgasse geführt. Per Hardware läßt sich die XOR-Verknüpfung und die
  313. Schiebeoperation sehr elegant verwirklichen. Bei hohen Taktraten
  314. erreicht der CRC-Generator dann einen recht hohen Durchsatz.
  315.  
  316. Anders sieht es aber bei den Mikroprozessoren aus. Einmal sind diese
  317. für eine Bitverarbeitung nicht optimiert, sollen sie doch gewöhnlich
  318. Bytes und Worte bearbeiten. Zusätzlich ist die Taktfrequenz des
  319. Prozessors in der Regel fest vorgegeben, so daß die
  320. Verarbeitungsleistung begrenzt wird. Diese obige Einschränkung ist
  321. einerseits bedauerlich, birgt aber anderseits auch den Schlüssel zur
  322. Lösung unseres Problems. Wenn ein Mikroprozessor besser zur Bearbei-
  323. tung von Bytes oder Worten geeignet ist, dann sollte der CRC-
  324. Algorithmus dies berücksichtigen. Während die hardwareorientierte
  325. Lösung sich nicht zuletzt aus Aufwandsgründen auf die bitorientierte
  326. Verarbeitung beschränkt, gilt diese Einschränkung beim Mikrprozessor
  327. nicht. Was hindert uns also daran, eine parallele Verarbeitung anzu-
  328. streben?
  329.  
  330. Überlegen wir uns einmal die Konsequenzen: In einem 8 Bit Zeichen
  331. lassen sich maximal 255 verschiedene Bitkombinationen speichern. Dies
  332. bedeutet andererseits, daß bei der CRC-Berechnung im Grunde auch nur
  333. 255 verschiedene Ergebnisse auftreten können. Die Daten im CRC-
  334. Register werden ja zyklisch verschoben. Also müßte es doch möglich
  335. sein, ausgehend vom Wert im CRC-Register und vom gerade eingelesenen
  336. Zeichen das Ergebnis vorauszuberechnen.
  337.  
  338. Das Ergebnis ist ein Algorithmus, der die bitweise Bearbeitung der
  339. einzelen Zeichen vermeidet. Vielmehr werden Tabellen mit vorher
  340. ermittelten Ergebnissen zur CRC-Berechnung benutzt. Bei jedem Zeichen
  341. ist dann nur noch eine Verknüpfung des CRC-Registers mit dem
  342. Tabelleneintrag erforderlich. Die vormals existierende innere
  343. Schleife mit 8 maligem Durchlauf reduziert sich dann auf einen
  344. Zugriff auf die Tabelle. Es ist einsichtig, daß dieser Algorithmus
  345. eine erhebliche Effizienzsteigerung bringt.
  346.  
  347. Auf der ist "TOOLBOX-Spezial-Diskette" ist dieser Algorithmus in Form
  348. einer Turbo Pascal Procedur enthalten. Damit lassen sich eigene
  349. Lösungen zur Berechnung von CRC-Summen recht schnell erzielen. Gerade
  350. bei der seriellen Übertragung von Daten über V24 Leitungen sollte das
  351. Übertragungsprotokoll nicht auf ein solches Sicherungsverfahren
  352. verzichten.
  353.  
  354.  
  355. Literatur
  356.  
  357. /1/ Unger, C.: Datenfernverarbeitung und Rechnernetze. Kursunter-
  358. lagen der Fernuniversität - Gesamthochschule - Hagen, KE 2, S. 43 -
  359. 45.
  360.  
  361.  
  362. Achtung:
  363.  
  364. Die Implementationen für die vorgestellten Algorithmen in Turbo
  365. Pascal 4/5 und Assembler für die Intel 80x86-Prozessoren, sowie
  366. Beispielprogramme zum Umgang mit den Bibliotheksmodulen in Turbo Pas-
  367. cal 4/5 und Quick-Basic 4.x bietet die
  368.  
  369. TOOLBOX-Spezial X: CRC-Softwaresicherung
  370.  
  371. Beachten Sie die Werbung am Ende der Sonderbeilage.
  372.