Forum: Mikrocontroller und Digitale Elektronik Cortex-M3 CRC Engine in ISR benutzen


von Harper B. (harper)


Lesenswert?

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
von c-hater (Gast)


Lesenswert?

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

von Irgendwer (Gast)


Lesenswert?

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.

von Harper B. (harper)


Lesenswert?

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.

von Harper B. (harper)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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

von GB (Gast)


Lesenswert?

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.

von Lothar (Gast)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von Harper B. (harper)


Lesenswert?

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.

von Harper B. (harper)


Lesenswert?

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.

von Harper B. (harper)


Lesenswert?

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
Noch kein Account? Hier anmelden.