Ich habe noch eine Frage aus dem Umfeld von CRC. Der Cortex-M3 (z.B. LPC1788) hat eine CRC Engine. Mit dieser kann man mit hoher Performance ein CRC ausrechenen. In einer Anwendung soll diese aber sehr unetrschiedlich benutzt werden. Während im Hintergrund ein CRC über einen sehr große Bereich (mehere Megabyte) berechnet wird, soll in einer ISR mal schnell ein recht kurzes CRC berechnet werden. Nun hat die CRC Engine ein SEED Register, in das man den Anfangswert des CRC einträgt. Damit sollte es doch möglich sein, in der ISR den alten Zustand zu sicher, die Berechnung auszuführen und den alten Zustand wieder herzustellen. Meine bisherigen Versuche sind grundsätzlich gescheitert. Hat jemand mit so einer CRC Engine eine Unterbrechnung erfolgreich implementiert? Was muss man in das SEED Register schreibem, um einen alten Zustand wieder herzustellen? Best! Harper
:
Bearbeitet durch User
Harper Blues schrieb: > Nun hat die CRC Engine ein SEED Register, in das man den Anfangswert des > CRC einträgt. Damit sollte es doch möglich sein, in der ISR den alten > Zustand zu sicher, die Berechnung auszuführen und den alten Zustand > wieder herzustellen. Nicht unbedingt. "CRC" bezeichnet keinen konkreter Algorithmus, sondern eine ganze Klasse von Algorithmen, die sich in diversen Details unterscheiden. Eine universell einsetzbare CRC-Hardware muß Möglichkeiten bieten, diese Details zu konfigurieren und ihre Arbeitsweise entsprechend dieser Konfiguration modifizieren. Je nachdem, wie das konkret umgesetzt wurde, wäre es im schlimsten Fall sogar denkbar, daß es überhaupt nicht möglich ist, die CRC-Einheit für "unterbrechbare" CRC-Berechnungen zu benutzen. Es ist aber auch denkbar, daß nur bestimmte Details das verhindern, insbesondere eine Modifikationen des Start- bzw. Endwertes durch die Hardware. Dann müßte man möglicherweise diesen Teil in Software erledigen, könnte aber für den Kern des CRC-Algorithmus weiterhin von der Hardwareunterstützung profitieren. Im Idealfall bietet die Hardware einen Satz von Registern, der für alle denkbaren Konfigurationen das Sichern und Widerherstellen des vollständigen Zustands der Hardware erlaubt. Ich würde einfach mal das Datenblatt lesen, um herauszufinden, was die konkrete Hardware macht und kann. Da sollte das drinne stehen...
c-hater schrieb: > Je nachdem, wie das konkret umgesetzt wurde, wäre es im schlimsten Fall > sogar denkbar, daß es überhaupt nicht möglich ist, die CRC-Einheit für > "unterbrechbare" CRC-Berechnungen zu benutzen. Da das ganze als eigenständige Hardwareeinheit realisiert ist dürfte dem CRC-Teil ein Interrupt des Core recht egal sein und der erstmal sein eventuell gerade noch laufende Berechnung weiterführen. Wenn dazu dann noch DMA ins Spiel kommt kann es schon gut sein das dasas ganze während deiner IRS gemütlich weiterarbeitet.
c-hater schrieb: > > "CRC" bezeichnet keinen konkreter Algorithmus, sondern eine ganze Klasse > von Algorithmen, die sich in diversen Details unterscheiden. Eine > universell einsetzbare CRC-Hardware muß Möglichkeiten bieten, diese > Details zu konfigurieren und ihre Arbeitsweise entsprechend dieser > Konfiguration modifizieren. Ja, zum Glück ist das möglich. Die Parameter kann mann nach Datenblatt einstellen. > Je nachdem, wie das konkret umgesetzt wurde, wäre es im schlimsten Fall > sogar denkbar, daß es überhaupt nicht möglich ist, die CRC-Einheit für > "unterbrechbare" CRC-Berechnungen zu benutzen. > > Es ist aber auch denkbar, daß nur bestimmte Details das verhindern, > insbesondere eine Modifikationen des Start- bzw. Endwertes durch die > Hardware. Dann müßte man möglicherweise diesen Teil in Software > erledigen, könnte aber für den Kern des CRC-Algorithmus weiterhin von > der Hardwareunterstützung profitieren. Denkbar wäre auch dieses. Jedoch ist der Zweck eines Hardware CRC Generators effizient zu arbeiten (nur ein Schreibzugriff) und Daten direkt zu übernehmen (per DMA, was ich aber nicht benutze). > Im Idealfall bietet die Hardware einen Satz von Registern, der für alle > denkbaren Konfigurationen das Sichern und Widerherstellen des > vollständigen Zustands der Hardware erlaubt. Genau, die werden ab Seite 864 von http://www.nxp.com/documents/user_manual/UM10470.pdf beschrieben. Und hier hatte ich gefragt: > Hat jemand mit so einer CRC Engine eine Unterbrechnung erfolgreich > implementiert? > Ich würde einfach mal das Datenblatt lesen, um herauszufinden, was die > konkrete Hardware macht und kann. Da sollte das drinne stehen... Nun da (Link s.o.) steht drin, dass man - das Mode Register setzt um das Polynom und die Bit-Order einzustellen - das Seed Register setzt um den Anfangswert festzulegen - alle Daten in das Data Register schreibt - das Ergebnis aus dem Checksum Register liest. In der Tat habe ich das Datenblatt gelesen, um meine Anwendung zu implementieren zu können. Sie funktioniert auch soweit. Nur hatte ich eine Frage, ob jemand weiß, wie man diese Cortex-M3 CRC Engine in einer ISR neu aufsetzen und vor Verlassen der ISR in den ursprünglichen Zustand versetzen kann, damit im Hintergrund laufende Berechnung fortzusetzen. Grüße Harper.
Irgendwer schrieb: > Da das ganze als eigenständige Hardwareeinheit realisiert ist dürfte dem > CRC-Teil ein Interrupt des Core recht egal sein und der erstmal sein > eventuell gerade noch laufende Berechnung weiterführen. Wenn dazu dann > noch DMA ins Spiel kommt kann es schon gut sein das dasas ganze während > deiner IRS gemütlich weiterarbeitet. Das würde ich nicht bezweifeln. Allerdings hatte ich mit dem Text > soll in einer ISR mal schnell ein recht kurzes CRC berechnet werden. zum Ausdruck bringen wollen, dass in der ISR die CRC Enginge benutzt werden soll. Mir ist schon klar, das mit DMA keine Nutzung in der ISR möglich sein kann. Ich möchte aber in der ISR den Zustand der CRC Engine sichern, sie benutzen und nach der Nutzung wieder den alten Zustand herstellen. Best! Harper
Harper Blues schrieb: >> Es ist aber auch denkbar, daß nur bestimmte Details das verhindern, >> insbesondere eine Modifikationen des Start- bzw. Endwertes durch die >> Hardware. Dann müßte man möglicherweise diesen Teil in Software >> erledigen, könnte aber für den Kern des CRC-Algorithmus weiterhin von >> der Hardwareunterstützung profitieren. > Denkbar wäre auch dieses. Das ist nicht nur denkbar, sondern im konkreten Fall objektive Realität. Woher ich das weiß? Ich habe einfach nur genau das Datenblatt gelesen, was du geposted hast. > Genau, die werden ab Seite 864 von Nein, werden sie nicht. Oder anders ausgedrückt: zwar werden alle verfügbaren Register beschrieben, aber es ist eben kein vollständiger Satz verfügbar, um in jeder Konfiguration den Status der Hardware sichern zu können. Woher ich da weiß? Du ahnst es jetzt sicher schon... > In der Tat habe ich das Datenblatt gelesen Offensichtlich nicht intensiv genug. Vor allem fehlt dir wohl das Verständnis für das Funktionsschema auf Seite 865. Daraus geht ganz klar hervor, was definitiv nicht gehen wird, weil es nicht gehen kann. Tipp: Zum vollständigen Sichern des Status der Hardware wäre im Minimum ein direkter Lesezugriff auf das Schieberegister nötig. Der ist aber bei vorliegendem Funktionsschema aber ganz offensichtlich höchstens für bestimmte Betriebsarten gegeben...
Das geht nicht. Das Ergebnis der CRC-Berechnung wird ja zurückgeführt und mit dem nächsten Datum der CRC-Berechnung verknüpft. Du müsstest also das CRC-Summenregister beschreiben, um den Ursprungszustand wieder herzustellen. Das Register ist allerdings Read-Only.
Harper Blues schrieb: > Während im Hintergrund ein CRC > über einen sehr große Bereich (mehere Megabyte) berechnet wird, soll in > einer ISR mal schnell ein recht kurzes CRC berechnet werden. Kann man den "sehr großen Bereich" nicht aufteilen in Segmente? Dann könnte man für jedes Segment CRC machen. Und wenn die ISR kommt, wird das aktuelle Segment verworfen, CRC gemacht, und danach für das aktuelle Segment CRC neu gestartet. Oder ist der Interrupt nicht so dringend? Dann könnte die ISR den Interrupt auf Pending legen, bis das aktuelle CRC fertig ist. Wenn die ISR natürlich häufig kommt, bleibt nur eine SW-Lösung, es gibt nun mal nur eine CRC Engine.
Hallo, ich würde die Hardware-CRC einfach weiterarbeiten lassen und in der ISR Software-CRC machen - mit einer Tabelle dauert das kaum länger (wenn überhaupt) als CRC-Engine sichern, neu aufsetzen und dann wiederherstellen, selbst wenn das ginge, was offensichtlich nicht der Fall ist. Abgesehen davon muss ja für die "ISR-CRC" ebenfalls alles gesichert und wiederhergestellt werden, wahrscheinlich erfolgt ja der Interrupt nur für ein empfangenes Zeichen und nicht für eine ganze Message. Georg
c-hater schrieb: > Ich würde einfach mal das Datenblatt lesen, um herauszufinden, was die > konkrete Hardware macht und kann. Da sollte das drinne stehen... Ja, das ist eine gute Idee. Danke für den Tipp.
c-hater schrieb: > Das ist nicht nur denkbar, sondern im konkreten Fall objektive Realität. > > Woher ich das weiß? Ich habe einfach nur genau das Datenblatt gelesen, > was du geposted hast. > >> Genau, die werden ab Seite 864 von > > Nein, werden sie nicht. Oder anders ausgedrückt: zwar werden alle > verfügbaren Register beschrieben, aber es ist eben kein vollständiger > Satz verfügbar, um in jeder Konfiguration den Status der Hardware > sichern zu können. Woher ich da weiß? Du ahnst es jetzt sicher schon... > >> In der Tat habe ich das Datenblatt gelesen > > Offensichtlich nicht intensiv genug. Vor allem fehlt dir wohl das > Verständnis für das Funktionsschema auf Seite 865. Daraus geht ganz klar > hervor, was definitiv nicht gehen wird, weil es nicht gehen kann. Dieser Argumentation kann ich leider nicht folgen. Vom CRC_SEED Register wird über ein MUX direkt auf das CRC REG zugegriffen. Damit ist ein Schreiben nicht ausgeschlossen. > Tipp: Zum vollständigen Sichern des Status der Hardware wäre im Minimum > ein direkter Lesezugriff auf das Schieberegister nötig. Der ist aber > bei vorliegendem Funktionsschema aber ganz offensichtlich höchstens für > bestimmte Betriebsarten gegeben... Naja, das ist nicht ganz richtig. Beim Lesen der Beschreibung des CRC_SEED Register fällt noch auf: A write access to this register will load CRC seed value to CRC_SUM register with selected bit order and 1’s complement pre-processes. Damit ist ein Schreiben des SUM Register möglich, aber unter bestimmten Spielregeln. Wenn das SEED Register geschrieben wird, wird auch das CRC_REG geladen. Der Wert, der dann von CRC_SUM gelesen wird, ist aber noch vom CRC_MODE Register abhängig. Wenn im MODE Register das BIT_RVS_SUM gesetzt ist, wird im CRC_SUM Register ein Wert gelesen, in dem die Bits von CRC_REG gespiegelt sind. Da das Schreiben von CRC_SEED das CRC Register lädt, erscheint danach im CRC_SUM Register der selbe Wert, nur gespiegelt. Man kann also den Status wieder herstellen, wenn man in CRC_SEED den gespiegelten Wert von CRC_SUM schreibt. Das ist ist der CRC realisierbar und schneller als eine Software-CRC. Das deckt übrigens noch eine Ungenauigkeit in der Dokumentation auf. In der Fig. 164 wird dargestellt, dass das BIT_RSV_SUM nach dem CRC_REG ausgewertet wird, und CRC_SUM kein eigenes Register (ein Kästchen) sei. Dann würde aber eine Änderung des Bits direkt den gelesenen Wert von CRC_SUM beeinflussen. Das ist aber nicht der Fall. Anscheinend ist CRC_SUM ein eigenes Register, das unter Berücksichtung von BIT_RSV_SUM und CMPL_SUM geladen wird, sowie CRC_REG geändert wurde.
Irgendwer schrieb: > Wenn dazu dann > noch DMA ins Spiel kommt kann es schon gut sein das dasas ganze während > deiner IRS gemütlich weiterarbeitet. Verstehe ich das so richtig, dass Du die CRC Engine mit einem DMA Kanal bedienen würdest? In dem Falle wäre ich mal interessiert, ob das funktioniert. Die CRC-Engine ist nicht in der Liste der unterstützen Peripheriebausteine enthalten. Ich beziehe mich hierbei auf die Tabelle 705 im Kapitel 34.5.20 "DMA Channel Configuration registers" und Tabelle 685 im Kapitel 34.2.3 des Datenblatts. Da der DMA Controller aber ohne Adress-Inkrement arbeiten kann, könnte es ja vielleicht doch funktionieren, die Zieladresse auf das CRC data register zu setzen. Bliebe noch die Frage, wie der TRANSFERTYPE des DMA Kanals eingestellt werden muss. Hat das schon mal jemand versucht oder sogar erfolgreich gemacht?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.